将"content-available": "1"
的后台推送发送到被用户杀死的应用时,应用程序不会启动到后台模式,application:didReceiveRemoteNotification:fetchCompletionHandler:
不会被称为Apple doc say }:
使用此方法处理应用的传入远程通知。 [...]此外,如果您启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在远程通知到达时将其置于后台状态。 但是,如果用户强行退出,系统不会自动启动您的应用。
我的问题是:有没有办法在下次用户启动应用程序时访问此静默推送有效负载?
我尝试使用launchOptions
方法的didFinishLaunchingWithOptions
,但它们不包含推送有效负载。
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
我的用例是我只依靠推送渠道向应用程序接收数据,但应用程序无法拉它们。
答案 0 :(得分:1)
最简单的答案是:不,你不能。
您还将无法使用VoIP推送,唯一的选择是将常规推送与推送通知服务扩展一起使用。在您的应用程序和此扩展之间共享钥匙串,在收到通知时将推送有效内容保存在钥匙串中,并在进入前台时与您的应用程序一起检索。 缺点是您需要向用户呈现视觉通知,但它可以保持沉默,您可以选择呈现所需的任何文本(最佳选择取决于您的应用程序做什么以及此通知的目的)。
答案 1 :(得分:0)
您可以使用VoIP推送消息,请参阅此处:
Voice Over IP (VoIP) Best Practices
使用PushKit接收VoIP推送有很多好处:
- [...]
- 如果在收到VoIP推送时它未运行,您的应用会自动重新启动。
- [...]
请注意,您的应用必须具有启用VoIP功能的后台模式,如果误用,这可能是应用商店批准的问题。
答案 2 :(得分:-1)
查看文档,您似乎应该实现此方法:
可选的func应用程序(_ application:UIApplication, didReceiveRemoteNotification userInfo:[AnyHashable:Any], fetchCompletionHandler completionHandler:@escaping(UIBackgroundFetchResult) - >空隙)
在该方法中,编写代码以存储有效负载(userInfo)。也许暂时将它存储在userDefaults中。然后,当应用程序启动时,检查有效负载是否可用。