我们希望在iOS中使用Pubnub框架实现在线/脱机,但是应用程序在后台不能工作超过10分钟。我们试图通过启用位置功能和它的工作效率来实现这一点。但客户端不希望为此目的启用位置服务。那么,我们将如何使运行启用在后台无限?(QUE 1)
如果我们想把在线/离线/离开状态放在代码中
在我们应该展示的地方,Online:当用户打开应用程序脱机:当用户从后台关闭应用程序或删除应用程序离开:当用户点击主页按钮和应用程序在后台。
我们将如何实现这个(特别是离开和离线状态)?(QUE 2)
有没有其他方式来管理在线/离线/离开?(QUE 3)如果是,请描述一下方法。
我们将如何使用web服务管理在线/离线/离开?当我们称之为web服务时?(QUE 4)
我们使用的是近3-4年的基本代码。那么,我们是否应该在plist中添加其他参数以在后台启用更多的时间呢?(QUE 5)
请引导我们。
发布于 2015-08-31 18:26:46
使用PubNub存在,您可以在应用程序中提供此功能的最佳方法,但由于iOS处理应用程序的方式进入后台,您可能有或没有机会更新此状态(取决于应用程序配置如何运行)。
但是非常简单的是,通过启用PubNub密钥的存在,当客户端订阅频道时,join事件被发送给所有在该频道上监听存在的其他订阅者。
当应用程序进入后台时,如果您有机会这样做,您可以将客户端订阅到在所有频道上呼叫取消订阅,并将一个leave事件发送给该/那些频道的所有订阅者,以监听存在事件。
如果该应用程序被杀死或转到没有机会调用unsubscribe的后台,则当应用程序离线/断开时间超过配置的心跳周期时,将向所有收听存在事件的订阅者发送timeout (相当于leave事件)。
心跳默认为5分钟,但可以将其配置为60秒这样的较低设置。 (对于需要此功能但不低于15秒的用例,则为更短的时间)。
如果您希望您的服务器侦听存在事件,那么您将希望使用我们的存在Webhooks (文档即将到来)。请看这个StackOverflow线程介绍了如何实现PubNub存在Webhooks,以及如何配置您的PubNub键来使用它们。
发布于 2018-01-19 13:31:55
有两种情况:
您需要做的是在发生这些事件时得到通知:
[[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上更新状态后,将通知该信道的所有订阅者,即调用follwing方法:
- (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);
}
} 当它被调用时,您必须相应地更新数据源,这将反映状态更新。
https://stackoverflow.com/questions/30521730
复制相似问题