Swift

# #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)
}
 

Я надеюсь, что это поможет.