gpt4 book ai didi

swift - Websockets 通过 URLSessionWebSocketTask

转载 作者:可可西里 更新时间:2023-11-01 01:06:58 34 4
gpt4 key购买 nike

我目前在我的 WatchOS 6 应用程序中使用新的 URLSessionWebSocketTask 时遇到了一些问题。服务器端要求我首先通过 HTTP header 发送身份验证数据,然后才能建立 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 header 添加到 URLRequest,然后尝试与 websocket 建立连接。当 HTTP header 包含正确的数据时,它会导致我的应用程序崩溃并出现堆栈跟踪异常“EXC_BAD_ACCESS(代码=1,地址=0x0)”。如果我故意更改 header 数据以拒绝访问,那么当我尝试连接时,我只会看到一个正常的“状态代码: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")

当然,实际的 WIFI 网络在 Apple Watch 上并没有宕机。据我所知,这似乎是一个非常普遍的问题,当从模拟器到物理设备时,某些库依赖于网络连接。

我还向 Apple 申请了他们的反馈助理服务,但我仍在等待正确的答复。我目前设法将问题缩小到与 Apple 论坛上的这篇帖子相同的结论:https://forums.developer.apple.com/message/377041#377041

会让你更新!

最佳答案

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

“ watch 上进程中网络 API 的使用受到限制,因此用户体验不会中断。

当前 URLSessionWebSocketTask 只能在当前激活音频流 session 时使用。开发人员可以在此处找到更多信息 —

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

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

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

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

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

最终更新:Apple 在过去几天发布了新的 Xcode beta 和新的 WatchOs 版本(6.1 beta 和 6.0.1 stable)。我可以报告说 websockets 现在似乎工作正常!在连接 websocket 之前也不需要启动 Audio Session 。快乐的时光!

关于swift - Websockets 通过 URLSessionWebSocketTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57416387/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com