【发布时间】:2019-08-08 15:46:43
【问题描述】:
我目前在我的 WatchOS 6 应用程序中使用新的 URLSessionWebSocketTask 时遇到了一些问题。服务器端要求我先通过 HTTP-headers 发送身份验证数据,然后才能建立 websocket。由于 URLSessionWebSocketTask 包含一个以 URLRequest 作为参数的函数,因此我的方法如下:
func establishSocket(){
var urlRequest = URLRequest(url: URL(string: "https://censored.url”)!)
urlRequest.addValue("applicationtype”, forHTTPHeaderField: “ApplicationType”)
urlRequest.addValue(“authkey”, forHTTPHeaderField: “Authorization”)
urlRequest.addValue(“productid”, forHTTPHeaderField: “ProductId”)
let urlSession = URLSession(configuration: .ephemeral)
let task = urlSession.webSocketTask(with: urlRequest)
task.resume()
}
我将所有必要的 HTTP 标头添加到 URLRequest,然后尝试与 websocket 建立连接。当 HTTP 标头包含正确的数据时,它会导致我的应用程序因堆栈跟踪异常“EXC_BAD_ACCESS (code=1, address=0x0)”而崩溃。如果我故意更改标头数据以被拒绝访问,那么当我尝试连接时,我只会看到一个正常的“状态代码:403”。
我是否在我的代码中遗漏了一些重要的东西?我认为问题与 HTTP 升级过程有关,但我不能完全解决这个问题。它与 URLSession 的配置有什么关系吗?我很感谢我能得到的任何帮助!
编辑:做了一些进一步的挖掘,服务器报告了请求的状态 101,这意味着我没有在我的代码中正确处理套接字升级......嗯
EDIT2:完全相同的代码在 iOS 13 中运行良好,这个问题似乎与 WatchOS 相关。会继续调查,看看我能不能解决它。
EDIT3:现在尝试了 Starscream,只要我在模拟器上运行应用程序,它就可以工作,但它在实际的 Apple Watch 上不起作用:(这是我在 Apple Watch 上运行应用程序时的输出:
2019-08-14 18:28:12.616649+0200 ______________ WatchKit Extension[279:27012] [] nw_connection_get_connected_socket [C87] Client called nw_connection_get_connected_socket on unconnected nw_connection
2019-08-14 18:28:12.616784+0200 _______________ WatchKit Extension[279:27012] TCP Conn 0x14eadd00 Failed : error 0:50 [50]
websocket is disconnected: Optional("The operation couldn’t be completed. Network is down")
当然,Apple Watch 上的实际 WIFI 网络并没有关闭。从我收集到的信息来看,当从模拟器转到物理设备时,某些库依赖于网络连接,这似乎是一个非常常见的问题。
我还向 Apple 提出了他们的反馈助手服务的请求,但我仍在等待正确的答复。我目前已设法将问题缩小到与 Apple 论坛上的这篇文章相同的结论:https://forums.developer.apple.com/message/377041#377041
会及时更新!
【问题讨论】:
-
您可以查看本教程ohmyswift.com/blog/2019/08/31/…,了解如何使用swift 5 在iOS13 中实现本机websockets @heinz_dieter
标签: swift websocket watchos urlsession