Установите обратный вызов в 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)")
}