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

时间:2016-06-22 07:58:17

标签: ios swift push-notification google-cloud-messaging apple-push-notifications

我遇到推送通知问题,我正在使用Google云消息传递

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

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

enter image description here

here

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

  

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

enter image description here

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果被杀死的申请。调用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:,则iOS会调用application:didReceiveRemoteNotification:。)

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

修改

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

答案 3 :(得分:0)

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

执行的第一个委托是:

-(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的帮助下,我们可以识别调用了哪个操作,然后执行各自的操作。

答案 4 :(得分:0)

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