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

Как поймать все уведомления iOS Push с различными действиями пользователя, включая значок приложения

Согласно руководству Apple:

"В результате представленного уведомления пользователь нажимает кнопку действия предупреждения или крана (или клики) значка приложения. Если кнопка действия нажата (на устройстве с iOS), система запускает приложение, и приложение вызывает приложение-делегат: doneFinishLaunchingWithOptions: метод (если он реализован); он передается в полезной нагрузке уведомления (для удаленных уведомлений) или локальном уведомлении (для локальных уведомлений).

Если значок приложения отображается на устройстве с iOS, приложение вызывает тот же метод, но не предоставляет никакой информации об уведомлении. Если значок приложения щелкнут на компьютере под управлением Mac OS X, приложение вызывает делегат applicationDidFinishLaunching: метод, в котором делегат может получить полезную нагрузку удаленного уведомления. "

Мой вопрос: Предположим, что пользователь получил 3-4 Push-уведомления от поставщика, и все они хранятся в центре уведомлений Apple. Если пользователь прослушивает уведомление, он/она может легко получить данные уведомления в приложении. Но если пользователь нажал значок приложения на iPhone, как получить все данные, связанные со всеми предыдущими уведомлениями.

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

4b9b3361

Ответ 1

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

Итак, если пользователь открывает ваше приложение, а ваше приложение имеет уведомления, вы не сможете получить их с помощью в своем приложении.

Обходной способ может состоять в том, чтобы отслеживать уведомление на сервере и обрабатывать его с помощью приложения. Таким образом, сервер отслеживает, какое уведомление было прочитано. Вот как это делает Facebook.

Ответ 2

Чтобы сделать это правильно, необходимо выполнить некоторые условия:

Ваш сервер знает о том, что ваше приложение просматривает и какие уведомления он может отправить еще раз.

Рассмотрим только удаленные уведомления. Существует три состояния приложения:

  • FOREGROUND:

    • уведомление появляется без действий пользователя:

      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }
      

    Вы можете отображать баннер с помощью сторонней библиотеки: BSForegroundNotification

  • ПРЕДПОСЫЛКИ

    • На экране появляется уведомление
    • . (Обратите внимание, что установка content-available = 1 в push-уведомлении может привести к тому, что самое последнее push-сообщение будет видно после нажатия значка приложения, как вызвано didReceive... ).

      //nothing is called in the app, but app icon badge changes
      // OR - if the notification contains the field content-available set to 1 - 
      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      } 
      
    • пользователь нажимает на уведомление

      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }           
      
    • пользователь принимает действие уведомления

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification action
      }
      

      или

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification action response info
      }
      
    • значок приложения для пользователя

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      
  • НЕ БЕСПЛАТНО ВСЕ

    • На экране появляется уведомление
    • .

      //nothing is called in the app, but app icon badge changes
      
    • пользователь нажимает на уведомление

      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
          if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject: AnyObject] {
              //handle your notification
          }
      }
      
    • пользователь принимает действие уведомления

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification action
      }
      

      или

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification action response info
      }
      
    • значок приложения для пользователя

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      

Как обрабатывать уведомление?

  • let notification = WLNotification(userInfo: userInfo)

    Внутри WLNotification не забудьте сохранить текущее состояние приложения при получении уведомления. В будущем вам может понадобиться знать, откуда это уведомление.

  • WLNetworkClient.sharedClient().notificationForIdentifier(notification.identifier)

    Извлечь из сведений о сервере об этом уведомлении и в то же время сообщить ему, что вы ДЕЙСТВИТЕЛЬНО получаете это уведомление и выполняете данные пользователя.

Как получить все ожидающие уведомления?

WLNetworkClient.sharedClient().pendingNotificationsWithCompletionBlock(nil)

Получить все уведомления, которые вы пропустили. другими словами, выберите те, которые не были отмечены на сервере, как полученные вами.

Прочитайте Ограничения уведомлений Apple Push.

См. связанные вопросы:

Ответ 3

У меня была такая же проблема: если пользователь нажимает на push-баннер, он получает информацию о нажатии на приложение, если он нажимает на значок приложения, он не получает его. Вы можете обрабатывать производные от него, но только с некоторыми ограничениями. Например, если вы хотите присвоить номер значка push, вы можете сделать это: (Push → значок приложения → Значок значка приложения → ваш var)

в AppDelegate

- (void)applicationWillEnterForeground:(UIApplication *)application
{ 
    newMessages = application.applicationIconBadgeNumber;
}

Ответ 4

Концептуально, когда приложение загружается с отображением предупреждения, представленным для уведомления Push, чем приложение запускается с помощью метода didReceiveLocalNotification delegate, если ваше приложение находится в фоновом режиме. На данный момент applicationDidFinishLaunching метод делегата не вызывается.

Когда ваше приложение не находится в фоновом режиме, щелчок на представлении предупреждения, представленном для уведомления Push, вызовет метод applicationDidFinishLaunching.

Надеюсь, это очистит ваше понимание между этими двумя методами делегирования.

Ответ 5

Вы можете использовать этот код:

 NSArray *pendingNotifications = [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingComparator:^(id obj1, id obj2)                       {

        if ([obj1 isKindOfClass:[UILocalNotification class]] && [obj2 isKindOfClass:[UILocalNotification class]])
        {
            UILocalNotification *notif1 = (UILocalNotification *)obj1;
            UILocalNotification *notif2 = (UILocalNotification *)obj2;
            return [notif1.fireDate compare:notif2.fireDate];
        }

        return NSOrderedSame;
 }];

 // if there are any pending notifications -> adjust their badge number
 if (pendingNotifications.count != 0)
 {
     //do something
 }