取消订阅并重新订阅频道

时间:2015-07-26 07:42:46

标签: ios objective-c pubnub

我刚开始在项目中使用PubNub iOS SDK v4.0

使用PubNub的整个目标是,用户将根据他们当前所在的UIViewController订阅某个频道。

因此,在任何给定时间,用户都不应该订阅或接收来自多个频道的消息。

不幸的是,我无法让它正常工作。这是我不断发生的示例场景:

我在App Delegate中存储和设置客户端和配置属性,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

// Pubnub
self.configuration = [PNConfiguration configurationWithPublishKey:pubNubPublishKey
                                                               subscribeKey:pubNubSubscribeKey];

self.client = [PubNub clientWithConfiguration:self.configuration];

return YES;
}

用户登陆View Controller A,我订阅了Channel_A

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // App Delegate
    self.appDelegate = [[UIApplication sharedApplication] delegate];

    // PubNub
    [self.appDelegate.client addListener:self];
    [self.appDelegate.client subscribeToChannels:@[@"Channel_A"] withPresence:NO];
}

用户离开View Controller A转到View Controller B,因此我从Channel A取消订阅:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    // Remove listener + unsubscribe
    [self.appDelegate.client removeListener:self];
    [self.appDelegate.client unsubscribeFromChannels:@[@"Channel_A"] withPresence:NO];
}

然后我使用与上面相同的代码结构,一旦用户转到Channel_B,就会将用户订阅View Controller B

我在PubNub上发布了2条新的View Controller B条消息,一条发送到Channel B,另一条发送到Channel_A。当前用户只会收到Channel_B的邮件,但当前位于View Controller A的应用上的任何其他用户都会收到Channel_A消息。

这几乎完美无缺。 View Controller B上的当前用户只会收到Channel_B消息,但这是我遇到问题的地方。

当用户离开View Controller B并返回View Controller A时,他们会立即收到View Controller B Channel_A刚刚发布的最新消息{/ 1}}。

我不明白为什么他们在Channel_A时从View Controller B取消订阅时会收到此消息。

我甚至测试了它并等了一分钟才回到View Controller A,我仍然总是收到一分钟前发布的最新Channel_A消息。

我不希望这种情况发生。他们应该只接收该频道的实时消息,而不是10秒前,30秒前发生的消息等,当他们从该频道取消订阅时。

我做了一些快速的研究,并认为在App Delegate中设置以下属性可能有所帮助,但我仍然遇到这个问题:

self.configuration.restoreSubscription = NO;
self.configuration.catchUpOnSubscriptionRestore = NO;

1 个答案:

答案 0 :(得分:2)

刚想通了。我必须为我的配置添加以下代码行:

self.configuration.keepTimeTokenOnListChange = NO;

默认设置为YES,并在订阅频道时检索最新消息。

我也可以停止将catchUpOnSubscriptionRestore设置为NO,但仍需将restoreSubscription设置为NO