iOS / Swift : 当应用程序处于后台时,从没有推送通知的数据流服务接收回调
iOS / Swift : Receive callbacks from data streaming service without push notifications while app is in background
背景资料:
我正在编写一个应用程序,它使用 PubNub 框架为每个用户直接耦合一个 Raspberry Pi 和一个 iPhone。 Raspberry Pi 使用 Arduino 作为从站来收集模拟数据,然后使用 PubNub 网络将该数据发布到同一频道上唯一的 iPhone。使用 iPhone 收到的数据,它确定(本地)是否需要提醒用户。然后,当用户收到警报时,他们可以通过将数据(设置)发送回 Pi 来调整 Raspberry Pi 的当前状态,这将解决需要用户警报的问题。
问题:
当iPhone应用程序进入后台时,Raspberry Pi发送的本应由iPhone接收的消息将不再被应用程序捕获,因此用户在需要时不再收到通知。第一个明显的解决方案是将保证警报的逻辑移至 Raspberry Pi 本身,以便它可以使用 Apple 推送通知将这些警报发送给用户。但是,问题是我也在尝试跟踪 Raspberry Pi 连接是否超时,这样如果发生意外断开连接,用户也会收到该问题的通知。这个逻辑显然不能在Raspberry Pi本身,因为如果发生断开连接,那么它就无法将通知推送到iPhone本身。有一个中间人服务器来监控设备的状态似乎是一个合乎逻辑的解决方案......但是我不想要任何其他东西而不是涉及数据传输和处理的 iPhone 和 Raspberry Pi,这显然是首先使用 PubNub 的全部动机(在我的应用程序范围内)。
这不是 PubNub 特有的问题。我只是引用它们来描绘更清晰的画面。另外值得注意的是,我 不想 伪造位置服务以获得 iOS 授予连续后台权限。这是一个懒惰和草率的解决方案,具有不希望的开销。
问题:
我如何在后台每 15 到 30 秒接收(或请求)一个短字符串以确定我是否应该发出警报。这必须是可以实现的。根据我对苹果文档的研究和阅读,我很清楚很多人会尝试用 "it isn't possible." 我不欢迎这个答案 来回应。我来这里是为了找到一个我以前找不到的解决方案,或者以前没有提出过的解决方案。我需要一位聪明的工程师为我的问题提出真正的解决方案或解决方法。
提前感谢冠军工程师。
@JonW 我读了你的问题和一些评论,直到我到达 TL;DR 点 :) 简短的回答是 silent push notifications 可能是答案您的 problems.The 之一可能是 PubNub Presence Webhooks。但我同意@Paulw11 的观点,服务器是最佳实践,最终,PubNub BLOCKS 将是您的解决方案。
使用 Apple 静默推送通知进行后台处理
要进行一些简短的后台处理,您可以让 RPi 发布一条包含推送通知的消息(我相信您已经在这样做了)。但是这个推送消息应该是silent push notification。文档是这样说的:
When a silent notification arrives, iOS wakes up your app in the
background so that you can get new data from your server or do
background information processing.
... ensure there is no alert, sound, or badge payload in the aps dictionary
完整的详细信息在我刚刚提供的 link 中,但这里是一个示例消息负载,您可以使用正确的 aps
格式在 PubNub 上发布它。
{
"pn_apns": {
"aps": {
"content-available": 1,
"data": {
"temperature": "55",
"humidity": "42%"
}
}
},
"data": {
"info": "This is the full realtime message.",
"temperature": "55",
"humidity": "42%"
}
}
警告:静默推送通知仅在应用未处于终止状态时才有效。换句话说,它必须在后台空闲 - 不是 运行,而是空闲。如果您强制终止该应用程序(通过双击主页按钮从最近的应用程序列表向上滑动)或在设备关机后再打开后不启动该应用程序,则静默推送将被忽略。
将此 Badge Count Demo 视为入门模板。但正如@Paulw11 所说,每 30 秒定期推送通知并不是一个好主意。您应该将更新发送到服务器,该服务器可以在需要采取行动时向 iPhone 应用程序发送推送通知。
使用 PubNub Presence Webhooks 的离线通知
进一步了解服务器进程最佳实践,您可以让您的服务器监控通道上 RPi 的存在。如果 RPi 通过显式取消订阅频道(leave
事件)或网络断开连接(timeout
事件)离开 频道,则消息可以是 POST
ed 到您的服务器 REST 端点(您提供给我们以在您的 PubNub 密钥上进行配置)。如果这些事件中的任何一个发生,那么您可以向您的 iPhone 应用程序发布一条消息(包括静默推送负载)以采取适当的措施。
PubNub BLOCKS - 不需要服务器(看妈妈,没有服务器!)
所以你说你想避免使用服务器。使用 PubNub BLOCKS,您将能够避免使用自己的 服务器 - 相反,您将使用 PubNub 服务器.
我不会在这里讲太多细节,但是你可以在 BLOCK 中写一小段 JavaScript 来确定是否推送是否需要发送通知等等。
总结
目前,我认为你的带有静默推送的原型很好地充实了你的用例。但最终,您需要有一个始终在线的流程来确定何时需要发送推送通知。当您的 iPhone 应用程序处于活动状态时,它可以接收来自 RPi 的实时消息,但在后台时,每 30 秒进行一次静默推送并不理想,Apple 可能不允许。
背景资料:
我正在编写一个应用程序,它使用 PubNub 框架为每个用户直接耦合一个 Raspberry Pi 和一个 iPhone。 Raspberry Pi 使用 Arduino 作为从站来收集模拟数据,然后使用 PubNub 网络将该数据发布到同一频道上唯一的 iPhone。使用 iPhone 收到的数据,它确定(本地)是否需要提醒用户。然后,当用户收到警报时,他们可以通过将数据(设置)发送回 Pi 来调整 Raspberry Pi 的当前状态,这将解决需要用户警报的问题。
问题:
当iPhone应用程序进入后台时,Raspberry Pi发送的本应由iPhone接收的消息将不再被应用程序捕获,因此用户在需要时不再收到通知。第一个明显的解决方案是将保证警报的逻辑移至 Raspberry Pi 本身,以便它可以使用 Apple 推送通知将这些警报发送给用户。但是,问题是我也在尝试跟踪 Raspberry Pi 连接是否超时,这样如果发生意外断开连接,用户也会收到该问题的通知。这个逻辑显然不能在Raspberry Pi本身,因为如果发生断开连接,那么它就无法将通知推送到iPhone本身。有一个中间人服务器来监控设备的状态似乎是一个合乎逻辑的解决方案......但是我不想要任何其他东西而不是涉及数据传输和处理的 iPhone 和 Raspberry Pi,这显然是首先使用 PubNub 的全部动机(在我的应用程序范围内)。
这不是 PubNub 特有的问题。我只是引用它们来描绘更清晰的画面。另外值得注意的是,我 不想 伪造位置服务以获得 iOS 授予连续后台权限。这是一个懒惰和草率的解决方案,具有不希望的开销。
问题:
我如何在后台每 15 到 30 秒接收(或请求)一个短字符串以确定我是否应该发出警报。这必须是可以实现的。根据我对苹果文档的研究和阅读,我很清楚很多人会尝试用 "it isn't possible." 我不欢迎这个答案 来回应。我来这里是为了找到一个我以前找不到的解决方案,或者以前没有提出过的解决方案。我需要一位聪明的工程师为我的问题提出真正的解决方案或解决方法。
提前感谢冠军工程师。
@JonW 我读了你的问题和一些评论,直到我到达 TL;DR 点 :) 简短的回答是 silent push notifications 可能是答案您的 problems.The 之一可能是 PubNub Presence Webhooks。但我同意@Paulw11 的观点,服务器是最佳实践,最终,PubNub BLOCKS 将是您的解决方案。
使用 Apple 静默推送通知进行后台处理
要进行一些简短的后台处理,您可以让 RPi 发布一条包含推送通知的消息(我相信您已经在这样做了)。但是这个推送消息应该是silent push notification。文档是这样说的:
When a silent notification arrives, iOS wakes up your app in the background so that you can get new data from your server or do background information processing.
... ensure there is no alert, sound, or badge payload in the aps dictionary
完整的详细信息在我刚刚提供的 link 中,但这里是一个示例消息负载,您可以使用正确的 aps
格式在 PubNub 上发布它。
{
"pn_apns": {
"aps": {
"content-available": 1,
"data": {
"temperature": "55",
"humidity": "42%"
}
}
},
"data": {
"info": "This is the full realtime message.",
"temperature": "55",
"humidity": "42%"
}
}
警告:静默推送通知仅在应用未处于终止状态时才有效。换句话说,它必须在后台空闲 - 不是 运行,而是空闲。如果您强制终止该应用程序(通过双击主页按钮从最近的应用程序列表向上滑动)或在设备关机后再打开后不启动该应用程序,则静默推送将被忽略。
将此 Badge Count Demo 视为入门模板。但正如@Paulw11 所说,每 30 秒定期推送通知并不是一个好主意。您应该将更新发送到服务器,该服务器可以在需要采取行动时向 iPhone 应用程序发送推送通知。
使用 PubNub Presence Webhooks 的离线通知
进一步了解服务器进程最佳实践,您可以让您的服务器监控通道上 RPi 的存在。如果 RPi 通过显式取消订阅频道(leave
事件)或网络断开连接(timeout
事件)离开 频道,则消息可以是 POST
ed 到您的服务器 REST 端点(您提供给我们以在您的 PubNub 密钥上进行配置)。如果这些事件中的任何一个发生,那么您可以向您的 iPhone 应用程序发布一条消息(包括静默推送负载)以采取适当的措施。
PubNub BLOCKS - 不需要服务器(看妈妈,没有服务器!)
所以你说你想避免使用服务器。使用 PubNub BLOCKS,您将能够避免使用自己的 服务器 - 相反,您将使用 PubNub 服务器.
我不会在这里讲太多细节,但是你可以在 BLOCK 中写一小段 JavaScript 来确定是否推送是否需要发送通知等等。
总结
目前,我认为你的带有静默推送的原型很好地充实了你的用例。但最终,您需要有一个始终在线的流程来确定何时需要发送推送通知。当您的 iPhone 应用程序处于活动状态时,它可以接收来自 RPi 的实时消息,但在后台时,每 30 秒进行一次静默推送并不理想,Apple 可能不允许。