通过Rich Notification iOS12上下文打开应用

时间:2019-06-22 21:30:04

标签: apple-push-notifications ios12 richpush

我在实现UNNotificationContentExtension时启用了用户交互。用户与UNNotificationContentExtension / ondemand完成交互后,如何打开应用程序?

请注意,UNNotificationAction专用于预先编程的操作,例如these。我不能使用它,例如,如果我想要对UIButton进行.touchUpInside操作的结果来打开应用程序。

1 个答案:

答案 0 :(得分:0)

要关闭:self.extensionContext?.dismissNotificationContentExtension()

要打开应用程序:self.extensionContext?.performNotificationDefaultAction()

(我对此进行了测试,并且对我有用。dismiss操作没有完全消除通知,只是消除了上下文。performNotificationDefaultAction消除了通知并打开了应用程序。至少对我而言,这从文档,花了我一些时间找到。)

在您的内容扩展程序中,为下面的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设备上的不同应用程序之间共享。这可能是少数解决方案之一,因为您的主应用程序和通知内容扩展名是完全不同的目标。这是Pasteboard的简单CRUD操作。

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不起作用(因此,粘贴板;尝试了UserDefaults)。