使用JS调用FCM发消息,iOS15/16构建时AJAX返回错误求助
问题:iOS构建版本中FCM AJAX请求返回readystate:0错误
在使用JavaScript通过FCM发送消息时,AJAX请求返回{"readystate":0,"responsetext":"","status":0,"statustext":"error"}。IDE中运行完全正常,消息接收功能没问题,但构建到iOS15、16环境时出现该错误。已确认IDE与构建版本的Payload信息一致,尝试设置async:false也无明显改善。构建环境为iOS6.2.0、Xcode13、CLI11.0.0,求排查建议。
附AJAX代码:
$.ajax({ url: 'https://fcm.googleapis.com/fcm/send', type: 'POST', headers : { Authorization : 'key='+'<key>' }, contentType : 'application/json', dataType: 'json', data: JSON.stringify({"to": "<token>", "notification": {"title":"Test","body":"Test"}}), timeout: 0, complete: function () { console.log('complete') ; }, error: function(xhr, status, error) { console.log(xhr) ; console.log(status) ; console.log(error) ; }, success: function(data){ console.log(data) ; } });
排查建议
- 检查iOS ATS配置:iOS的App Transport Security可能阻止了对FCM域名的请求。确认
Info.plist中是否添加了NSAppTransportSecurity字典,并设置NSAllowsArbitraryLoads为YES,或者针对fcm.googleapis.com配置NSExceptionDomains允许HTTPS请求。 - 验证网络权限:确保iOS应用已开启网络访问权限,在
Info.plist中添加NSInternetUsageDescription权限描述,避免系统拦截网络请求。 - 替换AJAX实现方式:jQuery的AJAX在iOS构建环境中可能存在兼容性问题,尝试使用原生
fetch或XMLHttpRequest重写请求代码,排除库的兼容性问题。示例代码:fetch('https://fcm.googleapis.com/fcm/send', { method: 'POST', headers: { 'Authorization': 'key=<key>', 'Content-Type': 'application/json' }, body: JSON.stringify({"to": "<token>", "notification": {"title":"Test","body":"Test"}}) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); - 排查网络环境限制:构建后的iOS应用可能受到设备网络环境(如企业代理、VPN)的限制,测试时切换到无代理的网络环境,确认是否是网络拦截导致请求失败。
- 查看iOS设备日志:通过Xcode的Organizer查看应用的网络请求日志或系统日志,获取更详细的错误信息,比如SSL证书验证失败、连接超时等具体问题。
- 确认密钥与令牌有效性:再次核对请求中的FCM服务器密钥和设备令牌,排除构建过程中环境变量替换错误导致的参数失效问题。
内容的提问来源于stack exchange,提问作者長谷川洋平
相关产品推荐
相关产品推荐

