Xamarin.iOS 中的交互式通知用户界面
iOS 10 中引入的通知内容扩展可用于为通知创建自定义用户界面。 从 iOS 12 开始,通知用户界面可以包含交互式元素,例如按钮和滑块。
通知内容扩展 Info.plist 文件
在示例应用中,RedGreenNotificationsContentExtension 项目中的 Info.plist 文件包含以下配置:
<!-- ... -->
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>UNNotificationExtensionCategory</key>
<array>
<string>red-category</string>
<string>green-category</string>
</array>
<key>UNNotificationExtensionUserInteractionEnabled</key>
<true/>
<key>UNNotificationExtensionDefaultContentHidden</key>
<true/>
<key>UNNotificationExtensionInitialContentSizeRatio</key>
<real>0.6</real>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.content-extension</string>
<key></key>
<true/>
</dict>
<!-- ... -->
请注意以下功能:
UNNotificationExtensionCategory
数组指定内容扩展处理的通知类别的类型。- 为了支持交互式内容,通知内容扩展会将
UNNotificationExtensionUserInteractionEnabled
键设置为true
。 UNNotificationExtensionInitialContentSizeRatio
键指定内容扩展界面的初始高度/宽度比率。
交互式接口
MainInterface.storyboard 定义通知内容扩展的界面,是包含单个视图控制器的标准 storyboard。 在示例应用中,视图控制器的类型为 NotificationViewController
,它包含 1 个图像视图、3 个按钮和 1 个滑块。 storyboard 将这些控件与 NotificationViewController.cs 中定义的处理程序相关联:
“启动应用”按钮处理程序对
ExtensionContext
调用PerformNotificationDefaultAction
操作方法,这会启动应用:partial void HandleLaunchAppButtonTap(UIButton sender) { ExtensionContext.PerformNotificationDefaultAction(); }
在应用中,用户通知中心的
Delegate
(在示例应用中为AppDelegate
)可以响应DidReceiveNotificationResponse
方法中的交互:[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")] public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, System.Action completionHandler) { if (response.IsDefaultAction) { Console.WriteLine("ACTION: Default"); // ...
“消除通知”按钮处理程序对
ExtensionContext
调用DismissNotificationContentExtension
,这会关闭通知:partial void HandleDismissNotificationButtonTap(UIButton sender) { ExtensionContext.DismissNotificationContentExtension(); }
“删除通知”按钮处理程序会消除通知,并将其从通知中心删除:
partial void HandleRemoveNotificationButtonTap(UIButton sender) { ExtensionContext.DismissNotificationContentExtension(); UNUserNotificationCenter.Current.RemoveDeliveredNotifications(new string[] { notification.Request.Identifier }); }
处理滑块上的值更改的方法会更新通知界面中显示的图像的 alpha:
partial void HandleSliderValueChanged(UISlider sender) { Xamagon.Alpha = sender.Value; }