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