我希望能够获取在 iOS 设备上收到远程通知的日期。
我试图确定从我的服务器触发推送通知到在用户设备上收到它之间的延迟量。
在application:didReceiveRemoteNotification:fetchCompletionHandler:
您的应用程序委托中,NSDate
使用当前日期创建一个,然后将其保存在 NSUserSettings 的数组中或直接保存在其中。
有了这个,您甚至可以拥有收到通知的历史记录,并且可以在以后处理它们。
application:didReceiveRemoteNotification:fetchCompletionHandler:
仅当您将content-available
值为 1 的键添加到通知有效负载中时,才会在后台调用。
从苹果文档:
对于触发下载操作的推送通知,通知的有效负载必须包含其值设置为 1 的内容可用键。当该键存在时,系统会在后台唤醒应用程序(或将其启动到后台)并调用应用委托的 application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。您对该方法的实现应该下载相关内容并将其集成到您的应用程序中。https://developer.apple.com/library/prerelease/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
如果您控制连接到 APNS 的后端,并在 didReceiveRemoteNotification 中对其进行解析,则可以将自定义发送日期字段添加到通知负载中。显然,这将使您获得发送远程通知的日期,未收到的日期,但总的来说差异很小。
建议使用“content-available”键的解决方案可能不是您想要的,因为它会在此类通知的后台启动应用程序,并可能导致您的应用程序在 Settings.app > Battery > Battery Usage 中列为电池违规者. 它也会在低功耗模式下停止工作,或者如果用户禁用后台应用程序刷新。
后台应用刷新和“内容可用”键适用于在后台下载内容的应用。如果您的应用程序没有这样做,请不要使用它们。
您可以通过查看系统(而非应用程序)控制台来查看何时收到推送通知。似乎较新的 iOS 版本会过滤日志,但如果您事先杀死您的应用程序,您会看到类似这样的内容
Jun 1 17:55:38 Aarons-iPhone-6-Plus SpringBoard[657] <Warning>: High Priority Push: net.test.test - App killed –
在 didReceiveRemoteNotification 中创建并初始化 NSDate 对象。NSDate *notificationDate = [NSDate date] 应该可以工作。