远程通知方法调用两次

时间:2013-12-13 14:44:45

标签: ios objective-c ios7 push-notification

我已在应用程序委托中实施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);
        }
    }];
}

2 个答案:

答案 0 :(得分:27)

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

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

- (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
}

答案 1 :(得分:0)

检查您的application.applicationState,了解您是在后台还是非活动状态并采取相应行动。