it-swarm.com.ru

application: didReceiveRemoteNotification: fetchCompletionHandler Not Called

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

22
Wes Cossick

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

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

При получении Push приложение вызывается только «при необходимости» для вызова метода application:didReceiveRemoteNotification:fetchCompletionHandler: (т. Е. Необходимо установить флаг «content-available» в полезной нагрузке push-уведомления. См. SO ответ ). Метод будет вызываться снова, если пользователь затем откроет приложение, коснувшись уведомления.

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

50
nvrtd frst
- (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;
}
23
kid

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

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

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

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

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

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

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

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

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

Однако при тестировании с «content-available»: 1 нажимает, что приложение никогда не запускается, когда оно не запущено. Когда приложение приостановлено, оно работает.

Вы нашли себе решение Уэса?

3
Emiel

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

  • В состоянии background/foreground сработает application:didReceiveRemoteNotification:fetchCompletionHandler.

  • В состоянии Suspended срабатывает функция -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions.

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

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

2
Nandha

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

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

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}
1
Luai Kalkatawi

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

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

1
Dave Addey

Недавно я столкнулся с той же проблемой, и обнаружил, что Apple обновила их документацию и говорит:

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

приложение (_: didReceiveRemoteNotification: fetchCompletionHandler :)

Итак, я думаю, что нет никакого способа сделать что-либо, когда приложение было принудительно закрыто?

0
HunTer DRF