2015-05-29 69 views
2

我们想要在iOS中使用Pubnub框架来实现Online/Offline,但是应用程序在超过10分钟内不能在后台运行。我们试图通过启用位置功能来实现它,并且它的工作正常。但客户端不希望为此启用位置服务。那么我们如何设法让背景中的运行启用无限? (QUE 1)如何在后台管理在线/离线/离开状态PUBNUB + IOS?

如果我们希望把在线/离线/离开状态在我们的代码

我们应该表明, 在线:当用户打开应用程序 离线:当用户从后台关闭应用程序或删除应用程序 离开:当用户点击主页按钮和应用程序在后台。

我们将如何实现这个(特别是离开&离线状态)? (QUE 2)

有没有其他的方式来管理在线/离线/离开? (Without Pubnub)(QUE 3) 如果是,请描述方式。

我们将如何使用Web服务管理Online/Offline/Away?当我们称之为Web服务? (QUE 4)

我们正在使用差不多3-4年的基本代码。那么我们是否应该在plist中添加其他参数以便在后台启用应用程序以获得更多时间? (QUE 5)

请指导我们。

+0

嗨!我们为您提供解决方案,并会尽快提供一些说明。 – PubNub

+1

请通过[email protected]与我们联系,我们希望更多地了解您的应用程序,并从那里,我们可以为您提供最佳的解决方案。 – gurooj

回答

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

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); 
    } 
} 

当它被调用时,您将不得不相应更新您的数据源,这将反映状态更新。

+0

对于离线模式,我将很快进行编辑如果我得到它的工作。 – NSPratik