我们希望在iOS中使用Pubnub框架实现在线/离线,但应用程序在后台工作超过10分钟。我们已尝试通过启用位置功能及其正常工作来实现此功能。但客户端不希望为此目的启用位置服务。那么我们如何设法让后台无限运行? (QUE 1)
如果我们想在我们的代码中放置在线/离线/离开状态
我们应该展示的地方, 在线:当用户打开应用时 离线:当用户从后台关闭应用或删除应用时 离开:当用户点击主页按钮并且应用程序处于后台时。
我们将如何实施此功能(特别是外出和离线状态)?(QUE 2)
还有其他方法可以管理在线/离线/离开吗? (没有Pubnub)(QUE 3) 如果是,请描述方式。
我们如何使用网络服务管理在线/离线/离开?当我们称之为Web服务时? (QUE 4)
我们使用的是近3-4岁的基本代码。那么我们是否应该在plist中添加任何其他参数以在后台启用应用程序更长时间? (QUE 5)
请指导我们。
答案 0 :(得分:2)
使用PubNub Presence,您可以在应用中提供此功能的最佳方式,但由于iOS处理应用进入后台的方式,您可能有也可能没有机会更新此状态(取决于应用的方式)配置为运行)。
但非常简单,by enabling Presence for your PubNub keys,当客户端subscribes to a channel,join
事件被发送给正在该频道上收听状态的所有其他订阅者时。
当应用程序进入后台时,如果您有机会这样做,您可以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)
有两种情况:
您需要做的是在发生这些事件时收到通知:
[[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);
}
}
调用它时,您必须相应地更新数据源,这将反映状态更新。