DidReceiveRemoteNotification не вызывается, когда я нажимаю значок приложения после получения push-уведомления на фоне

Когда мое приложение находится на фоновом режиме, и я получаю удаленное уведомление, могут произойти две вещи:

  • Я нажимаю баннер push-уведомлений, мои приложения выходят на передний план и вызывается doReceiveRemoteNotification.

  • Я нажимаю значок своего приложения с трамплина, мое приложение выходит на передний план, а didReceiveRemoteNotification НЕ вызывается.

Итак, в сценарии 1 я могу обновить счетчик непрочитанных сообщений внутри приложения в ответ на didReceiveRemoteNotification. В сценарии 2 я не могу.

Как я могу решить эту проблему с помощью Quickblox?

Ответ 1

В качестве одного из возможных вариантов:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo) {
       [self handleRemoteNotifications:userInfo];
    }

    // Override point for customization after application launch.
    return YES;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
   [self handleRemoteNotifications:userInfo];
} 

#pragma mark - Remote notifications handling

 -(void)handleRemoteNotifications:(NSDictionary *)userInfo {
   // do your stuff
}

@end

Ответ 2

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

Этот документ устарел

Если приложение не запускается при поступлении push-уведомления, метод запускает приложение и предоставляет соответствующую информацию в словаре параметров запуска. Приложение не вызывает этот метод для обработки этого push-уведомления. Вместо этого ваша реализация приложения: willFinishLaunchingWithOptions: или application: didFinishLaunchingWithOptions: метод должен получать данные полезной нагрузки push-сообщения и отвечать соответствующим образом.

Это новый документ

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

Ответ 3

Когда приложение не запущено, в файле didFinishLaunchingWithOptions: вы можете использовать этот код для получения полезной нагрузки push:

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    
    NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

NSString *myKey = [userInfo objectForKey:@"myKeyFromPayload"];
    }

Не забудьте установить разрешение в plist

Для удаленного нажатия вы можете использовать в своем appdelegate:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

Ответ 4

Вы должны включить удаленные уведомления в фоновом режиме.

Для этого автоматически: (Xcode5)

- Go to your Project settings -> Capabilities -> Background Modes
- Tick "Remote Notifications"

Для этого вручную:

- Open your %appname%-Info.plist
- Right click and tick "Show Raw Keys/Values"
- Right click and choose "Add Row"
- Type in "UIBackgroundModes" (Key)
- The key will be created, and the type is an Array
- Add new item in the array with the value of "remote-notification" (Value) and press enter
- Now you have 1 item in your array called: "Item 0", if you had any other items in there, just add this item (remote-notification) to the array.

Обязательно используйте эти методы frankWhite used:)

Надеюсь, что это поможет;)