Ios 远程通知方法调用两次

Ios 远程通知方法调用两次,ios,objective-c,ios7,push-notification,Ios,Objective C,Ios7,Push Notification,我已经在我的应用程序委托中实现了application:didReceiveEmotentification:fetchCompletionHandler:,以响应推送通知 当应用程序在后台收到通知时,会立即调用此方法,并在完成后获取新数据并执行完成块。所有内容均符合文件要求。但是,如果我点击通知警报,此方法将再次被调用,导致另一个网络调用和UI更新。我本以为每次推送通知都会调用此方法一次,而不是在收到通知时调用一次,然后在执行操作时调用一次 其他人是如何实现这种方法的 - (void)appl

我已经在我的应用程序委托中实现了
application:didReceiveEmotentification: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);
        }
    }];
}

检查您的应用程序。应用程序状态以了解您是在后台还是处于非活动状态,并采取相应的行动。

以下是在应用程序中要注意的事项:DidReceiveEmotentification:fetchCompletionHandler:method当您收到推送通知时:
1。当应用程序未启动时(即,当应用程序既不在后台也不在前台时),将调用该方法一次,并且applicationState将为UIApplicationStateInactive。
2。当应用程序位于前台时,该方法将被调用一次,applicationState将处于UIApplicationStateActive状态。
3。当应用程序处于后台时,该方法将被调用两次,一次是在您收到推送通知时,另一次是在您点击该通知时。当您收到推送通知时,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
}

在您的方法中,您检查应用程序是否处于活动状态?如果我这样做了,我应该在第二次调用completionHandler时向它传递什么?您可以发布您的代码吗?如果您需要单独的逻辑来确定何时收到远程通知以及何时通过通知启动远程通知,那么这将无法解决问题。当用户打开通知时或当收到通知时应用程序处于非活动状态时,您将如何区分和知道哪个是哪个,因为现在可以调用
UIApplicationStateInactive
?用例的一个例子是,当收到远程通知时,需要一个时间戳。@HaithamMaya您找到解决方案了吗?