Установите обратный вызов в Swift для PubNub 4.0 для получения сообщений

Мне кажется, что документация, которую 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 есть еще одна функция более низкого уровня, которая регистрирует все полученные сообщения.

Любая помощь приветствуется.

4 ответа

Версии до 4.0 устарели и не будут работать именно так, как раньше.

Я бы порекомендовал полностью перейти на новейший (4.0) SDK, новый iOS SDK убрал много раздуваний и компилируется намного быстрее. Чтобы начать просмотр этого урока.

В итоге, создание экземпляра клиента 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) 
}

Решено путем добавления:

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

}

add _ client работает для меня!

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

Документация о том, как анализировать полученный 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)") 
}
Другие вопросы по тегам