次の方法で共有


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 は、1 つのビュー コントローラーを含む標準のストーリーボードです。 サンプル アプリ内では、ビュー コントローラーは NotificationViewController 型で、1 つの画像ビュー、3 つのボタン、1 つのスライダーが含まれています。 ストーリーボードは、これらのコントロールを、NotificationViewController.cs 内で定義されたハンドラーに関連付けます。

  • Launch App ボタン ハンドラーは、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");
            // ...
    
  • Dismiss Notification ボタン ハンドラーは、ExtensionContext 上で DismissNotificationContentExtension を呼び出して通知を閉じます。

    partial void HandleDismissNotificationButtonTap(UIButton sender)
    {
        ExtensionContext.DismissNotificationContentExtension();
    }
    
  • Remove Notification ボタン ハンドラーは、通知を閉じて通知センターから削除します。

    partial void HandleRemoveNotificationButtonTap(UIButton sender)
    {
        ExtensionContext.DismissNotificationContentExtension();
        UNUserNotificationCenter.Current.RemoveDeliveredNotifications(new string[] { notification.Request.Identifier });
    }
    
  • スライダー上での値の変更を処理するメソッドは、通知インターフェイス内に表示される画像のアルファを更新します。

    partial void HandleSliderValueChanged(UISlider sender)
    {
        Xamagon.Alpha = sender.Value;
    }