【问题标题】:Establish callback in Swift for PubNub 4.0 to receive messages在 Swift 中为 PubNub 4.0 建立回调以接收消息
【发布时间】:2015-07-06 20:18:54
【问题描述】:

在我看来,PubNub 的 Swift 入门文档不适用于 PubNub 4.0 之前的版本。我无法成功建立回调以注册 PubNub。

我的代码:

class Communicator: NSObject, PNObjectEventListener {

    var pubNubClient: PubNub

    override init(){
        let config = PNConfiguration(
            publishKey: "my_publish_key",
            subscribeKey: "my_subscribe_key"
        )
        pubNubClient = PubNub.clientWithConfiguration(config);
        super.init()
        pubNubClient.addListener(self)
        pubNubClient.subscribeToChannels(["my_channel"], withPresence: false)
    }

    func didReceiveMessage(client: PubNub!, message: PNMessageResult!){
        /* THIS METHOD NEVER GETS REACHED */
    }
}

稍微研究一下 PubNub 的源代码,这似乎是有问题的区域:

- (void)addListener:(id <PNObjectEventListener>)listener {

    dispatch_async(self.resourceAccessQueue, ^{

        if ([listener respondsToSelector:@selector(client:didReceiveMessage:)]) {
            /* this block is never reached!!! */
            [self.messageListeners addObject:listener];
        }

    /* Remaining Lines Stripped Away */
    });
}

我对 Swift 和与 Objective C 的集成还比较陌生。我很好奇 respondsToSelector 是否存在问题,因为 Objective C 代码正在引用 Swift 代码。

消息肯定会通过; PubNub 库中还有另一个较低级别的函数,用于记录收到的所有消息。

任何帮助将不胜感激。

【问题讨论】:

    标签: objective-c swift pubnub respondstoselector


    【解决方案1】:

    4.0 之前的版本已被弃用,并且无法完全按照以前的方式工作。

    我建议完全迁移到最新的 (4.0) SDK,新的 iOS SDK 消除了很多臃肿并且编译速度更快。要开始查看this tutorial

    总而言之,实例化 PubNub 客户端如下所示:

    let config = PNConfiguration( 
        publishKey: "Your_Pub_Key", 
        subscribeKey: "Your_Sub_Key")   
    client = PubNub.clientWithConfiguration(config) 
    client?.addListener(self) 
    client?.subscribeToChannels(["Your_Channel"], withPresence: false)       
    

    新的 didReceiveMessage 函数如下所示:

    func client(client: PubNub!, didReceiveMessage message: PNMessageResult!, withStatus status: PNErrorStatus!) { 
         //Do Something like
         //println(message) 
    }
    

    【讨论】:

      【解决方案2】:

      通过添加解决:

      func client(client: PubNub!, didReceiveMessage message: PNMessageResult!) {
      
      }
      

      【讨论】:

      • 嗨,斯科特,这是个好消息,如果有什么我们可以通过 support@pubnub.com 提供的详细信息,请告诉我们
      • 目前,我只能通过 , message.data => { message = "{}";订阅频道 = 123;时间令牌 = 14392105288780634; }
      • 如何访问其中的“消息”?
      • 它返回一个 PNMessageData 格式的数据,我的数据被塞进去了。关于如何访问它的任何指针?
      • 我做到了:让encodedMessage = message.data.valueForKey("message") as! NSDictionary
      【解决方案3】:

      关于如何解析收到的 PNMessageResult 的文档很少。以下是我的处理方式:

      func client(client: PubNub!, didReceiveMessage message: PNMessageResult!) {
      
        let encodedMessage = message.data.valueForKey("message") as! NSDictionary
        let messageType    = encodedMessage["meta"]! as! String
        let messageString  = encodedMessage["data"]!["msg"]! as! String
      
        print("PubNub: [\(messageType)] \(messageString)") 
      }
      

      【讨论】:

        【解决方案4】:

        添加_客户对我有用!

        func client(_ client: PubNub, didReceiveMessage message: PNMessageResult) {
            print("Pubnub Message: \(message)")
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多