Apple Watch真机JSON解析失败,模拟器正常且设备联网正常
Apple Watch真机无法解析URL JSON数据问题
问题现象
- 从URL解析JSON数据的功能在Apple Watch模拟器中正常运行,但真机上无法工作
- 设备已连接WiFi,网络状态正常,其他联网应用可正常使用
- 控制台报错:
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
问题原因
- 代码中使用
Data(contentsOf:)执行同步网络请求,该操作会阻塞主线程。Apple Watch真机系统对主线程的限制比模拟器严格,直接在主线程执行同步网络请求会被系统拦截。 - 虽目标URL为HTTPS协议,但Watch App的ATS(App Transport Security)配置可能存在隐性问题(模拟器正常的话,该可能性较低)。
解决方法
改用URLSession执行异步网络请求,避免主线程阻塞操作,同时确保ATS配置正确(HTTPS默认无需额外配置)。
修改后的代码示例
struct ContentView: View { var body: some View { VStack { Text("Hello world") } .onAppear { guard let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1") else { return } // 使用URLSession发起异步请求 let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("请求错误:\(error.localizedDescription)") return } guard let data = data else { print("未获取到有效数据") return } do { let json = try JSONSerialization.jsonObject(with: data) print("解析结果:\(json)") // 更新UI需切换回主线程 DispatchQueue.main.async { // 此处添加UI更新逻辑 } } catch let error { print("JSON解析错误:\(error.localizedDescription)") } } task.resume() } .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
额外注意事项
- 若仍出现ATS相关错误,可在Watch App的
Info.plist中添加NSAppTransportSecurity字典,并设置NSAllowsArbitraryLoads为YES(仅用于测试,正式发布建议针对特定域名配置)。 - 所有UI更新操作必须在主线程执行,解析完成后需通过
DispatchQueue.main.async切换线程处理UI逻辑。
内容的提问来源于stack exchange,提问作者Code cracker
相关产品推荐
相关产品推荐

