当应用未处于活动状态时,推送通知无法正常工作(已杀死)

我正面临推送通知的问题,我正在使用Google Cloud Messaging,

我的问题是我的应用程序使用了一些缓存数据,并使用来自推送通知的数据刷新缓存,因此当应用程序被用户杀死时(主页按钮+向上滑动)并且应用程序收到推送通知不会调用方法didReceiveRemoteNotification ,因此应用程序无法访问该通知的有效负载并更新缓存的数据。

那么,有没有办法实现这一目标?

只有当用户点击通知并且应用程序通过application:didFinishLaunchingWithOptions程序获取它时application:didFinishLaunchingWithOptions方法?

如果用户通过单击应用程序图标打开应用程序,我无法获得通知的有效负载?

PD:如果应用程序处于前台或后台(未被杀死),它可以完美运行

如果您希望应用程序即使被杀死也会收到推送通知,请将"content-available":"1"键添加到推送有效负载中。

在此处输入图像描述

看这里

编辑 :在挖掘了一些之后,我发现无声推送(例如content-available:1 ),如果它被用户杀死,它不会唤醒应用程序:

但是,如果用户强行退出,系统不会自动启动您的应用程序

在此处输入图像描述

我必须说,我真的不明白为什么操作系统不会让我的应用程序在静音推送到达时就会唤醒。 有什么意义呢???

这是预期的行为。 如果用户杀死了应用程序,则不会调用didReceiveRemoteNotification ,除非您的应用程序具有VoIP权限。

如果被杀死的申请。 application:didFinishLaunchingWithOptionsapplication:didReceiveRemoteNotification:fetchCompletionHandler:被调用。 在前一个。 远程或本地通知的密钥在options参数中传递。 仅在远程通知的情况下调用后一个。 Apple Docs Here中详细介绍了该过程。 快照也粘贴在这里。

处理可操作的通知

如果您的应用程序未在前台运行,要在用户轻扫或点按通知时处理默认操作,iOS会在前台启动您的应用并调用UIApplicationDelegate方法application:didFinishLaunchingWithOptions:传入本地通知或远程选项词典中的通知。 在远程通知的情况下,系统还调用application:didReceiveRemoteNotification:fetchCompletionHandler: .

如果您的应用已位于前台,则iOS不会显示通知。 相反,为了处理默认操作,它调用UIApplicationDelegate方法application:didReceiveLocalNotification: application:didReceiveRemoteNotification:fetchCompletionHandler:application:didReceiveRemoteNotification:fetchCompletionHandler: . (如果你没有实现application:didReceiveRemoteNotification:fetchCompletionHandler: , iOS调用application:didReceiveRemoteNotification: application:didReceiveRemoteNotification:fetchCompletionHandler:

最后,要处理iOS 8或更高版本中可用的自定义操作,您需要在应用程序委托上实现两个新方法中的至少一个application:handleActionWithIdentifier:forRemoteNotification:completionHandler:application:handleActionWithIdentifier:forLocalNotification:completionHandler: . 在任何一种情况下,您都会收到操作标识符,您可以使用该标识符来确定已触发的操作。 您还会收到远程或本地通知,您可以使用它来检索处理该操作所需的任何信息。 最后,系统会传递完成处理程序,完成处理操作后必须调用该处理程序。 清单2-8显示了一个调用自定义操作处理程序方法的示例实现。 参考Apple Docs

编辑:

用户点按提醒中的默认按钮或点按(或点击)应用图标。 如果点击默认操作按钮(在运行iOS的设备上),系统将启动应用程序并且应用程序调用其委托的应用程序:didFinishLaunchingWithOptions:方法,传入通知有效内容(用于远程通知)或本地通知对象(用于当地通知)。 虽然application:didFinishLaunchingWithOptions:不是处理通知的最佳位置,但是此时获取有效负载使您有机会在调用处理程序方法之前启动更新过程。 参考: Apple Docs

当应用程序被杀死并且触发的推送通知包含一些可操作的按钮时。 当我们点击推送通知的动作按钮时,然后:

执行的第一个委托是:

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

但在这里, launchOptionsnil

执行的第二个代表是:

 -(void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(nonnull NSDictionary *)userInfo completionHandler:(nonnull void (^)())completionHandler 

在此,变量userInfo包含推送通知的所有有效载荷。 在identifier的帮助下,我们可以识别调用了哪个操作,然后执行我们各自的操作。

在项目中添加通知服务扩展的目标它包含两个方法在死时间上面一个方法调用并在通知有效负载的服务器端添加一个键“mutable_content”:true