Открыть приложение из контекста насыщенного уведомления iOS12 - PullRequest
0 голосов
/ 23 июня 2019

У меня включено взаимодействие с пользователем при реализации UNNotificationContentExtension.Как открыть приложение после взаимодействия пользователя с UNNotificationContentExtension / ondemand?

Обратите внимание, что действие UNNotificationAction предназначено специально для заранее запрограммированного действия, например these .Я не могу использовать это, если, например, я хотел, чтобы результат действия .touchUpInside на UIButton открыл приложение.

1 Ответ

0 голосов
/ 23 июня 2019

Уволить: self.extensionContext?.dismissNotificationContentExtension()

Чтобы открыть приложение: self.extensionContext?.performNotificationDefaultAction()

(Я проверил это, и это сработало для меня. Действие dismiss не полностью отклонило уведомление, просто отклонило контекст. PerforNotificationDefaultAction отклонило уведомление и открыло приложение. По крайней мере для меня это не было очевидно из документы и взял меня немного, чтобы найти.)

В вашем расширении контента добавьте ниже опциональную функцию для UNNotificationContentExtension, чтобы отправить ответ на ваше приложение.

func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {

    switch response.actionIdentifier {
    case UNNotificationDismissActionIdentifier:
        // Clearest explanation from Microsoft: https://docs.microsoft.com/en-us/dotnet/api/UserNotificationsUI.UNNotificationContentExtensionResponseOption?view=xamarin-ios-sdk-12
        // Indicates that the notification interface will be dismissed, and that the content extension will handle the action.
        completion(.dismiss)
        // completion(.doNotDismiss)
    case UNNotificationDefaultActionIdentifier:
        // Default action stuff.
        // Let's say the user executed default action, we want to dismiss and forward the action to the app delegate.
        completion(.dismissAndForwardAction)
        break
    default:
        break
    }

Чтобы получить ответ, в делегате приложения реализуйте указанную ниже функцию протокола UNUserNotificationCenterDelegate. Вы можете использовать тот же оператор switch, что и выше.

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    // Received user info is given by response.notification.request.content.userInfo.
}

Мы можем прочитать userInfo и выполнить действие на основе этого в делегате. Но что, если это действие изменится в зависимости от взаимодействия пользователя в интерфейсе уведомлений? Например, содержание уведомления такое же, но пользователь нажал кнопку в вашем интерфейсе с надписью «Открыть URL», а не другую кнопку с надписью «Принять меры». Мы не можем открыть URL из интерфейса, поэтому мы должны каким-то образом перенаправить это действие (а не другое, стандартное действие) в приложение.

Я не уверен, как это сделать лучше всего [1]. Пожалуйста, прокомментируйте ниже, если у вас есть решение! В настоящее время я использую UIPasteboard, который позволяет делиться между различными приложениями на устройстве Apple. Это может быть одним из немногих решений, потому что ваше основное приложение и расширение содержимого уведомлений - это совершенно разные цели. Вот простые действия CRUD для Pasteboard.

let pasteboard = UIPasteboard.init(name: "myApp", create: true)
  • C: pasteboard?.setValue("actionToTake", forKey: "setNotificationAction")
  • R: pasteboard?.value(forKey: "setNotificationAction") as? String
  • U: такой же, как C
  • D: pasteboard?.setValue(nil, forKey: "setNotificationAction")

Установить в контекстном интерфейсе; читать в AppDelegate.

[1] Может быть облачным решением, но не идеально. Кроме того, UserDefaults не работает (следовательно, Pasteboard; пробовал UserDefaults).

...