WKWebView借助PerfectHTTPServer加载静态文件失败问题
看起来你遇到的情况有点棘手:明明路径没问题(Swifter服务器能正常跑),但PerfectHTTPServer启动后就是没法让WKWebView正常加载文件。我来给你梳理几个排查和解决的方向:
1. 先确认文档根目录的有效性与格式
首先,先把你传入的serverPath打印出来,确保它是标准的本地文件系统路径(不是file://开头的URL格式):
print("Perfect server root path: \(serverPath)")
另外,Perfect默认会找根目录下的index.html作为默认首页,如果你的入口文件不是这个名字,或者根目录里没有默认文件,访问时会直接返回404,WKWebView自然加载失败。可以手动在浏览器里访问http://localhost:9009/your-target-file.html试试能不能打开。
2. 修改服务器绑定地址,规避IPv4/IPv6监听限制
你当前绑定的是localhost,这可能导致服务器只监听IPv4或IPv6中的一种,而WKWebView可能尝试用另一种协议连接。试试把绑定地址改成0.0.0.0(监听所有IPv4地址)或者直接省略name参数,让Perfect自动监听所有可用地址:
// 方式1:绑定所有IPv4地址 try HTTPServer.launch(name: "0.0.0.0", port: 9009, documentRoot: serverPath) // 方式2:让Perfect自动适配所有地址 try HTTPServer.launch(port: 9009, documentRoot: serverPath)
3. 标准化路径,避免格式问题
有时候路径末尾的斜杠或者特殊字符会导致Perfect识别异常,你可以用FileManager的路径API来标准化路径:
let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] // 用URL的path属性获取标准路径字符串 let serverPath = documentsDir.path // 去掉多余的首尾斜杠和空白字符 let normalizedPath = serverPath.trimmingCharacters(in: .whitespacesAndNewlines).trimmingCharacters(in: CharacterSet(charactersIn: "/")) try HTTPServer.launch(port: 9009, documentRoot: normalizedPath)
4. 获取完整错误日志,定位核心问题
你提供的日志被截断了([B...),这是关键线索缺失。可以开启Perfect的详细日志输出,看看有没有具体的错误提示:
// 启动服务器前开启详细日志 Log.level = .verbose Log.info("Starting server with root path: \(serverPath)") try HTTPServer.launch(port: 9009, documentRoot: serverPath)
这样控制台会输出更多细节,比如文件访问失败的原因、请求路径是否匹配等。
5. 验证服务器本身的可用性,排除WKWebView的ATS限制
除了用WKWebView,你可以用Mac浏览器访问http://localhost:9009(模拟器环境),或者用设备IP访问http://192.168.x.x:9009(真机环境):
- 如果浏览器也无法加载,问题肯定在Perfect的配置上;
- 如果浏览器能加载,那大概率是WKWebView的ATS限制:iOS默认禁止非HTTPS请求,需要在
Info.plist中添加NSAppTransportSecurity例外,比如开启NSAllowsArbitraryLoads,或者针对localhost单独设置允许HTTP请求。
内容的提问来源于stack exchange,提问作者Shail

