Вопрос по objective-c, apple-push-notifications, push, swift, ios – Как перехватить все push-уведомления iOS с помощью различных действий пользователя, включая нажатие на значок приложения

25

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

& quot; В результате представленного уведомления пользователь нажимает кнопку действия предупреждения или нажимает (или щелкает) значок приложения. Если нажать кнопку действия (на устройстве под управлением iOS), система запустит приложение, и приложение вызовет приложение своего делегата: didFinishLaunchingWithOptions: method (если реализовано); он передает полезные данные уведомлений (для удаленных уведомлений) или объект локальных уведомлений (для локальных уведомлений).

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

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

Заранее спасибо!

Ваш Ответ

5   ответов
15

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

Your server knows about what your app currently have seen and what notifications it could send once again.

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

  • FOREGROUND:

    • notification appears without user's action:

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

    You can display banner using third party library: BSForegroundNotification

  • BACKGROUND

    • notification appears on the screen. (Note that setting content-available=1 in a push notification can lead to the latest push message being visible once the app icon is pressed, as didReceive... is called).

      //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
      } 
      
    • user tap on notification

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

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

      or

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action response info
      }
      
    • user tap app icon

      func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      
  • NOT RUNNING AT ALL

    • notification appears on the screen.

      //nothing is called in the app, but app icon badge changes
      
    • user tap on notification

      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
          if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject: AnyObject] {
              //handle your notification
          }
      }
      
    • user take notification action

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

      or

      func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action response info
      }
      
    • user tap app icon

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

How to handle notification?

  1. let notification = WLNotification(userInfo: userInfo)

    Within WLNotification remember to keep current application state when you receive notification. In future you may need it to know where that notification come from.

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

    Fetch from server details about that notification, and in the same time let it know that you REALLY get that notification, and effected on user's data.

How to fetch all pending notifications?

WLNetworkClient.sharedClient().pendingNotificationsWithCompletionBlock(nil)

Fetch all notifications you missed. in other words, fetch those ones, which were not marked in server as received by you.

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

See the related questions:

Отлично! Коротко и четко, спасибо!
Отлично @ Барт & omiej Sema & # x144; czyk
39

которое использовалось для открытия вашего приложения.

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

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

Спасибо чувак! На самом деле у меня тоже были такие же мысли. Но я не был уверен. То есть, чтобы прочитать уведомление, пользователь должен нажать на панель уведомлений. Правильно? Kirity
Приходите еще раз, после отслеживания того, какой из них читается, вы имеете в виду, что сервер будет повторно отправлять те в запатентованном виде, когда приложение подключится к серверу facebook?
Да, и вы получите только уведомление, на которое пользователь нажал.
Интересно, почему Apple не заботится об этих основных проблемах. Android хорошо справляется с обработкой push-уведомлений.
1

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

Когда ваше приложение не работает в фоновом режиме, при нажатии на уведомление, отображаемое для Push-уведомления,applicationDidFinishLaunching метод.

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

3

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

в AppDelegate

- (void)applicationWillEnterForeground:(UIApplication *)application
{ 
    newMessages = application.applicationIconBadgeNumber;
}
Конечно, вы можете использовать applicationDidBecomeActive. Это зависит от вашего порядка логики для пробуждения приложения. Метод applicationWillEnterForeground запускается перед applicationDidBecomeActive.
Интересно, может ли applicationDidBecomeActive быть лучшим местом для тестирования? В моем случае я хотел показать предупреждение.
-2

 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
 }
Это для локальных уведомлений, а не push-уведомлений.
... и не выполняет запланированные локальные уведомления только для локальных уведомлений, которые былиscheduled, но не сейчасreceived? Я думаю, что оригинальный постер спрашивал об уведомлениях, которые былиreceived на устройстве, но это былоnot tapped, Мне тоже интересно узнать, возможно ли это с локальными уведомлениями.

Похожие вопросы