如何在后台PUBNUB + IOS中管理在线/离线/离开状态?

时间:2015-05-29 05:27:04

标签: ios chat pubnub user-presence

我们希望在iOS中使用Pubnub框架实现在线/离线,但应用程序在后台工作超过10分钟。我们已尝试通过启用位置功能及其正常工作来实现此功能。但客户端不希望为此目的启用位置服务。那么我们如何设法让后台无限运行? (QUE 1)

如果我们想在我们的代码中放置在线/离线/离开状态

我们应该展示的地方, 在线:当用户打开应用时 离线:当用户从后台关闭应用或删除应用时 离开:当用户点击主页按钮并且应用程序处于后台时。

我们将如何实施此功能(特别是外出和离线状态)?(QUE 2)

还有其他方法可以管理在线/离线/离开吗? (没有Pubnub)(QUE 3) 如果是,请描述方式。

我们如何使用网络服务管理在线/离线/离开?当我们称之为Web服务时? (QUE 4)

我们使用的是近3-4岁的基本代码。那么我们是否应该在plist中添加任何其他参数以在后台启用应用程序更长时间? (QUE 5)

请指导我们。

2 个答案:

答案 0 :(得分:2)

使用PubNub Presence,您可以在应用中提供此功能的最佳方式,但由于iOS处理应用进入后台的方式,您可能有也可能没有机会更新此状态(取决于应用的方式)配置为运行)。

但非常简单,by enabling Presence for your PubNub keys,当客户端subscribes to a channeljoin事件被发送给正在该频道上收听状态的所有其他订阅者时。

当应用程序进入后台时,如果您有机会这样做,您可以call unsubscribe on all the channels订阅客户端,并将leave事件发送给该/那些频道的所有订阅者听取在场活动。

如果该应用被杀,或者在没有机会拨打unsubscribe的情况下进入后台,当应用离线/断开连接的时间超过配置心跳周期,然后将timeout(相当于leave事件)发送给收听在线状态事件的所有订阅者。

heartbeat defaults to 5 minutes but you can configure this to a lower setting like 60 seconds(或更短的用例需要此但不低于15秒)。

如果您希望服务器收听Presence事件,那么您将需要使用我们的Presence Webhooks(即将推出的文档)。请参阅this StackOverflow thread about how to implement PubNub Presence Webhooks and how to get your PubNub keys configured to use them

答案 1 :(得分:0)

有两种情况:

  • 用户将App置于后台模式
  • 用户退出应用程序。

您需要做的是在发生这些事件时收到通知:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(appWillResignActive) 
                                             name:UIApplicationWillResignActiveNotification 
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(appWillTerminate) 
                                             name:UIApplicationWillTerminateNotification 
                                           object:nil];

现在,在各个方法中,使用PubNub的API

设置状态
-(void)appWillResignActive
{
    // Sample dictionary
    NSDictionary *dicState = @{ @"userName" : senderName, // Optional
                                @"status"   : @"Away", // Or whatever
                                @"isTyping" : @FALSE // Optional
                              };

    [AppDel.client setState: dicState
                    forUUID: senderId // current user's UUID
                  onChannel: KPubNubChannelName // channel name
             withCompletion: ^(PNClientStateUpdateStatus *status) 
     {
         NSLog(@"%@", status);
     }];
}

一旦在PubNub上更新状态,将通知该频道的所有订阅者,即将调用以下方法:

- (void)client:(PubNub *)client didReceivePresenceEvent:(PNPresenceEventResult *)event 
{
    if (![event.data.channel isEqualToString:event.data.subscription])
    {
        // Presence event has been received on channel group stored in event.data.subscription.
    }
    else 
    {
        // Presence event has been received on channel stored in event.data.channel.
    }

    if (![event.data.presenceEvent isEqualToString:@"state-change"]) {

        NSLog(@"%@ \"%@'ed\"\nat: %@ on %@ (Occupancy: %@)", event.data.presence.uuid, 
              event.data.presenceEvent, event.data.presence.timetoken, event.data.channel, 
              event.data.presence.occupancy);
    }
    else {

        NSLog(@"%@ changed state at: %@ on %@ to: %@", event.data.presence.uuid, 
              event.data.presence.timetoken, event.data.channel, event.data.presence.state);
    }
} 

调用它时,您必须相应地更新数据源,这将反映状态更新。