使用推送通知启动时应用程序崩溃

Posted

技术标签:

【中文标题】使用推送通知启动时应用程序崩溃【英文标题】:App crash when launch with a push notification 【发布时间】:2015-10-14 05:19:01 【问题描述】:

我为我的应用集成了推送通知。为了捕捉通知,我使用了这个委托。

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo在我的应用委托中。

所以当应用程序在后台运行时,如果通知来了,当我点击它时,这个委托就会触发。如果应用程序即使在后台也没有运行,如果点击 ntification 然后它会触发

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

到目前为止,它运作良好。然后我想在后台捕捉通知。于是我找到了

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

这对它有用。

所以我只是将我以前的didReceive 方法更改为这个新的didReceive 方法。现在我的问题是当应用程序通过推送通知启动时(如果应用程序没有在后台或前台运行并且当点击通知时)我的应用程序崩溃了。即使我无法调试和捕捉这种情况。

这两个代表之间有什么区别。当应用程序启动并带有通知时,我的第二个代表会触发吗?请帮帮我。

【问题讨论】:

检查一次有效载荷是否正确序列化 我有几种通知类型。如果通知类型是 12,我只需要在后台做一些事情。所以我添加了 'content-available key $body['aps'] = array('alert' => $message, 'sound' => 'default', 'badge' => 1, 'content-available'=>1 );如果我的通知类型是 12 content-available 在所有其他时间变为 0 看看这个答案,可能会有帮助***.com/a/20851481/3743322 【参考方案1】:

通常当收到通知时会执行此方法(当应用程序处于活动状态时) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

但是如果应用程序被系统关闭或杀死然后点击通知首先调用“didFinishLaunchingWithOptions”方法 在这个方法中,我们必须检查应用程序是从通知启动还是重新启动,我们可以使用此代码再次调用“didReceiveRemoteNotification”方法

UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (notification) 
    [self application:application didReceiveRemoteNotification:(NSDictionary*)notification];

【讨论】:

我唯一做的就是改变 void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 到 UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^) (UIBackgroundFetchResult))completionHandler 但这使我的应用程序在从通知启动时崩溃。原因是什么?在 didFinishLunch 方法中,我重定向到另一个视图。没有 fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 部分,它可以正常工作。 解决您的问题的简单方法是,只需将此方法用于通知实现和处理 (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary *)userInfo 并将此代码放在“didFinishLaunchingWithOptions”方法,如果你的应用程序处于活动状态,它会直接进入通知方法,但如果你的应用程序通过单击通知启动,那么代码 [self application:application didReceiveRemoteNotification:(NSDictionary)notification];将控件发送到通知方法

以上是关于使用推送通知启动时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

应用程序被杀死时点击推送通知后应用程序崩溃

推送通知导致应用程序崩溃

当应用程序在后台并接收推送通知点击应用程序崩溃时

应用程序未运行时的远程推送通知崩溃

注册推送通知期间的 Android 崩溃

从通知托盘按下推送通知时,Android GCM 应用程序崩溃