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

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

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

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

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

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

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

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

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?

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.

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:

How to ensure that iOS app received EVERY push notification send by server?
 06 авг. 2018 г., 09:42
Отлично @ Барт & omiej Sema & # x144; czyk
 28 сент. 2016 г., 18:35
Отлично! Коротко и четко, спасибо!

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

в AppDelegate

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

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

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

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

Решение Вопроса

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

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

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

 23 июл. 2013 г., 07:15
Интересно, почему Apple не заботится об этих основных проблемах. Android хорошо справляется с обработкой push-уведомлений.
 09 мая 2013 г., 22:24
Приходите еще раз, после отслеживания того, какой из них читается, вы имеете в виду, что сервер будет повторно отправлять те в запатентованном виде, когда приложение подключится к серверу facebook?
 Kirity02 июл. 2012 г., 11:24
Спасибо чувак! На самом деле у меня тоже были такие же мысли. Но я не был уверен. То есть, чтобы прочитать уведомление, пользователь должен нажать на панель уведомлений. Правильно?
 02 июл. 2012 г., 11:36
Да, и вы получите только уведомление, на которое пользователь нажал.

Ваш ответ на вопрос