# #ios #swift #push-notification #notifications #firebase-cloud-messaging
Вопрос:
Я настраиваю push-уведомления в Swift. Пока у меня есть 3 сценария.
1 — Приложение На переднем плане На переднем плане, я думаю, что я все сделал правильно, потому что я получил данные push-уведомления.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("userNotificationCenter willPresent")
let content = notification.request.content
UIApplication.shared.applicationIconBadgeNumber = 0
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
completionHandler([.alert, .sound])
}
2 — Пользователь нажимает на баннер Push-уведомления
Это тоже работает нормально.
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
print("userNotificationCenter didReceive")
defer {
completionHandler()
}
guard response.actionIdentifier == UNNotificationDefaultActionIdentifier else {
return
}
let content = response.notification.request.content
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
}
3 — Приложение в фоновом режиме, затем пользователь попадает в приложение
В этом случае push-уведомление поступает на телефон пользователя. Но вместо того, чтобы нажимать на само push-уведомление, они попадают в приложение. И я не могу получить никакой информации из push-уведомления
Может ли кто-нибудь помочь в настройке 3-го сценария? Спасибо.
Комментарии:
1. @Paulw11 Вы на 100% уверены в этом?
2. На самом деле, они добавили новый API — developer.apple.com/documentation/usernotifications/… Если пользователь удаляет уведомления до того, как ваше приложение вернется на передний план, они будут потеряны, но если они все еще находятся в Центре уведомлений, вы можете получить их таким образом. Доставка уведомлений не гарантируется, и вы не должны полагаться на них как на единственный способ обновить свое приложение
3. Я слышал, что он доступен только на ios 15. Но я обязательно это проверю. Спасибо
Ответ №1:
вам необходимо рассмотреть состояние приложения
Приложение UI.Государство
//AppDelegate
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
switch UIApplication.shared.applicationState {
case .active:
print("Received push message from APNs on Foreground")
case .background:
print("Received push message from APNs on Background")
case .inactive:
print("Received push message from APNs back to Foreground")
}
}
Когда приложение находится в фоновом режиме на переднем плане, UIApplication.State
является inactive
неактивный-это «Приложение работает на переднем плане, но не получает события».
поэтому я думаю, что лучший способ вести себя так, как вы хотите, — это написать его самостоятельно.
например,
//AppDelegate
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
switch UIApplication.shared.applicationState {
case .active:
print("Received push message from APNs on Foreground")
case .background:
print("Received push message from APNs on Background")
case .inactive:
print("Received push message from APNs back to Foreground")
guard let nav = window?.rootViewController as? UINavigationController,
let currentVC = nav.viewControllers.last else {return}
if currentVC is 'youWantViewController' { //if you want ViewController, use notification post
let name = Notification.Name(rawValue: K.Event.pushRequest)
NotificationCenter.default.post(name: name, object: nil)
} else { //move to you want ViewController
let vc = 'yourViewController'()
root.navigationController?.pushViewController(vc, animated: true)
}
}
completionHandler(.newData)
}
Я надеюсь, что это поможет.