Подтвердить что ты не робот

Application: didReceiveRemoteNotification: fetchCompletionHandler не вызывается

Кажется, функция application:didReceiveRemoteNotification:fetchCompletionHandler не вызывается, когда приложение принудительно завершает работу. Мне показалось, что функция будет вызываться независимо от того, в каком состоянии было приложение, но похоже, что она вызывается только в том случае, если приложение уже работает в фоновом режиме. Есть ли способ пробудить приложение в фоновом режиме, если он еще не запущен с использованием нового режима фонового уведомления iOS 7?

4b9b3361

Ответ 1

application:didReceiveRemoteNotification:fetchCompletionHandler: вызывается даже в том случае, если приложение приостановлено, не работает вообще, в фоновом режиме или активно. Также стоит отметить, что метод - это только iOS 7. Ниже представлена ​​документация .

ОДНАКО, если приложение было принудительно закрыто (т.е. убито с помощью переключателя приложений), приложение не будет запущено. (см. SO answer) EDIT: я проверил это снова на iOS 7.1, чтобы убедиться, что они исправили это, но все равно остается, что если приложение будет убито вручную, приложение НЕ будет разбужено, а application:didReceiveRemoteNotification:fetchCompletionHandler: не будет называться

При приеме нажатия приложение только пробуждается только "при необходимости", чтобы вызвать метод application:didReceiveRemoteNotification:fetchCompletionHandler: (т.е. вы должны установить флаг "content-available" в полезной нагрузке push-уведомления. См. "Ответ" ). Этот метод будет вызван снова, если пользователь затем откроет приложение, нажав на уведомление.

EDIT: не проверял это на iOS 8. Кто-нибудь еще?

Ответ 2

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

    //Remote Notification Info
    NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

    //Accept push notification when app is not open
    if (remoteNotifiInfo) {
       [self application:application didReceiveRemoteNotification: remoteNotifiInfo];
    }

    return YES;
}

Ответ 3

Приложение должно быть запущено, даже если оно не запущено. В документации Apple говорится:

Когда это значение присутствует и на устройство поступает push-уведомление, система отправляет уведомление о вашем приложении (запустив его при необходимости) и дает ему несколько минут для обработки > уведомления перед тем, как отобразить что-либо пользователю. (Руководство по программированию приложений для iOS)

При поступлении push-уведомления система выводит уведомление пользователю и запускает приложение в фоновом режиме (при необходимости), чтобы он мог вызвать этот метод. (Ссылка на протокол UIApplicationDelegate)

В отличие от приложения: метод didReceiveRemoteNotification: метод, который вызывается только тогда, когда ваше приложение запущено, система вызывает этот метод независимо от состояния вашего приложения. Если ваше приложение приостановлено или не работает, система просыпается или запускает ваше приложение и помещает в фоновом режиме перед вызовом метода. (Ссылка на протокол UIApplicationDelegate)

Однако при тестировании с "доступным контентом": 1 толкает приложение, которое никогда не запускается, когда оно не запущено. Когда приложение приостановлено, оно работает.

Вы нашли решение Wes?

Ответ 4

Когда ваше приложение отключено, этот метод не вызывается. Вместо этого, как обычно, вызывается (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions.

Если приложение было открыто, нажав "Открыть" во всплывающем окне уведомления, уведомление находится внутри launchOptions.

Получить словарь push-уведомлений следующим образом:

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (pushNotificationUserInfo)
{
  // call your handler here
}

Ответ 5

Как описано в Apple, новый API многозадачности (выборка и удаленное уведомление) будет работать только тогда, когда приложение находится в состоянии приостановлено/фоновое/переднее.

  • В состоянии фон/переднего плана запускается application:didReceiveRemoteNotification:fetchCompletionHandler.

  • В состоянии Приостановлено, тогда будет срабатывать -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions.

  • В состоянии Не работает (ваш случай) application:didReceiveRemoteNotification:fetchCompletionHandler никогда не запускается.

Подробнее о состояниях приложений см. в документации Apple.

Ответ 6

Если вы отключите приложение из переключателя приложений, он не будет разбужен в фоновом режиме (любыми способами) до следующего запуска следующего запуска. Когда вы принудительно завершаете приложение, вы фактически говорите OS, что вы не хотите, чтобы это приложение запускалось вообще, даже если фоновое событие, как правило, разбудило его.

Это стоит посмотреть во время тестирования, так как вы можете заставить его выйти из приложения, чтобы проверить, запущен ли он через push-уведомление, когда приложение не запущено. Фактически, ваше применение силы прекратится, и это станет причиной того, что она не запускается.

Ответ 7

Кому забота в Swift 2.0 я решил свою проблему, как это для фона

if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}