По этой теме есть много потоков stackoverflow, но я все еще не нашел хорошего решения.
Если приложение не в фоновом режиме, можно проверить launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]
в application:didFinishLaunchingWithOptions:
вызове , чтобы увидеть , если он открыт с уведомлением.
Если приложение работает в фоновом режиме, во всех сообщениях предлагается использовать application:didReceiveRemoteNotification:
и проверять состояние приложения. Но, как я экспериментировал (а также как следует из названия этого API), этот метод вызывается при получении уведомления, а не при нажатии.
Итак, проблема в том, что если приложение запущено, а затем находится в фоновом режиме, и вы знаете, что уведомление получено application:didReceiveNotification
( application:didFinishLaunchWithOptions:
на данном этапе не запускается), как узнать, возобновил ли пользователь приложение, нажав на уведомление или просто нажав на значок приложения? Потому что, если пользователь нажал на уведомление, ожидается, что откроется страница, упомянутая в этом уведомлении. Иначе не должно быть.
Я мог бы использовать handleActionWithIdentifier
уведомления о настраиваемых действиях, но это срабатывает только при нажатии кнопки настраиваемого действия, а не при нажатии пользователем на основную часть уведомления.
Спасибо.
РЕДАКТИРОВАТЬ:
Прочитав один ответ ниже, я подумал, что таким образом могу прояснить свой вопрос:
Как мы можем различить эти 2 сценария:
(A) 1. приложение переходит в фоновый режим; 2. уведомление получено; 3. пользователь нажимает на уведомление; 4. Приложение выходит на передний план.
(B) 1. приложение переходит в фоновый режим; 2. уведомление получено; 3. пользователь игнорирует уведомление и позже нажимает на значок приложения; 4. Приложение выходит на передний план.
Поскольку application:didReceiveRemoteNotification:
запускается в обоих случаях на шаге 2.
Или должен application:didReceiveRemoteNotification:
срабатывать на шаге 3 только для (A), но я каким-то образом неправильно настроил свое приложение, поэтому я вижу его на шаге 2?
Ответы:
ОК, я наконец-то разобрался.
В целевых настройках ➝ вкладка «Возможности» ➝ «Фоновые режимы», если вы отметите «Удаленные уведомления», они
application:didReceiveRemoteNotification:
будут запускаться, как только поступит уведомление (пока приложение находится в фоновом режиме), и в этом случае невозможно определить, пользователь нажмет на уведомление.Если вы снимите этот флажок,
application:didReceiveRemoteNotification:
будет срабатывать только при нажатии на уведомление.Немного странно, что установка этого флажка изменит поведение одного из методов делегата приложения. Было бы лучше, если бы этот флажок был установлен, Apple использует два разных метода делегирования для получения уведомлений и касания уведомлений. Я думаю, что большинство разработчиков всегда хотят знать, нажимается ли уведомление или нет.
Надеюсь, это будет полезно для всех, кто столкнется с этой проблемой. Apple , также не документировали его явно здесь , так что мне потребовалось некоторое время , чтобы выяснить.
источник
Я искал то же самое, что и вы, и на самом деле нашел решение, которое не требует отмечать удаленное уведомление.
Чтобы проверить, нажал ли пользователь, приложение работает в фоновом режиме или активно, вам просто нужно проверить состояние приложения в
Для получения дополнительной информации проверьте:
Справочник по UIKit Framework> Справочник по классам UIApplication> UIApplicationState
источник
content-available
ключ, но тогда уведомление должно быть беззвучным (то есть не включать звук или значок), как указано в официальных документах. ,func applicationDidEnterBackground(_ application: UIApplication)
и false в этом,func applicationDidBecomeActive(_ application: UIApplication)
это позволило мне показать в приложении уведомления, когда приложение неактивно из-за центра управления или списка уведомленийСогласно iOS / XCode: как узнать, что приложение было запущено щелчком по уведомлению или по значку приложения-трамплина? вы должны проверить состояние приложения в didReceiveLocalNotification следующим образом:
Хотя для меня это не совсем понятно, похоже, это работает.
источник
Если кому-то это нужно в быстрой версии 3.0
для swift 4
источник
Я тоже столкнулся с этой проблемой - но на iOS 11 с новым
UserNotifications
Framework.Вот для меня это так:
application:didFinishLaunchingWithOptions:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
userNotificationCenter(_:willPresent:withCompletionHandler:)
userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
источник
Если у вас установлен флажок «Фоновые режимы»> «Удаленные уведомления» == ДА, нажмите на событие уведомления, которое появится в:
Мне это помогло. Пожалуйста, наслаждайтесь :)
источник
В моем случае выключение фонового режима не имело никакого значения. Однако, когда приложение было приостановлено и пользователь нажал на уведомление, я смог обработать этот случай с помощью этого метода обратного вызова:
источник
Для iOS 10 и более поздних версий поместите это в AppDelegate, чтобы узнать, что уведомление нажито (работает, даже если приложение закрыто или открыто)
источник
Внутри
PushNotificationManager
класса есть две функции для обработки полученного PushNotification :Поскольку я тестировал первый триггер, как только пришло уведомление
И второй при нажатии на уведомление:
Я также тестировал его как при включенном, так и при выключенном состоянии удаленного уведомления (в фоновых режимах).
источник
SWIFT 5.1
UIApplication.State
у меня не сработало, потому что как только я прочитал отпечаток пальца (отображается модальный) в своем приложении, уведомление также выдается на верхней панели, и пользователь должен щелкнуть его.Я создал
public static var isNotificationFromApp: Bool = false
in,
AppDelegate
и я установил егоtrue
в своем старте,viewController
а затем в своем уведомленииstoryboard
/viewController
я просто проверяю это :)Надеюсь, это может пригодиться
источник
Вы можете настроить полезную нагрузку push-уведомления для вызова делегата приложения
application:didReceiveRemoteNotification:fetchCompletionHandler:
метода когда приложение находится в фоновом режиме. Вы можете установить здесь какой-либо флаг, чтобы при следующем запуске вашего приложения пользователем вы могли выполнить свою операцию.Из документации Apple вы должны использовать эти методы для загрузки нового контента, связанного с push-уведомлением. Кроме того, для этого на работу, вы должны включить удаленное уведомление от режимов фонового режима , и полезной нагрузку уведомления толчка должен содержать
content-available
ключ с его значением , установленным на 1. Из дополнительной информации см Использования Push Notifications для того чтобы начать загрузку раздел из яблочного дока здесь .Другой способ - иметь счетчик значков в полезных данных push-уведомлений. Поэтому в следующий раз, когда ваше приложение запустится, вы можете проверить количество значков приложения. Если он больше нуля, выполните свою операцию и также обнуляйте / очищайте счетчик значков с сервера.
Надеюсь, это тебе поможет.
источник