远程通知方法调用两次

我已经实现了application:didReceiveRemoteNotification:fetchCompletionHandler:在我的应用程序委托来响应推送通知。

当应用程序在后台接收到通知时,立即调用此方法,并在完成时获取新数据并执行完成块。 全部按照文档。 但是,如果我点击通知警报,则会再次调用此方法,导致另一个networking调用和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); } }]; } 

以下是应用程序中要注意的事项: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 } 

检查你的application.applicationState,知道你是否在后台或不活动,并采取相应的行动。