- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发带有推送通知的 iOS 聊天,并使用 Firebase Cloud Messaging,但遇到以下问题:
当应用程序被终止(不在后台)时,有没有办法从通知中获取回调以获取内容(聊天消息)?
获取消息并将其保存在内部数据库中的唯一方法是在启动应用程序时检查我的服务器是否有未读消息?
Firebase 的文档似乎对此论点不是很清楚。仅当我发送静默通知(没有“通知”字段)时,当我打开应用程序时,才会调用应用程序 didReceiveRemoteNotification
回调,但我只能收到最后一个通知。此回调不会在后台调用
2016 年 2 月 12 日更新:
经过多次测试,我联系了苹果支持人员,他们通过这封电子邮件回复了我:
I'm responding to your question about background push notifications.
This topic was first discussed in the WWDC 2013 session 204 WWDC 2013: What’s New with Multitasking. Silent push notifications (those whose payloads contain only the content-available key and no alert, badge, or sound keys) are throttled to be delivered only when iOS determines that it’s energy-efficient to do so.
Push notifications with user-visible keys such as alert, sound, or badge sent at high priority (priority 10) are always displayed. However, if the notification also contains the content-available key, the notification may be throttled and thus not be sent to the app in the background unless the user taps the notification.
Notifications sent at low priority (priority 5) are throttled, regardless of payload. Silent push notifications should always be sent at low priority.
As the WWDC session says, you may expect up to several silent push notifications per hour across all apps on a device. But it is entirely possible and appropriate that you may receive none at all.
The purpose of the throttle is to predict when the user will launch an app and thus allow background activity to update the app’s content in an energy-efficient manner. It also serves to prevent apps from consuming too much of the user’s battery or cellular data with background traffic.
Once the device-wide battery or data budgets have been exhausted, no more background push notifications will be delivered until the budgets are reset. The budgets are reset every 24 hours, and this schedule cannot be changed by user or developer action.
Since these budgets apply across all apps on a device, it’s possible that an app other than your own has exhausted the budgets. You can check the overall battery usage of an app in Settings > General > Usage > Battery Usage.
The throttle also tracks when the device has poor network connectivity, because repeated attempts to connect to APNs when network connectivity is spotty can cause significant power drain. This is by far the most common reason why push notifications do not reach a device. To check if poor network connectivity is affecting your push notifications, you can use the steps in Observing Push Status Messages.
The throttle is disabled if you run your app with a debugger attached. This allows you to test that your notifications are being received correctly, but should only be considered a best-case scenario.
Additionally, starting with iOS 9, users have the ability to turn the throttle on any time they please by turning on Low Power Mode in Settings > Battery.
To test background push notifications, follow these steps.
- Attach your device to your Mac.
- Start your app from Xcode.
- When it has launched, stop your app from within Xcode by clicking the Stop button (square icon at upper left).
- In Xcode, do Debug -> Attach to Process -> [Fill in Process Name to wait for] -> Attach
- Send the push notification with content-available:1 and your app will receive the notification every time.
You can use the process list in Instruments to confirm that your app is running in the background.
You can also test using Wi-Fi and a device that is plugged in to wall power.
If you’re sending silent push notifications, be sure you’re using the APNs Provider API or the Binary Provider API so you can set the notification priority to 5. (The default priority is 10.)
If you believe throttling is not working properly, please file a bug report at https://developer.apple.com/bug-reporting. The details of how throttling works are not public API, but iOS Engineering looks at these bug reports and can determine if notifications are being throttled as expected.
The important point is that apps should never be designed expecting that every push notification will be received. This is not how APNs is intended to work; it is intended to inform the user or app that some event of interest has occurred. Apps are expected to work properly, albeit perhaps with degraded functionality, if push notifications are not received. The user can turn off push notifications or background app updates at any time, and of course push notifications will not be received if the device doesn’t have Internet connectivity.
Starting with iOS 7, all background categories except location and VoIP (on iOS 9.3 and later) behave consistently when a user force-quits an app from the multitasking display. An app will not be launched again automatically until the user chooses to launch it again. This respects the user's intent not to have the app running, which can be a very important recovery technique if an app is misbehaving and crashing on launch.
If you close an app that has been configured to receive background notifications, it won't receive them until it has been reopened.
在这封电子邮件之后,我尝试发送一条 Telegram 被杀死的通知。 Telegram 接收推送通知并显示它,但如果我在设置离线模式后打开应用程序,消息不会显示在聊天中(这意味着当我打开它时,Telegram 肯定会联系服务器检查未读消息)!相反,whatsapp 可以在后台添加消息,因为它是 VoIP 应用程序,并且可以调用后台回调。
所以添加消息的唯一方法是联系服务器并获取未读消息。
在android中也有同样的问题,但也许你可以通过后台服务来解决它(并在它被杀死时重新启动它)。
现在我必须选择是使用 Apple 推送通知还是 FCM 推送通知。可靠性是一样的吗? (因为,例如,Android 中的 Telegram 同时使用专有推送服务和 FCM,因为他们说 FCM 不太可靠)
最佳答案
iOS 上的消息传递应用程序在启动时需要检查服务器,以 catch 本地数据库与服务器的状态。推送通知不是用于保持 iOS 内部数据库与服务器同步的正确机制。
关于iOS 推送通知与杀死的应用程序 - swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893035/
我正在尝试将多个值放入数组中。 当我使用时: csvData.push('data[0][index],data[1][index],data[2][index],data[3][index]');
我想在数组声明中直接使用函数 push(),但它不能正常工作。在我的示例中,我的数组返回值 2 : var j = ["b"].push("a"); document.write(j); // ret
我编写了以下Powershell,它为所选文件夹中的所有驱动程序创建了一个bat安装程序,然后应重新启动PC。 New-Item C:\Tools\Drivers\DellLatitude3450.b
例: $ git clone git@gitlab:carlos/test.git Cloning into 'asd'... ssh: connect to host gitlab port 22:
我正在构建一个具有数组类型属性的对象数组: 这里是一些简化的代码: var _data = []; for(var i=0;i<10;i++) { var element = {
我有一个简单的 PHP/MySql 应用程序,它通常会选择几个数据库之一(假设每个客户一个)进行操作。但是,经常调用访问公共(public)数据库的实用程序函数。 我不想在我的代码中散布 USE 子句
我在推送 View Controller 时遇到问题。这就是我所做的:单击一个按钮,我使用这段代码添加了一个模态视图,我工作正常: - (void)addAction:(id)sender {
我想为socket can写一个android系统服务器。我目前正在设计这个,想知道是否有任何方法可以在 Linux/POSIX 套接字上的数据是否可用而无需调用 read() 并随时轮询结果的情况下
我正在编写一个 Bootstrap 站点,我想知道这是否可以接受。该网站看起来像我想要的那样,但我想知道这是否是最佳做法? 我采用的方法是对每两个缺失的列使用 1 个偏
删除远程分支是通过: git push origin :master 如果本地在远程之后,则需要完成: git push --force origin :master 但是强制删除例如master 基
假设我有一个 git 服务器。在每次推送时,我都需要启动一个进程,我可以通过一个钩子(Hook)来完成。 需要将进程的标准输出写入执行推送的 git 客户端。这与 Heroku 或 Openshift
我刚刚开始学习 Git,有些事情我无法解决。在我的 Mac 上本地创建和使用 git 存储库后,我可以将副本推送到其他地方的另一台服务器吗?我在防火墙后面,所以不幸的是我无法从另一台机器运行 git
这个问题在这里已经有了答案: warning: remote HEAD refers to nonexistent ref, unable to checkout (13 个答案) 关闭 7 年前。
我已经安装了 SCM Sync 配置插件(0.0.10)来将我的 jenkins 设置保存在我的 git 存储库中。 我已经设置了 git url 存储库但插件没有提交/推送,请看截图 我试过: 私钥
这可能看起来很矛盾,我知道 secret 变更集是私有(private)的,但是如果我想备份这些 secret 变更集怎么办? 我与一些分支并行工作,有时我想插入一个,而不是其他的。为了实现这一点,我
我正在使用 TortoiseHg用于版本控制。提交到本地后,我推送到远程存储库。如何撤消到特定的提交点? 有三个不同的插入,我想恢复到第一个插入。我读到了 Mercurial 回滚和 hg 撤销 命令
我知道以前有人问过这个问题,但我似乎无法理解这件事...... git checkout master git pull git git checkout feature git rebase ori
下面的代码片段中 return { Push:function ..... 的含义是什么?当我用谷歌搜索时,我发现push()方法将新项目添加到数组的末尾,并返回新的长度。所以我不确定什么是push:
我正在使用 Mercurial 1.6。我有一个带有几个子存储库的存储库 (11)。我想将父存储库推送到默认远程存储库,而不推送子存储库。想要这样做的原因包括: 我使用的是 SSH 存储库,需要很长时
我分配了一个按钮来将 segue 推送到另一个 View Controller ,但是当我执行这部分代码时,我得到以下信息: 2014-02-20 10:44:29.357 nar[20244:70b
我是一名优秀的程序员,十分优秀!