为什么会调用didReceiveRemoteNotification:fetchCompletionHandler函数而平常的didReceiveRemoteNotification函数却不会被调用?

5
在我的应用程序中,我有两种类型的推送通知:带有content-available = 1标志的远程静默通知和常规推送通知,其中包括bodybadge和其他内容。
我还定义了两个代理方法didReceiveRemoteNotification:fetchCompletionHandler和通常的didReceiveRemoteNotification
但是当没有content-available标志的推送通知到达时,会调用didReceiveRemoteNotification:fetchCompletionHandler,而不是didReceiveRemoteNotification
如何解决这个问题?为什么我不能为后台和常规推送设置两个代理方法?

“content-available”是否会影响要调用的方法?- 不会。我说过,即使没有设置“content-available”标志,普通的推送通知到达时仍然会调用didReceiveRemoteNotification:fetchCompletionHandler委托。因此,无论是否设置了“content-available”标志,都会调用该委托。 - MainstreamDeveloper00
然后,是因为remote-notification背景模式。 - vokilam
@vokilam,据我所知,“由于远程通知后台模式”,iOS将始终调用新的didReceiveRemoteNotification:fetchCompletionHandler而不是didReceiveRemoteNotification,并且没有办法改变这一点,对吗? - MainstreamDeveloper00
我猜没有办法。因为通常的推送通知也允许在后台处理。 - vokilam
让我们在聊天中继续这个讨论 - vokilam
显示剩余2条评论
1个回答

9

iOS 7只调用新的API,这是我在我的应用中处理它的方式:

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    // Pass on
    [self application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:nil];

}

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

    // Check if in background
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) {

        // User opened the push notification

    } else {

        // User hasn't opened it, this was a silent update

    }

}

感谢您的快速回复。您说:“iOS 7只调用新的”,但为什么要这样做:// Pass on [self application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:nil];如果这个方法不会被调用呢? - MainstreamDeveloper00
1
iOS 6及以下版本仍然调用旧版本,因此在旧版本的iOS上运行时,只需将其传递给新版本即可... - jjv360

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接