2013-12-13 4 views
11

Я внедрил application:didReceiveRemoteNotification:fetchCompletionHandler: в свой делегат приложения для ответа на push-уведомления.Метод удаленного уведомления, вызываемый дважды

Когда уведомление получено, когда приложение находится в фоновом режиме, этот метод вызывается немедленно, и я извлекаю новые данные и выполняю блок завершения, когда это делается. Все в соответствии с документацией. Однако, если я нажму уведомление о уведомлении, этот метод снова вызван, что приведет к другому сетевому вызову и обновлению пользовательского интерфейса. Я ожидал, что этот метод будет вызываться один раз для каждого push-уведомления, а не один раз при получении и снова в действии.

Как другие реализовали этот метод?

- (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); 
     } 
    }]; 
} 
+0

в вашем методе вы проверяете, работает ли приложение в активном состоянии или нет? – Ilario

+0

Если бы я это сделал, то что я должен передать в завершение Handler во второй раз? – Alex

+0

можете ли вы разместить свой код, пожалуйста? – Ilario

ответ

26

Вот вещи, которые будут замечены в применения: didReceiveRemoteNotification: fetchCompletionHandler: метод, когда вы получите уведомление толчок:
1. Когда приложение не запускается (то есть, когда приложение не является ни в фоновом режиме и не на переднем плане), метод называется один раз и applicationState будет UIApplicationStateInactive.
2. Когда приложение находится на переднем плане, метод вызывается один раз и applicationState будет UIApplicationStateActive.
3. Когда приложение находится в фоновом режиме, метод вызывается дважды, один раз, когда вы получаете push-уведомление, и в другое время, когда вы нажимаете на это уведомление. Когда вы получите уведомление толчок, applicationState будет UIApplicationStateBackground и при нажатии на это уведомление, applicationState будет UIApplicationStateInactive.

Мы можем игнорировать его, когда applicationState будет UIApplicationStateBackground, и поэтому мы можем обрабатывать push-уведомление только один раз для всех трех сценариев.

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

Это не решит проблему, если вам нужна отдельная логика, когда удаленное уведомление было полученный и когда он запускается уведомлением. Как бы вы различали и знали, что такое, как теперь «UIApplicationStateInactive» можно вызвать, когда пользователь открывает уведомление или когда приложение находится в неактивном состоянии при получении уведомления? Пример использования прецедента потребует отметки времени, когда было получено удаленное уведомление. –

+0

@ HaithamMaya вы нашли решение? –

0

Проверьте ваше приложение.applicationState, чтобы узнать, находитесь ли вы в фоновом режиме или неактивны и действуйте соответствующим образом.

Смежные вопросы