我正在使用推送通知开发iOS聊天,我使用Firebase云消息传递,但我遇到了这个问题:
当应用程序被杀死(不在后台)时,有一种方法可以从通知中获取回调以获取内容(聊天消息)吗?
获取消息并将其保存在内部数据库中的唯一方法是在我启动应用程序时检查我的服务器是否有未读消息?
Firebase的文档在这个论点上似乎并不十分清楚。
只有当我发送无声通知(没有"通知"字段)时,才会在我打开应用时调用应用didReceiveRemoteNotification
回调,但我只能收到最后通知。此回调函数未在后台调用
更新02/12/2016:
经过大量测试后,我联系了苹果支持,他们已通过此电子邮件回复了我:
我正在回答有关后台推送通知的问题。
本主题在WWDC 2013会议204 WWDC 2013中首次讨论: 多任务有什么新功能。无声推送通知(那些 有效载荷仅包含内容可用密钥,没有警报,徽章, 或声音键被限制只有在iOS确定时才会被传送 这样做是节能的。
使用用户可见的键推送通知,例如提醒,声音或 始终显示以高优先级(优先级10)发送的徽章。 但是,如果通知还包含内容可用密钥, 通知可能会被限制,因此不会被发送到应用程序 除非用户点击通知,否则背景。
以低优先级(优先级5)发送的通知受到限制, 无论有效载荷如何应始终发送无声推送通知 低优先级。
正如WWDC会议所说,你可能会期待几次无声推送 设备上所有应用的每小时通知。但它完全是 可能和适当的,你可能根本没有收到。
节流的目的是预测用户何时启动 应用程序,从而允许后台活动更新应用程序的内容 节能的方式。它还可以阻止应用程序 使用过多的用户电池或手机数据 背景交通。
一旦设备范围的电池或数据预算耗尽,没有 更多后台推送通知将在预算之前发送 被重置。预算每24小时重置一次,并按此时间表重置 用户或开发者操作无法更改。
由于这些预算适用于设备上的所有应用,因此可以实现 你自己以外的应用程序已经用尽了预算。您可以 在“设置”中查看应用的总体电池使用情况>一般> 用法>电池使用情况。
当设备网络不良时,油门也会跟踪 连接,因为重复尝试连接到APN时 网络连接不稳定会导致大量功耗。这个 是迄今为止推送通知未达到的最常见原因 设备。检查网络连接是否不良影响您的推送 通知,您可以使用观察推送状态中的步骤 消息。
如果您使用附加的调试器运行应用程序,则会禁用限制。 这允许您测试是否正在接收您的通知 正确,但应该只被视为最佳情况。
此外,从iOS 9开始,用户可以打开 通过打开低功耗模式,他们随时都可以节流 设置>电池。
要测试后台推送通知,请按以下步骤操作。
- 将您的设备连接到Mac。
- 从Xcode开始您的应用。
- 启动后,点击停止按钮(左上角的方形图标),在Xcode中停止您的应用。
- 在Xcode中,执行调试 - >附加到流程 - > [填写流程名称等待] - >附
- 发送内容可用的推送通知:1,您的应用每次都会收到通知。
醇>您可以使用Instruments中的进程列表来确认您的应用 正在后台运行。
您还可以使用Wi-Fi和插在墙上的设备进行测试 功率。
如果您要发送静音推送通知,请确保您使用的是 APNs Provider API或二进制提供程序API,以便您可以设置 通知优先级为5.(默认优先级为10.)
如果您认为限制无法正常运行,请提交错误消息 报告https://developer.apple.com/bug-reporting。细节 限制工作的方式不是公共API,而是iOS工程师所关注的 这些错误报告可以确定是否有通知 按预期受到限制。
重要的是,应该永远不要设计应用程序 将收到每个推送通知。这不是APN的方式 打算工作;它旨在通知用户或应用程序一些 感兴趣的事件已经发生。应用程序可以正常运行, 如果推送通知,可能会降低功能 没收到。用户可以关闭推送通知或后台 应用程序随时更新,当然推送通知也不会 如果设备没有Internet连接,则会收到。
从iOS 7开始,所有背景类别除了location和 VoIP(在iOS 9.3及更高版本上)在用户时表现一致 强制退出多任务显示中的应用程序。一个应用程序将不会 自动重新启动,直到用户选择启动它 再次。这尊重用户不让应用运行的意图, 如果是应用程序,这可能是一个非常重要的恢复技术 发射不当和崩溃。
如果您关闭已配置为接收背景的应用 通知,在重新打开之前,它不会收到通知。
在此电子邮件之后,我试图发送电报被杀的通知。电报收到推送通知并显示它,但如果我在设置离线模式后打开应用程序,则聊天中不会显示该消息(这意味着当我打开它时,确实会打电话联系服务器检查未读消息)!相反,whatsapp可以在后台添加消息,因为它是一个VoIP应用程序,它可以调用后台回调。
因此,添加消息的唯一方法是联系服务器并获取未读消息。
在Android中存在同样的问题,但可能您可以使用后台服务解决它(并在它被杀死时重新启动它)。
现在我必须选择使用Apple推送通知还是FCM推送通知。可靠性是一样的吗? (因为,例如,Android中的Telegram使用专有的推送服务和FCM,因为他们说FCM不是非常可靠)
答案 0 :(得分:2)
iOS上的消息传递应用程序需要在服务器启动时检查服务器,以便使用服务器的状态来跟踪本地数据库。推送通知不是用于使iOS内部数据库与服务器保持同步的正确机制。