2014-12-24 2 views
3

Я видел слишком много вопросов о тихом уведомлении push не работает, если устройство не подключено к xcode, но я не смог найти реальный ответ. Я использую Бесшумный APN, чтобы начать процесс в фоновом режиме, а затем огнь локальных рассылок уведомленийiOS 8 Silent Push Notification не запускает метод didReceiveRemoteNotification, когда приложение не подключено к xcode

  1. Сервер посылает это информация:

    "_metadata" =  { 
        bagde = 1; 
        pushText = "semeone has sent you a message!!"; 
        sender = "semeone"; 
    }; 
    aps =  { 
        "content-available" = 1; 
    }; 
    

    И _metadata настраивается информацией для стрельбы из местного уведомления, Я не включил значок, pushText .. в aps, потому что я это молчаливое push-уведомление.

  2. Клиент должен получить информацию в didReceiveRemoteNotification,

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
    { 
    if(application.applicationState != UIApplicationStateActive){ 
         if([userInfo[@"aps"][@"content-available"] intValue]== 1) //it's the silent notification 
         { 
          //start a background task 
          UIBackgroundTaskIdentifier preLoadPNTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
           NSLog(@"Background task to start a process "); 
          }]; 
          //end completionHandler regarding to fetchCompletionHandler 
          completionHandler(UIBackgroundFetchResultNewData); 
    
          // doing my process...... and fire a local notification 
    
          if(preLoadPNTask){ 
           NSLog(@"End Background task "); 
           [[UIApplication sharedApplication] endBackgroundTask:preLoadPNTask]; 
           preLoadPNTask = 0; 
          } 
          return; 
         } 
         else 
         { 
          NSLog(@"didReceiveRemoteNotification it's NOT the silent notification "); 
          completionHandler(UIBackgroundFetchResultNoData); 
          return; 
         } 
    
        } 
    else { 
        if(preLoadPNTask){ 
         NSLog(@"End Background task "); 
         [[UIApplication sharedApplication] endBackgroundTask:preLoadPNTask]; 
         preLoadPNTask = 0; 
        } 
        completionHandler(UIBackgroundFetchResultNewData); 
    } 
    
    } 
    

Он отлично работает, когда устройство подключается к Xcode, но когда это не так, didReceiveRemoteNotification не запускается :(

Любые идеи?

Спасибо заранее !!

+0

Какую задачу вы выполнять при получении уведомления? –

+0

Я добавляю в NSMutableDictionary идентификатор и отправителя, затем я отправил данные в Worklight [[WL sharedInstance] sendActionToJS: @ «silentNotification» withData: dictionary]; а затем я освобожу локальное уведомление localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = значок; местныйNotif.alertBody = textAlert; localNotif.userInfo = userInfoData; [[UIApplication sharedApplication] scheduleLocalNotification: localNotif]; [localNotif release]; – Jan

+0

Откуда вы знаете, вызван ли метод didReceiveRemoteNotification? –

ответ

0

То, что я в конечном итоге представляет собой кабель USB, вызывало у меня некоторые проблемы, видимо, каждый раз, когда я подключался к устройству iphone, я сказал, что «этот аксессуар может не поддерживаться», но он продолжает работать нормально, поэтому я заменяю его на новый, но что не решить мою проблему, однако может быть частью этого. так что я посмотрел в коде, и я сделал некоторые изменения, после получения 2 о более тихий толчке уведомление preLoadPNTask (UIBackgroundTaskIdentifier) ​​создавало много раз, так что я добавил проверку, прежде чем начать,

if(!preLoadPNTask){ 
//start a background task 
      UIBackgroundTaskIdentifier preLoadPNTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
       NSLog(@"Background task to start a process "); 
      }]; 

} 

Я надеюсь, что это поможет вам Привет

+0

Также запомните закрытие preLoadPNTask (BackgroundTask) до 3 минут или приложение будет аварийно – Jan

0

в ИО 8, Вам необходимо следующие шаги, чтобы стрелять didReceiveRemoteNotification: метод вкладка

  1. Выбор целевых проектов GOTO Возможности
  2. Выберите «Фоновые режимы».
  3. Это будет добавить ключ (обязательные режимы фона) в вашем проекте info.plist

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

0

Возможно, потому что под iOS 8 вы должны попросить push-уведомления другим способом. Попробуйте это:

-(void) registerForPushNotifications { 

UIApplication* application=[UIApplication sharedApplication] ; 

// Register for Push Notitications, if running iOS 8 
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { 
    UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); 
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil]; 
    [application registerUserNotificationSettings:settings]; 
    [application registerForRemoteNotifications]; 

} else { 
    // Register for Push Notifications before iOS 8 
    [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; 
} 

}

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