Unity iOS平台HTTPS REST请求失败问题排查求助
我来帮你搞定这个iOS上HTTPS请求失败的问题——你遇到的-1002错误,核心原因是ATS(App Transport Security)的配置完全不对,先给你拆解问题,再一步步解决:
问题根源分析
你当前的Info.plist修改代码完全错误,因为iOS的ATS配置是嵌套的层级结构:所有ATS相关设置都必须放在NSAppTransportSecurity字典下,而你直接把NSIncludesSubdomains这些键放在root字典里,iOS根本不会识别这些配置,这就是为什么手动修改也没生效的原因。
正确的Unity PostProcessBuild配置
替换你当前的plist修改代码为下面的版本,它会正确构建ATS的例外规则(记得把your-api-domain.com替换成你的实际API域名):
using UnityEditor; using UnityEngine; using System.IO; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; [PostProcessBuild(100)] static void OnPostprocessBuild(BuildTarget buildTarget, string path) { if (buildTarget != BuildTarget.iOS) return; // 读取Info.plist var plistPath = Path.Combine(path, "Info.plist"); var plist = new PlistDocument(); plist.ReadFromFile(plistPath); var rootDict = plist.root; // 保留你原来的相册权限描述 rootDict.SetString("NSPhotoLibraryAddUsageDescription", "Used for saving high score screenshots"); // 正确配置ATS规则 var atsDict = rootDict.CreateDict("NSAppTransportSecurity"); var exceptionDomains = atsDict.CreateDict("NSExceptionDomains"); // 替换为你的实际API域名 var apiDomainDict = exceptionDomains.CreateDict("your-api-domain.com"); apiDomainDict.SetBoolean("NSIncludesSubdomains", true); apiDomainDict.SetBoolean("NSTemporaryExceptionAllowsInsecureHTTPLoads", false); // 你用HTTPS,这里设为false apiDomainDict.SetString("NSTemporaryExceptionMinimumTLSVersion", "TLSv1.2"); // iOS 9+推荐用TLS1.2及以上 // 保存修改 plist.WriteToFile(plistPath); }
额外排查步骤
除了ATS配置,还要检查这些容易忽略的点:
- URL参数转义:如果用户名或API Key包含空格、特殊字符,直接拼接URL会导致请求失败,修改你的请求代码:
IEnumerator getHighscores() { loadingObject.SetActive(true); string username = GameManager.loggedInUser; // 对参数进行URL转义 string encodedUsername = UnityWebRequest.EscapeURL(username); string encodedApiKey = UnityWebRequest.EscapeURL(Constants.apiKey); string requestUrl = $"{Constants.uriBase}/scores?username={encodedUsername}&apiKey={encodedApiKey}"; using (UnityWebRequest request = UnityWebRequest.Get(requestUrl)) { yield return request.SendWebRequest(); loadingObject.SetActive(false); // 后续错误处理逻辑不变 } } - 证书有效性:确保你的HTTPS服务器证书是正规CA颁发的,iOS 9+默认不信任自签名证书。如果是自签名证书,需要在ATS例外里把
NSTemporaryExceptionAllowsInsecureHTTPLoads设为true,或者把证书打包到iOS项目中。 - 重定向检查:用Charles抓包(iOS需要配置代理),确认你的HTTPS请求没有被重定向到HTTP链接——这也会触发-1002错误。
- Unity版本兼容性:Unity 2018.1.x的UnityWebRequest在iOS上有一些已知的HTTPS问题,你可以尝试升级到2018.1的最新补丁版本,或者临时用
WWW类测试(虽然已废弃,但能帮你排查是否是UnityWebRequest的问题)。
手动修改Xcode plist的正确方式
如果你想手动验证配置,打开Xcode项目的Info.plist,右键选择Add Row,添加以下层级结构:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>your-api-domain.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> </dict>
内容的提问来源于stack exchange,提问作者user3648673
相关产品推荐
相关产品推荐

