从丰富通知的上下文中打开应用 iOS12
Open App from Context of Rich Notification iOS12
我在 UNNotificationContentExtension 的实现中启用了用户交互。用户完成与 UNNotificationContentExtension / ondemand 的交互后,如何打开应用程序?
请注意,UNNotificationAction 是专门针对预编程操作的,例如these。我不能使用它,例如,如果我想要 UIButton 上的 .touchUpInside 操作的结果来打开应用程序。
解雇:self.extensionContext?.dismissNotificationContentExtension()
打开应用程序:self.extensionContext?.performNotificationDefaultAction()
(我对此进行了测试,这对我有用。关闭操作并没有完全关闭通知,只是关闭了上下文。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 并根据委托中的信息采取行动。但是,如果该操作根据用户在通知界面中的交互而改变怎么办?例如,通知的内容是相同的,但用户按下了您界面中显示 "Open URL" 的按钮,而不是显示 "Take Action." 的另一个按钮 我们无法从中打开 URL接口,因此我们必须以某种方式将此操作(而不是其他标准操作)转发给应用程序。
我不确定如何做到最好 [1]。有解决办法请在下方留言!我目前正在使用 UIPasteboard,它允许在 Apple 设备上的不同应用程序之间共享。这可能是为数不多的解决方案之一,因为您的主应用程序和通知内容扩展是完全不同的目标。以下是粘贴板的简单 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)。
我在 UNNotificationContentExtension 的实现中启用了用户交互。用户完成与 UNNotificationContentExtension / ondemand 的交互后,如何打开应用程序?
请注意,UNNotificationAction 是专门针对预编程操作的,例如these。我不能使用它,例如,如果我想要 UIButton 上的 .touchUpInside 操作的结果来打开应用程序。
解雇:self.extensionContext?.dismissNotificationContentExtension()
打开应用程序:self.extensionContext?.performNotificationDefaultAction()
(我对此进行了测试,这对我有用。关闭操作并没有完全关闭通知,只是关闭了上下文。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 并根据委托中的信息采取行动。但是,如果该操作根据用户在通知界面中的交互而改变怎么办?例如,通知的内容是相同的,但用户按下了您界面中显示 "Open URL" 的按钮,而不是显示 "Take Action." 的另一个按钮 我们无法从中打开 URL接口,因此我们必须以某种方式将此操作(而不是其他标准操作)转发给应用程序。
我不确定如何做到最好 [1]。有解决办法请在下方留言!我目前正在使用 UIPasteboard,它允许在 Apple 设备上的不同应用程序之间共享。这可能是为数不多的解决方案之一,因为您的主应用程序和通知内容扩展是完全不同的目标。以下是粘贴板的简单 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)。