【问题标题】:Pusher Websocket not connecting after migration to Swift 2迁移到 Swift 2 后 Pusher Websocket 未连接
【发布时间】:2015-09-30 15:12:41
【问题描述】:

我在大约一个月前使用 Xcode 6 制作的应用程序中使用了 Starscream 和 Pusher-swift,一切正常,Pusher 已连接并且能够接收消息。

在 Xcode 更新到 7 后,因为我忘记关闭计算机,并且在我花了一周时间整理大约 19375891237849 错误之后,现在我被困在应用程序的 Websocket 部分,根本不想连接.

不会抛出任何错误。 Pusher 认为它已连接(PusherConnection.connected 设置为 true),但它无法订阅任何频道,也不会弹出任何错误。

我正在查看红蜘蛛的代码,似乎无法弄清楚发生了什么。

有人在 Xcode 7 中看到过这种情况吗?

是否有默认阻止 websocket 的设置(例如 NSAllowsArbitraryLoads 设置允许通过 HTTP 加载对象)? (我无法想象苹果为什么会做这样的事情,也许他们开始从微软招聘开发人员之类的)。

【问题讨论】:

  • 谢谢埃里克。只提到了 Xcode 标签,因为它也可能与 Xcode 设置或模拟器有关。
  • 发现问题了,其实是在Pusher-swift里面,函数handleConnectionEstablishedEvent,试图从一个转换成String的JSON对象中提取socket_id。

标签: websocket swift2 pusher


【解决方案1】:

问题出在 PusherSwift 内部:

private func handleConnectionEstablishedEvent(json: PusherEventJSON) {
    if let data = json["data"] as? Dictionary<String, AnyObject> {
        if let socketId = data["socket_id"] as? String {
        //if let connectionData = getPusherEventJSONFromString(data), socketId = connectionData["socket_id"] as? String { // this will fail silently. 
            self.connected = true
            self.socketId = socketId

            for (_, channel) in self.channels.channels {
                if !channel.subscribed {
                    if !self.authorize(channel) {
                        print("Unable to subscribe to channel: \(channel.name)")
                    } else {
                        print("Subscribed to \(channel.name)")
                    }
                }
            }
        } else {
            print("No connection data 2")
        }
    } else {
        print("No connection data 1")
    }
}

【讨论】:

  • 嘿尼克,请你把这个写成回购的问题吗?另外,我刚刚在本地进行了测试,它似乎对我来说工作正常。您可以提供有关您订阅的频道类型等的更多详细信息吗?
  • 您好,感谢您在 Pusher-swift 上所做的所有工作!上述问题与特定通道无关,而是与 WS 服务器的连接有关。我现在无法访问我的 GH 帐户,但如果您可以将我已注释掉的行替换为右上方的那行应该没问题。
  • 嘿尼克,我不确定这有助于实现什么? socketId 是数据字段的一部分,它是一个 JSON 编码的散列,因此需要对其进行解析以检索 socketId。您可以在此处找到有关 Pusher 协议的更多信息:pusher.com/docs/pusher_protocol#connection-events
  • 如果 socket_id 没有被正确解析,它认为它没有连接,所以它不会订阅任何频道或接收任何事件。
  • 您能否创建一个不适合您的 gist / 示例应用程序,我来看看?
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多