取消订阅和重新订阅频道后收到最新的旧 PubNub 消息

Receiving most recent old PubNub message after unsubscribing and resubscribing to channel

我刚开始在我的项目中使用 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 AView 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

我在 View Controller B 上发布了 2 条新的 PubNub 消息,一条发送到 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 发布的最新消息。

我不明白为什么他们在 View Controller B.

上取消订阅 Channel_A 后会收到此消息

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

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

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

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

刚刚弄明白了。我必须为我的配置添加以下代码行:

self.configuration.keepTimeTokenOnListChange = NO;

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

我也能够停止将 catchUpOnSubscriptionRestore 设置为 NO,但仍然必须继续将 restoreSubscription 设置为 NO