swiftui使用WKWebView加载自签的https服务,允许不安全访问

大家好,我的开源项目PakePlus可以将网页/Vue/React项目打包为桌面/手机应用并且小于5M只需几分钟,官网地址:pakeplus.com

这个错误是 SSL 证书验证失败 导致的(code=-1202 对应 NSURLErrorServerCertificateUntrusted),因为你的服务端 https://192.168.31.197:5173/ 使用的是自签名证书或未被 iOS 信任的证书。以下是完整的解决方案,包含证书信任配置和 WKWebView 正确实现:

Info.plist 中添加以下配置:

Swift 复制代码
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

或者更精确的配置:

Swift 复制代码
<!-- 允许非HTTPS请求(可选,若服务端后续可能切换HTTP) -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <!-- 单独允许目标IP的HTTPS请求(更安全的写法) -->
    <key>NSExceptionDomains</key>
    <dict>
        <key>192.168.31.197</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
        </dict>
    </dict>
</dict>

<!-- iOS 14+ 要求:允许加载本地网络资源 -->
<key>NSLocalNetworkUsageDescription</key>
<string>需要访问本地网络以加载服务端内容</string>

实现 WKWebView 并忽略 SSL 证书验证

WKWebView 默认严格验证 SSL 证书,需要通过 WKNavigationDelegate 手动忽略验证(仅用于开发环境,生产环境需使用正规证书):

Swift 复制代码
class Coordinator: NSObject, WKNavigationDelegate {
    let parent: WebView
    
    init(_ parent: WebView) {
        self.parent = parent
    }
    
    // 关键:强制信任所有SSL证书(仅开发环境!)
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        // 1. 检查是否是服务器信任验证
        guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust else {
            completionHandler(.performDefaultHandling, nil)
            return
        }
        
        // 2. 获取服务器信任对象
        guard let serverTrust = challenge.protectionSpace.serverTrust else {
            completionHandler(.cancelAuthenticationChallenge, nil)
            return
        }
        
        // 3. 强制信任证书(关键:忽略证书有效性检查)
        let credential = URLCredential(trust: serverTrust)
        completionHandler(.useCredential, credential)
        
        // 调试:打印证书信息,确认是否是目标服务器
        print("强制信任证书:\(challenge.protectionSpace.host):\(challenge.protectionSpace.port ?? 0)")
    }
    
    // 加载失败时打印详细错误(方便排查)
    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        let nsError = error as NSError
        print("加载失败:")
        print("错误码:\(nsError.code)")
        print("错误描述:\(nsError.localizedDescription)")
        print("错误域名:\(nsError.domain)")
        if let failureReason = nsError.localizedFailureReason {
            print("失败原因:\(failureReason)")
        }
    }
}

大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

相关推荐
华玥作者17 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_18 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠18 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
lang2015092818 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC19 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务19 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整20 小时前
面试点(网络层面)
前端·网络
VT.馒头20 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy21 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron07071 天前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js