Открыть приложение из контекста насыщенного уведомления iOS12
У меня включено взаимодействие с пользователем при реализации UNNotificationContentExtension. Как открыть приложение, когда пользователь завершит взаимодействие с UNNotificationContentExtension / ondemand?
Обратите внимание, что действие UNNotificationAction предназначено специально для заранее запрограммированных действий, таких как эти. Я не могу использовать это, если, например, я хотел, чтобы результат действия.touchUpInside на UIButton открыл приложение.
1 ответ
Уволить: self.extensionContext?.dismissNotificationContentExtension()
Чтобы открыть приложение: self.extensionContext?.performNotificationDefaultAction()
(Я проверил это, и это сработало для меня. Действие "отклонить" не полностью отклонило уведомление, просто отклонило контекст. Акция executeNotificationDefaultAction отклонила уведомление и открыла приложение. По крайней мере для меня это было неочевидно из документов и меня немного найти.)
В своем расширении контента реализуйте дополнительную функцию для 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")
- Р:
pasteboard?.value(forKey: "setNotificationAction") as? String
- U: такой же, как C
- D:
pasteboard?.setValue(nil, forKey: "setNotificationAction")
Установить в контекстном интерфейсе; читать в AppDelegate.
[1] Может быть облачным решением, но не идеальным. Кроме того, UserDefaults не работает (следовательно, Pasteboard; пробовал UserDefaults).