You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:53:29