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

iOS应用连接本地网络中带不受信任证书的Android TV的TLS问题

iOS 连接本地网络中带不受信任证书设备的TLS解决方案

针对你遇到的Android TV遥控器应用SocketIO TLS连接问题,以下是可行的解决步骤:

1. 修正SocketManager配置与URLSessionDelegate实现

你的原代码未处理证书主机名不匹配的问题,且缺少SocketIO的SSL禁用配置,修改后的代码如下:

let manager = SocketManager(
    socketURL: URL(string: "https://\(host):\(port)")!,
    config: [
        .sessionDelegate(self),
        .security([.disableSSLCertValidation(true)]) // 显式禁用证书验证
    ]
)

self.socketManager = manager
let socket = manager.defaultSocket

socket.onAny { event in
    print(event.event.uppercased())
}

socket.connect()


extension PairingManager: URLSessionDelegate {
    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        // 仅处理服务器信任类型的挑战
        guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
              let serverTrust = challenge.protectionSpace.serverTrust else {
            completionHandler(.performDefaultHandling, nil)
            return
        }
        
        // 跳过主机名验证(自签名证书通常与IP不匹配)
        let policies = NSMutableArray()
        policies.add(SecPolicyCreateSSL(true, nil)) // 传入nil关闭主机名校验
        SecTrustSetPolicies(serverTrust, policies)
        
        // 评估并接受信任
        var trustResult: SecTrustResultType = .invalid
        SecTrustEvaluate(serverTrust, &trustResult)
        
        if trustResult == .unspecified || trustResult == .proceed {
            let credential = URLCredential(trust: serverTrust)
            completionHandler(.useCredential, credential)
        } else {
            completionHandler(.performDefaultHandling, nil)
        }
    }
}

2. 配置ATS(App Transport Security)例外

iOS默认ATS会阻止不受信任的证书连接,需在Info.plist中添加对应电视IP的例外规则:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>192.168.0.101</key> <!-- 替换为你的Android TV实际IP -->
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

错误原因说明

  • 原代码错误1/2:未处理证书主机名不匹配问题,仅接受信任但iOS仍会因域名校验失败拒绝连接;同时缺少SocketIO的SSL禁用配置。
  • 错误3:Android TV的SocketIO服务仅监听HTTPS端口,HTTP连接会被直接断开。

注意:此方案仅适用于本地网络设备,生产环境中请勿对公共域名使用,避免安全风险。

内容的提问来源于stack exchange,提问作者Nick Malevich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:54:59