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;
    }