2016-01-21 4 views
4

Я внедрил Push Notification в своем приложении.didReceiveRemoteNotification называется дважды

Когда мое приложение находится на переднем плане, мое приложение работает нормально.

Но когда приложение находится в фоновом режиме или убито, мой didReceiveRemoteNotification называется два раза.

Я сделал общий метод для обработки уведомления принудительного и вызвать этот метод из didFinishLaunchingWithOptions и didReceiveRemoteNotification

Вот моя реализация:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSDictionary *pushDictionary = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 
    if (pushDictionary) { 
    [self customPushHandler:pushDictionary]; 
    } 

    return YES; 

} 

И:

- (void)application:(UIApplication *)application 
    didReceiveRemoteNotification:(NSDictionary *)userInfo 
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler { 


     [self customPushHandler:userInfo]; 

} 

И:

- (void) customPushHandler:(NSDictionary *)notification { 

    // Code to push ViewController 

     NSLog(@"Push Notification"); //Got it two times when Clicked in notification banner 

    } 

Когда мое приложение запущено, ViewController однократно нажата. И когда я открываю свое приложение Из баннера уведомлений, тогда мой экран дважды нажат.

Я разместил NSLog в customPushHandler, и я получил его один раз, когда приложение находится на переднем плане и два раза, когда я запускаю его из баннера уведомлений.

Что такое проблема в моем коде.?

+0

См http://stackoverflow.com/questions/22085234/didreceiveremotenotification-fetchcompletionhandler-open-from-icon-vs-push-not#comment51407901_22085855 –

ответ

0

проверить это одно условие в didReceiveRemoteNotification, как , если вы нажмете на уведомления в то время как приложение работает в фоновом режиме. Таким образом, вы можете избежать вызова дважды.

- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler { 
     UIApplicationState state = [[UIApplication sharedApplication] applicationState]; 
     if (state == UIApplicationStateBackground || state == UIApplicationStateInactive || state == UIApplicationStateForeground || state == UIApplicationStateActive) 
     { 
      //Do checking here. 
      [self customPushHandler:userInfo]; 
     } 
} 

Проверьте, что я отредактировал свой ответ.

+0

не внутри, если состояние только вы должны позвонить. Поскольку, если приложение открыто из фона, этот метод должен быть вызван. Если приложение завершено, то из метода dofinishlauch, ваш обработчик должен быть вызван. –

+0

вы не понимаете мою точку зрения. Я также вызываю метод customPushHandler из 'didFinishLaunchingWithOptions'. Если я использую ваш код, мой' customPushHandler' будет всегда вызываться дважды, а когда мое приложение находится на переднем плане, тогда мой 'customPushHandler' никогда не будет называться – Dalvik

+0

Приложение не будет вызывать эти два метода одновременно. Они имеют разные функциональные возможности, как описано в документации. Вместо этого, если (pushDictionary), проверьте это, если (pushDictionary! = Nil). или запишите pushDictionary в обоих методах. Если вы получаете одинаковое значение или ноль? –

0

Проверить контроллер сверху в текущем стеке навигации как:

if(![self.navigationController.topViewController isKindOfClass:[MyClass class]]) { 

      //code for pushing new controller 

} 
0

Всякий раз, когда вы используете backgroundFetch для удаленного уведомления, добавьте обработчик завершения для этого.

- (void)application:(UIApplication *)application 
    didReceiveRemoteNotification:(NSDictionary *)userInfo 
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler { 

    [self customPushHandler:userInfo]; 

    completionHandler(UIBackgroundFetchResultNewData) 
}