远程通知方法调用两次

Ale*_*lex 13 objective-c push-notification ios ios7

application:didReceiveRemoteNotification:fetchCompletionHandler:在我的应用程序委托中实现了响应推送通知.

当应用程序在后台时收到通知时,会立即调用此方法,并在完成后获取新数据并执行完成块.全部按照文档.但是,如果我点击通知警报,则会再次调用此方法,从而导致另一个网络调用和UI更新.我希望每个推送通知都会调用一次此方法,而不是一次收到,再次执行操作.

其他人如何实施这种方法?

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    [self loadSomeResource:^(NSData *data,NSError *error){
        if (error) {
            completionHandler(UIBackgroundFetchResultFailed);
        }
        else if (data){
            completionHandler(UIBackgroundFetchResultNewData);
        }
        else {
            completionHandler(UIBackgroundFetchResultNoData);
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

Gan*_*ath 29

以下是应用程序中需要注意的事项:didReceiveRemoteNotification:fetchCompletionHandler:当您收到推送通知时的方法:
1.当应用程序未启动时(即,当应用程序既不在后台也不在前台时),该方法被调用一次和applicationState将是UIApplicationStateInactive.
2.当应用程序在前台时,该方法被调用一次,applicationState将是UIApplicationStateActive.
3.当应用程序处于后台时,该方法会被调用两次,一次是在您收到推送通知时,另一次是您点击该通知时.当您收到推送通知时,applicationState将是UIApplicationStateBackground,当您点击该通知时,applicationState将是UIApplicationStateInactive.

applicationStateUIApplicationStateBackground时,我们可以忽略它,因此我们只能为所有三种情况处理推送通知一次.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    if (application.applicationState == UIApplicationStateBackground) {
        completionHandler(UIBackgroundFetchResultNoData);
        return;
    }

    // Do whatever you need here and call completionHandler with appropriate UIBackgroundFetchResult
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在收到远程通知时以及通知时启动它时需要单独的逻辑,则无法解决问题.您将如何区分并知道哪个是哪个,因为现在可以在用户打开通知时调用"UIApplicationStateInactive",或者在收到通知时应用程序处于非活动状态?用例的一个示例是在收到远程通知时需要时间戳. (2认同)