Активный случай приложения дескриптора удаленного уведомления iOS - PullRequest
0 голосов
/ 15 марта 2019

Я включил удаленное уведомление с фоновыми режимами.

, следовательно, мне нужно обработать случай, когда приложение находится на переднем плане, и уведомление приходит.Таким образом, только когда пользователь нажимает на Уведомление, он должен выполнять действие, подобное открытию другого представления.

Но в моем случае это происходит автоматически.

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("APNS didReceive with fetchCompletionHandler: \(userInfo)")

    switch application.applicationState {
    case .background, .inactive:
        PushNotificationManager.shared.handle(info: userInfo)
    case .active:
   // TODO THIS ACTION SHOULD ONLY TRIGGER WHEN USER TAP NOTIFICATION
        PushNotificationManager.shared.handle(info: userInfo)
    }
    completionHandler(.newData)
}

Как я могу сделать это возможным ???

ПРИМЕЧАНИЕ: НЕ ДУБЛИКАТВОПРОС, КАК ОНИ НЕ УКАЗЫЛИ ТОЧНО ЭТУ СИТУАЦИЮ

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

для меня этот метод вызывается ранее

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    completionHandler(.newData)
}

, потому что я не установил делегата UNUserNotificationCenter в AppDelegate.

UNUserNotificationCenter.current().delegate = self

Как @ Dimitris предложения, которые я добавил, называются

willPresent & didReceive Методы делегатов APNS (новые методы делегирования, представленные в iOS 10)

Следовательно, теперь я могу обрабатывать действия пользователя при нажатии на APNS, так как при нажатии он вызывает метод делегата didReceive.

0 голосов
/ 15 марта 2019

Метод, на который вы ссылаетесь, будет вызван при получении уведомления, когда приложение будет фоновым или передним.

Но это не тот случай, когда пользователь нажимает на уведомление.

Вам необходимо назначить делегата для UNUserNotificationCenter.current().delegate и затем реализовать этот метод - userNotificationCenter(_:didReceive:withCompletionHandler:)

class NotificationHandler: NSObject, UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        Logger.log("didReceive notification: \(response.notification.request.content.userInfo)")

        if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
            let userInfo = response.notification.request.content.userInfo
            // Process the user info —
        }

        completionHandler()
    }
}
// In `application(_ application:,didFinishLaunchingWithOptions:)`
// Note this is for clarity - you'd need to keep a strong reference to the NotificationHandler() or will get deallocated immediately.
UNUserNotificationCenter.current().delegate = NotificationHandler()
...