我正在考虑在我们的 iOS 应用程序中启用后台提取,以便为 PubNub 提供时间,以防止出现超时。
编辑 - 一些背景:我们的应用程序正在通过 pubnub channel 将其地理位置传达给服务。我们要求用户在后台授权位置,当授权后,我们已经从操作系统获得了偶尔的时间。我们一直在尝试使用状态功能,以便服务可以知道我们的应用程序是否已退出/断开连接,还是只是停止移动。但是,当设备在后台停止移动时,我们无法从到达的位置获取执行时间,因此无论如何都会发生 pubnub 超时。
启用后台状态后,看起来我需要
- 当我们不想超时时,调用
setMinimumBackgroundFetchInterval
并设置一个时间间隔(如果不希望超时,则调用Never
)。 - 实现
application:performFetchWithCompletionHandler:
但是,有些事情并不明显:
针对 pubnub 超时,我应该选择什么获取间隔?似乎操作系统不一定遵守指定的获取间隔。一般来说,我们希望保持较短的超时时间,这样当我们的应用程序离线或强制退出时,我们的另一端很快就会检测到。这似乎与心跳不一致,并确保我们不会无意中超时。我正在考虑仅使用
最小
间隔。我认为我不需要在
performFetchWithCompletionHandler
方法中执行任何操作来确保发送存在心跳,而只是通过唤醒应用程序这一事实来让 PubNub 的计时器开火并照顾一切。但是,我可以做任何事情,仅在心跳事务之后调用完成 block ,或者知道何时返回newData
与noData
与failed
。另外,我担心每次使用noData
立即调用完成操作都会被操作系统视为取消获取间隔的线索。
或者,如果有人可以推荐这种方法的替代方法来防止超时,我将不胜感激。
最佳答案
PubNub 存在心跳
如果您想在一个或多个 channel 上保持后台应用程序的存在,您只需使用 REST 调用每 4 分钟发送一次心跳(比每 5 分钟更快,这是默认超时 - 4 看起来就像一个不错的整数):
https://ps.pndsn.com/v2/presence/sub-key/{yourSubKey}/channel/{listOfchannels}/heartbeat?&uuid={clientuuid}
例如:
https://ps.pndsn.com/v2/presence/sub-key/sub-c-1234.../channel/channel1,channel2/heartbeat?&uuid=db9c5e39-7c95-40f5-8d71 -125765b6f561
只需确保您发送的 UUID 与您在该用户的应用中初始化 PubNub 实例时使用的 UUID 相同。
此心跳ping与长时间运行的订阅
连接具有相同的效果。它将在您传入的 channel 上保留给定的 UUID。
参见PubNub REST Docs了解更多详情。
关于ios - PubNub 防止存在超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43725654/