首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何管理后台PUBNUB + IOS中的联机/离线/离开状态?

如何管理后台PUBNUB + IOS中的联机/离线/离开状态?
EN

Stack Overflow用户
提问于 2015-05-29 05:27:04
回答 2查看 1.5K关注 0票数 2

我们希望在iOS中使用Pubnub框架实现在线/脱机,但是应用程序在后台不能工作超过10分钟。我们试图通过启用位置功能和它的工作效率来实现这一点。但客户端不希望为此目的启用位置服务。那么,我们将如何使运行启用在后台无限?(QUE 1)

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

在我们应该展示的地方,Online:当用户打开应用程序脱机:当用户从后台关闭应用程序或删除应用程序离开:当用户点击主页按钮和应用程序在后台。

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

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

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

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

请引导我们。

EN

回答 2

Stack Overflow用户

发布于 2015-08-31 18:26:46

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

但是非常简单的是,通过启用PubNub密钥的存在,当客户端订阅频道时,join事件被发送给所有在该频道上监听存在的其他订阅者。

当应用程序进入后台时,如果您有机会这样做,您可以将客户端订阅到在所有频道上呼叫取消订阅,并将一个leave事件发送给该/那些频道的所有订阅者,以监听存在事件。

如果该应用程序被杀死或转到没有机会调用unsubscribe的后台,则当应用程序离线/断开时间超过配置的心跳周期时,将向所有收听存在事件的订阅者发送timeout (相当于leave事件)。

心跳默认为5分钟,但可以将其配置为60秒这样的较低设置。 (对于需要此功能但不低于15秒的用例,则为更短的时间)。

如果您希望您的服务器侦听存在事件,那么您将希望使用我们的存在Webhooks (文档即将到来)。请看这个StackOverflow线程介绍了如何实现PubNub存在Webhooks,以及如何配置您的PubNub键来使用它们

票数 2
EN

Stack Overflow用户

发布于 2018-01-19 13:31:55

有两种情况:

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

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

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(appWillResignActive) 
                                             name:UIApplicationWillResignActiveNotification 
                                           object:nil];

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

现在,在相应的方法中,使用PubNub的API设置状态

代码语言:javascript
复制
-(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方法:

代码语言:javascript
复制
- (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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30521730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档