【问题标题】:Websockets through URLSessionWebSocketTask通过 URLSessionWebSocketTask 的 Websockets
【发布时间】: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

会及时更新!

【问题讨论】:

标签: swift websocket watchos urlsession


【解决方案1】:

好的,至少我现在对我的问题有了答案。在通过他们的反馈服务与 Apple 来回折腾之后,这是他们对我的问题的回答:

“手表上正在处理的网络 API 的使用受到限制,以免影响用户体验。

当前 URLSessionWebSocketTask 只能在当前激活音频流会话时使用。开发者可以在这里找到更多信息——

https://developer.apple.com/videos/play/wwdc2019/716/

在演讲者谈论使用音频会话的视频中拖到大约 5 分钟。

我们也知道用户面临的崩溃,即使音频会话处于活动状态,用户也会继续看到此崩溃。我们正在根据不同的错误报告对其进行跟踪。”

总而言之,您需要启动一个音频会话才能在 WatchOS 中使用 websocket。在连接 websocket 之前启动音频会话仍然不能解决当前的问题,但似乎他们至少意识到了这个问题。

希望这对任何尝试在 WatchOS 中使用 websocket 的人有用,并希望 Apple 在发布 WatchOS 6 之前解决这个问题。

最终更新:Apple 在过去几天发布了新的 Xcode 测试版和新的 WatchOs 版本(6.1 测试版和 6.0.1 稳定版)。我可以报告 websockets 现在似乎工作正常!在连接 websocket 之前也无需启动音频会话。快乐的时光!

【讨论】:

    【解决方案2】:

    你可以尝试使用 Starscream 库吗?那它行得通吗?如果是,那么它闻起来像 watchOS 问题,请提交反馈(以前雷达),以便 Apple 可以在正式发布 watchOS 之前修复它。

    【讨论】:

    • 试过红蜘蛛,似乎在模拟器上工作,但不是在物理设备上:(有关更多信息,请参阅 EDIT3。
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 2012-10-06
    • 2017-06-10
    • 2015-12-08
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多