【问题标题】:Message receive observers doesn't work after unsubscribing from channels取消订阅频道后,消息接收观察者不起作用
【发布时间】:2014-07-22 19:04:05
【问题描述】:

我正在检查 AppDelegate.mRootViewController.mViewControllerB.m 中的传入消息。

用户打开应用程序(首次启动 - 安装)、注册然后登录后,一切正常。 5 秒或 50 分钟后(没关系)当前用户退出并出现一个新用户,该用户创建一个新帐户或使用现有配置文件登录。现在,当前用户(成功)向他自己的频道发送了一条消息,但是这次消息观察者不起作用,观察者没有日志。但是,如果我从 Xcode 关闭应用程序并再次启动它,它会再次正常工作。

我确定这不是网络问题,因为历史记录包含我发送的每条消息,并且客户端每次都连接。但不幸的是,消息接收到的观察者就像他们不存在一样。

我怀疑当用户注销并取消订阅他正在收听的频道时会出现问题。我已经尝试过使用和不使用removeMessageReceiveObserver:,但没有帮助我。

这是我在用户注销时取消订阅的方式:

 if (cell == staticCell ) {
   ...
    NSArray *unsubscribe = @[channel1, channel2];
    //unsubscribe user from channels
    [PubNub unsubscribeFromChannels:unsubscribe];
    // remove observer and disconnect from PubNub.
    [[PNObservationCenter defaultCenter] removeMessageReceiveObserver:self];
    [PubNub disconnect]; // also tried without closing the connection

    //log out user
    [PFUser logOut];
    [self presentLoginViewControllerAnimated:YES];

这是我的观察者:

// I'm using this in RootViewController.m and ViewControllerB.m
[[PNObservationCenter defaultCenter] addMessageReceiveObserver:self withBlock:^(PNMessage *message) {

        if ([message.channel.name isEqualToString:my_channel] ) { 
             NSLog(@" message: %@ ", message.message);
}


// AppDelegate.m

- (void)pubnubClient:(PubNub *)client didReceiveMessage:(PNMessage *)message {

if ([message.channel.name isEqualToString:my_channel] ) {

  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New message"
                                                        message: messageContent delegate:self
                                              cancelButtonTitle:@"Ok!"
                                              otherButtonTitles:nil, nil];
    [alertView show];

}

我错过了什么吗?在取消订阅之前,我还应该实施其他方法吗?

【问题讨论】:

    标签: ios objective-c pubnub


    【解决方案1】:

    您应该订阅要从中接收消息的频道。如果客户端没有看到消息,观察者不会通知消息,因为您已取消订阅它们。 PubNub 客户端会通知您订阅的频道上的新消息,如果没有频道,则不会有任何事件。

    【讨论】:

    • 我在前一个用户退出后订阅了新频道。但有趣的是,在你回答之后我测试了另一个场景。用户 A 注销,用户 B 登录 - 不起作用 - 然后用户 B 注销并在他注销后立即再次登录,它再次工作。观察者之间是否有最短时间可以改变他们的“目标”频道?
    • 当您在用户之间切换时,我认为带有聊天功能的视图控制器已被释放,因此您应该使用 [[PNObservationCenter defaultCenter] removeMessageReceiveObserver:self] 将其作为观察者删除。每次打开视图控制器并希望它接收新消息的通知时,都需要为此类事件添加观察者。
    • 我已将它放入我的视图控制器viewWillDisappear 方法中,但还是一样。但是我无法对来自AppDelegatepubnubClient: didReceiveMessage: 做任何事情,也许这就是问题所在。我也尝试使用resetCenter 方法,但无法调用[PNObservationCenter resetCenter],因为它受到保护。有可能吗?一次调用销毁所有观察者将是一个了不起的解决方案。
    • @vv88 我建议您通过 support@pubnub.com 与 PubNub 联系,在那里您将能够共享代码,我们将帮助您找出错误或滥用的地方。
    猜你喜欢
    • 2018-07-15
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多