如何检查在 iPhone Safari 上运行的 Ajax 请求的状态?
Posted
技术标签:
【中文标题】如何检查在 iPhone Safari 上运行的 Ajax 请求的状态?【英文标题】:How do I check status of my Ajax request running on my iPhone Safari? 【发布时间】:2019-09-09 04:07:36 【问题描述】:我在我的网站上加载了这段代码
<!DOCTYPE html>
<html lang="en">
<head>
<title>fingerprinting</title>
<meta name="csrf-token" content=" csrf_token() ">
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>page loaded.</h1>
<h1 id="model"></h1>
<script type="text/javascript">
// console.log(window);
function getIPhoneModel()
// Create a canvas element which can be used to retrieve information about the GPU.
var canvas = document.createElement("canvas");
if (canvas)
var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
if (context)
var info = context.getExtension("WEBGL_debug_renderer_info");
if (info)
var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
// iPhone X
if ((window.screen.height / window.screen.width == 812 / 375) && (window.devicePixelRatio == 3))
return "iPhone X";
else if ((window.screen.height / window.screen.width == 896 / 414) && (window.devicePixelRatio == 3))
return "iPhone XS Max";
else if ((window.screen.height / window.screen.width == 896 / 414) && (window.devicePixelRatio == 2))
return "iPhone XR";
else if ((window.screen.height / window.screen.width == 1024 / 768) && (window.devicePixelRatio == 2))
return "iPad 4";
else if ((window.screen.height / window.screen.width == 736 / 414) && (window.devicePixelRatio == 3))
switch (renderer)
default:
return "iPhone 6 Plus, 6s Plus, 7 Plus or 8 Plus";
case "Apple A8 GPU":
return "iPhone 6 Plus";
case "Apple A9 GPU":
return "iPhone 6s Plus";
case "Apple A10 GPU":
return "iPhone 7 Plus";
case "Apple A11 GPU":
return "iPhone 8 Plus";
// iPhone 6+/6s+/7+ and 8+ in zoom mode
else if ((window.screen.height / window.screen.width == 667 / 375) && (window.devicePixelRatio == 3))
switch(renderer)
default:
return "iPhone 6 Plus, 6s Plus, 7 Plus or 8 Plus (display zoom)";
case "Apple A8 GPU":
return "iPhone 6 Plus (display zoom)";
case "Apple A9 GPU":
return "iPhone 6s Plus (display zoom)";
case "Apple A10 GPU":
return "iPhone 7 Plus (display zoom)";
case "Apple A11 GPU":
return "iPhone 8 Plus (display zoom)";
// iPhone 6/6s/7 and 8
else if ((window.screen.height / window.screen.width == 667 / 375) && (window.devicePixelRatio == 2))
switch(renderer)
default:
return "iPhone 6, 6s, 7 or 8";
case "Apple A8 GPU":
return "iPhone 6";
case "Apple A9 GPU":
return "iPhone 6s";
case "Apple A10 GPU":
return "iPhone 7";
case "Apple A11 GPU":
return "iPhone 8";
// iPhone 5/5C/5s/SE or 6/6s/7 and 8 in zoom mode
else if ((window.screen.height / window.screen.width == 1.775) && (window.devicePixelRatio == 2))
switch(renderer)
default:
return "iPhone 5, 5C, 5S, SE or 6, 6s, 7 and 8 (display zoom)";
case "PowerVR SGX 543":
return "iPhone 5 or 5c";
case "Apple A7 GPU":
return "iPhone 5s";
case "Apple A8 GPU":
return "iPhone 6 (display zoom)";
case "Apple A9 GPU":
return "iPhone SE or 6s (display zoom)";
case "Apple A10 GPU":
return "iPhone 7 (display zoom)";
case "Apple A11 GPU":
return "iPhone 8 (display zoom)";
// iPhone 4/4s
else if ((window.screen.height / window.screen.width == 1.5) && (window.devicePixelRatio == 2))
switch(renderer)
default:
return "iPhone 4 or 4s";
case "PowerVR SGX 535":
return "iPhone 4";
case "PowerVR SGX 543":
return "iPhone 4s";
// iPhone 1/3G/3GS
else if ((window.screen.height / window.screen.width == 1.5) && (window.devicePixelRatio == 1))
switch(renderer)
default:
return "iPhone 1, 3G or 3GS";
case "ALP0298C05":
return "iPhone 3GS";
case "S5L8900":
return "iPhone 1, 3G";
else
return "Not an iPhone";
var model = getIPhoneModel()
console.log(model);
$('#model').text(model);
var currentUrl = window.location.href;
var newUrl = currentUrl.replace("fingerprinting", "fingerprinting/tasks");
// alert(newUrl);
$.ajax(
method: 'POST',
url: " $APP_URL fingerprinting/store",
data: 'original_uri':'!! $original_uri !!', 'model' : model,,
headers:
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
,
success: function(response)
console.log(response);
window.location.href = newUrl;
,
error: function(jqXHR, textStatus, errorThrown)
console.log(JSON.stringify(jqXHR));
console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
);
</script>
<h1>JS finished loaded.</h1>
</body>
</html>
我在页面底部有 Ajax。 我确定为什么它没有在 iPhone Safari 上触发。 或者它正在执行,但有一些错误。
注意:
在 Mac OS X 上的 Chrome 或 Safari 上使用相同的代码。✅ Ajax 确实触发了,并且工作正常。 ✅Ajax 似乎没有在 iPhone Safari 上触发
我是否使用了 iPhone 上的 Safari 无法识别的任何旧语法?
如何进一步调试?
【问题讨论】:
您是否尝试在ajax
呼叫的error
部分而不是console.log
中提醒消息?
可以使用 Safari WebInspector。也可以查看:github.com/liriliri/eruda
@pouyan 我按照您的建议添加了警报。我看到了这个; i.imgur.com/mruOiYw.jpg
***.com/questions/2000609/jquery-ajax-status-code-0
如下所述,您可以运行 iphone 模拟器工具、webinspector 并打开 xcode 以显示模拟器日志。模拟器日志可能包括网络请求错误和附加信息***.com/a/24892230/7295772
【参考方案1】:
您可以使用 Safari WebInspector
您需要Mac
和Xcode
installed。
您需要在本地 IP 上运行您的服务器。
打开您的终端并运行ifconfig
,找到您的IP,然后复制enp1s0
以获取ethernet
或wlp2s0
以获取wifi。
~ $ ifconfig
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.38 netmask 255.255.255.0 broadcast 192.168.1.255
wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
在此 IP 上使用您的网站运行您的服务器。
我使用rails运行rails server -b 192.168.1.38 -p 3000
,-b
代表ip binding
,-p
代表端口。
打开 Xcode 和 start a new emulator 或通过 USB 连接您的设备。
关注this instructions在你的iphone模拟器上打开http://192.168.1.38:3000
。
如果您难以配置您的 iphone 以进行调试,请记住 this important steps from the instructions:
Webinspector
选项需要仅在您使用 USB DEVICE 时启用。您无需在模拟器设备上标记此选项。我don't have it on the simulator 并且能够运行 webinspector。
运行模拟器并使用移动 safari 浏览器打开页面后,您需要打开 DESKTOP safari 浏览器并在菜单栏中通过选中 Show develop menu in menu bar
启用 Develop
。
如果您在菜单栏中看不到“开发”,请转到菜单栏并单击“Safari > 首选项 > 高级”,然后选中“在菜单栏中显示开发菜单”复选框。
-
从菜单栏中选择 safari
Develop -> Simulator or Iphone -> Your Page
在开发者工具栏中打开Timelines/Network Request
或Network
(如指南中所示)以检查您的网络请求
检查您的服务器日志以查看后端是否正在接收AJAX
请求或检查您的phone simulator
日志,因为您可能会看到一些与证书或其他原因有关的错误。您必须在线研究这些错误的解决方案。
当我使用xcode
构建项目时,我还可以从 xcode 中的手机查看控制台日志
【讨论】:
感谢您的详细回答 @kyo 我仍然可以获取更多信息。谢谢 你运行的是什么 XCode 版本?我在 XCode 10 上,根本看不到您建议的窗口。 @kyo 我在 Mac Os High Sierra10.13.6
和 Xcode 10
上测试了自己。我添加了更多信息以帮助您解决问题。我也很难理解具有误导性的指南。谢谢【参考方案2】:
根据您的问题,我了解到您希望能够在移动设备而不是台式机上进行调试?如果您使用的是 iPhone 7 或更高版本,WebInspector
可以在iPhone settings
中打开。
转到Settings> Safari> Advanced
(位于屏幕底部),那里有一个开关,您可以在其中打开 WebInspector。这样您就可以在 iPhone 上阅读您的控制台。
“WebInspector”是 iPhone 7 的新功能;较旧的 iPhone(6 或以下)使用'DebugConsole'
,可以通过“设置”菜单以相同的方式访问。 WebInspector 的优点是当 iPhone 连接到 Mac 时,您可以在桌面 safari 中显示 webinspector。 (从 Safari 菜单中选择“开发”>“显示 WebInspector”。
默认情况下调试控制台和网络检查器都处于禁用状态,因此您需要启用它们
希望对你有帮助
【讨论】:
谢谢你,我会按照你的步骤,今天晚些时候。以上是关于如何检查在 iPhone Safari 上运行的 Ajax 请求的状态?的主要内容,如果未能解决你的问题,请参考以下文章
如何用MAC上的Safari检查iPhone手机App运行的Html页面