Как поймать все уведомления iOS Push с различными действиями пользователя, включая значок приложения
Согласно руководству Apple:
"В результате представленного уведомления пользователь нажимает кнопку действия предупреждения или крана (или клики) значка приложения.
Если кнопка действия нажата (на устройстве с iOS), система запускает приложение, и приложение вызывает приложение-делегат: doneFinishLaunchingWithOptions: метод (если он реализован); он передается в полезной нагрузке уведомления (для удаленных уведомлений) или локальном уведомлении (для локальных уведомлений).
Если значок приложения отображается на устройстве с iOS, приложение вызывает тот же метод, но не предоставляет никакой информации об уведомлении. Если значок приложения щелкнут на компьютере под управлением Mac OS X, приложение вызывает делегат applicationDidFinishLaunching: метод, в котором делегат может получить полезную нагрузку удаленного уведомления. "
Мой вопрос:
Предположим, что пользователь получил 3-4 Push-уведомления от поставщика, и все они хранятся в центре уведомлений Apple. Если пользователь прослушивает уведомление, он/она может легко получить данные уведомления в приложении. Но если пользователь нажал значок приложения на iPhone, как получить все данные, связанные со всеми предыдущими уведомлениями.
Спасибо заранее!
Ответы
Ответ 1
Вы не можете, вы будете получать информацию об уведомлении, которое было использовано для открытия вашего приложения.
Итак, если пользователь открывает ваше приложение, а ваше приложение имеет уведомления, вы не сможете получить их с помощью в своем приложении.
Обходной способ может состоять в том, чтобы отслеживать уведомление на сервере и обрабатывать его с помощью приложения. Таким образом, сервер отслеживает, какое уведомление было прочитано. Вот как это делает Facebook.
Ответ 2
Чтобы сделать это правильно, необходимо выполнить некоторые условия:
Ваш сервер знает о том, что ваше приложение просматривает и какие уведомления он может отправить еще раз.
Рассмотрим только удаленные уведомления. Существует три состояния приложения:
Как обрабатывать уведомление?
Как получить все ожидающие уведомления?
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
}