在我看来,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库中还有另一个较低级别的功能,它记录了收到的所有消息。
非常感谢任何帮助。
答案 0 :(得分:4)
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)
}
答案 1 :(得分:3)
通过添加:
解决func client(client: PubNub!, didReceiveMessage message: PNMessageResult!) {
}
答案 2 :(得分:0)
有关如何解析收到的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)")
}
答案 3 :(得分:0)
添加 _客户端对我有效!
func client(_ client: PubNub, didReceiveMessage message: PNMessageResult) {
print("Pubnub Message: \(message)")
}