通話のプッシュ通知を有効にする
プッシュ通知は、アプリケーションからユーザーのデバイスに情報を送信します。 プッシュ通知を使って、ダイアログを表示したり、音を鳴らしたり、アプリの UI レイヤーへの着信を表示したりできます。
この記事では、Azure Communication Services の通話に対してプッシュ通知を有効にする方法を説明します。 Communication Services で提供される Azure Event Grid や Azure Notification Hubs との統合を通じて、アプリにプッシュ通知を追加できます。
TTL トークンの概要
Time to Live (TTL) トークンは、通知トークンが無効になるまでの有効期間の長さを決める設定です。 この設定は、ユーザー エンゲージメントが毎日の操作を必要とせず、より長い期間にわたって重要なままであるアプリケーションに役立ちます。
TTL の構成を使って、プッシュ通知のライフ サイクルを管理できます。 それにより、頻繁にトークンを更新する必要がなくなり、アプリケーションとそのユーザー間の通信チャネルが長期間開いたままになり信頼性が維持されます。
現在、TTL の最大値は 180 日 (15,552,000 秒) で、最小値は 5 分 (300 秒) です。 この値を入力し、ニーズに合わせて調整できます。 値を指定しない場合、既定値は 24 時間 (86,400 秒) です。
Register Push Notification API が呼び出されると、デバイスのトークン情報がレジストラーに保存されます。 TTL 期間が終了すると、デバイスのエンドポイント情報は削除されます。 そのデバイスで Register Push Notification API を再度呼び出さない場合、デバイスへの着信をデバイスに配信できません。
ID を取り消す場合は、こちらのプロセスに従って行います。 ID が取り消された後、レジストラー エントリを削除する必要があります。
Note
Microsoft Teams ユーザーの場合、TTL の最大値は 24 時間 (86,400 秒) です。 この値を増やす方法はありません。 24 時間ごとにバックグラウンドでアプリケーションを起動して、デバイスのトークンを登録する必要があります。
アプリケーションを起動し、新しいトークンをフェッチして登録を実行するには、iOS プラットフォームの手順または Android プラットフォームの手順に従って行います。
前提条件
アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
デプロイ済みの Communication Services リソース。 Communication Services リソースを作成します。
通話クライアントを有効にするためのユーザー アクセス トークン。 詳細については、アクセス トークンの作成と管理に関する記事を参照してください。
省略可能: アプリケーションに音声通話を追加するためにクイックスタートを完了する。
クイックスタートに従う
Azure Communication Services Web Calling SDK を使用した Web プッシュ通知はプレビュー段階であり、バージョン 1.12.0-beta.2 以降の一部として利用できます。
重要
Azure Communication Services のこの機能は、現在プレビュー段階にあります。
プレビューの API と SDK は、サービス レベル アグリーメントなしに提供されます。 運用環境のワークロードには使用しないことをお勧めします。 一部の機能はサポート対象ではなく、機能が制限されることがあります。
詳細については、「Microsoft Azure プレビューの追加利用規約」を確認してください。
詳しい手順については、GitHub のクイックスタートを参照してください。
Firebase Cloud Messaging (FCM) が有効にされ、FCM サービスが Azure Notification Hubs インスタンスに接続されている Firebase アカウント。 詳細については、「Communication Services の通知」を参照してください。
アプリケーションをビルドするための Android Studio バージョン 3.6 以降。
Android アプリケーションが FCM からの通知メッセージを受信できるようにするための一連のアクセス許可。
AndroidManifest.xml
ファイルで、<manifest ...>
の直後または</application>
タグの下に、次のアクセス許可を追加します。<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
重要
2023 年 6 月 20 日に、Google は FCM レガシ API を使用したメッセージの送信を非推奨にすること、そして 2024 年 6 月にサービスからのレガシ FCM の削除を開始することを発表しました。 Google では、従来の FCM API から FCM HTTP v1 への移行を推奨しています。
Communication Services リソースで FCM レガシ API がまだ使われている場合は、こちらの移行ガイドに従ってください。
モバイル プッシュ通知に関する考慮事項
モバイル プッシュ通知は、モバイル デバイスに表示されるポップアップ通知です。 通話については、この記事ではボイス オーバー IP (VoIP) プッシュ通知に焦点を当てます。
Note
アプリケーションで、プッシュ通知に登録するときと、Teams ユーザーに対する着信プッシュ通知を処理するときは、同じ API を使います。 この記事で説明する API は、CommonCallAgent
または TeamsCallAgent
クラスで呼び出すこともできます。
SDK のインストール
プロジェクト レベルの build.gradle
ファイルを見つけて、buildscript
と allprojects
の下のリポジトリの一覧に mavenCentral()
を追加します。
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
次に、モジュール レベルの build.gradle
ファイルで、次の行を dependencies
セクションに追加します。
dependencies {
...
implementation 'com.azure.android:azure-communication-calling:1.0.0'
...
}
必要なオブジェクトを初期化する
CallAgent
インスタンスを作成するには、CallClient
インスタンス上で createCallAgent
メソッドを呼び出す必要があります。 この呼び出しは、CallAgent
インスタンス オブジェクトを非同期に返します。
createCallAgent
メソッドは、アクセス トークンをカプセル化する CommunicationUserCredential
を引数として受け取ります。
DeviceManager
にアクセスするには、まず callAgent
インスタンスを作成する必要があります。 それから、CallClient.getDeviceManager
メソッドを使用して DeviceManager
を取得することができます。
String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
呼び出し元の表示名を設定するには、この代替メソッドを使用します。
String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();
プッシュ通知に登録する
アプリケーションでプッシュ通知に登録するには、デバイス登録トークンを使って CallAgent
インスタンスで registerPushNotification()
を呼び出す必要があります。
デバイス登録トークンを取得するには、アプリケーション モジュールの build.gradle
ファイルの dependencies
セクションに次の行を追加して、Firebase SDK をファイルに追加します (行がまだ存在しない場合)。
// Add the SDK for Firebase Cloud Messaging
implementation 'com.google.firebase:firebase-core:16.0.8'
implementation 'com.google.firebase:firebase-messaging:20.2.4'
プロジェクト レベルの build.gradle
ファイルの dependencies
セクションに次の行がまだない場合は追加します。
classpath 'com.google.gms:google-services:4.3.3'
ファイルの先頭に次のプラグインがまだない場合は追加します。
apply plugin: 'com.google.gms.google-services'
ツール バーの [今すぐ同期] を選びます。 Firebase Cloud Messaging SDK がクライアント アプリケーション インスタンス用に生成したデバイス登録トークンを取得するには、次のコード スニペットを追加します。 トークンを取得するには、インスタンスのメイン アクティビティのヘッダーに、次の import を必ず追加してください。
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;
トークンを取得するには、このスニペットを追加します。
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (!task.isSuccessful()) {
Log.w("PushNotification", "getInstanceId failed", task.getException());
return;
}
// Get the new instance ID token
String deviceToken = task.getResult().getToken();
// Log
Log.d("PushNotification", "Device Registration token retrieved successfully");
}
});
着信通話プッシュ通知用の通話サービス SDKに、デバイス登録トークンを登録します。
String deviceRegistrationToken = "<Device Token from previous section>";
try {
callAgent.registerPushNotification(deviceRegistrationToken).get();
}
catch(Exception e) {
System.out.println("Something went wrong while registering for Incoming Calls Push Notifications.")
}
プッシュ通知を処理する
着信通話のプッシュ通知を受信するには、ペイロードを使用して CallAgent
インスタンスで handlePushNotification()
を呼び出します。
Firebase Cloud Messaging からペイロードを取得するには、最初に FirebaseMessagingService
Firebase SDK クラスを拡張して onMessageReceived
メソッドをオーバーライドする新しいサービスを作成します ([ファイル]>[新規]>[サービス]>[サービス] を選びます)。 このメソッドはイベント ハンドラーであり、Firebase Cloud Messaging がアプリケーションにプッシュ通知を配信すると呼び出されます。
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private java.util.Map<String, String> pushNotificationMessageDataFromFCM;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// Check if the message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d("PushNotification", "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
else {
pushNotificationMessageDataFromFCM = remoteMessage.getData();
}
}
}
次のサービス定義を AndroidManifest.xml
ファイルの <application>
タグ内に追加します。
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
ペイロードを取得したら、それを Communication Services SDK に渡して、内部 IncomingCallInformation
オブジェクトに解析できます。 このオブジェクトは、CallAgent
インスタンスでの handlePushNotification
メソッドの呼び出しを処理します。 CallAgent
インスタンスを作成するには、CallClient
クラスで createCallAgent(...)
メソッドを呼び出します。
try {
IncomingCallInformation notification = IncomingCallInformation.fromMap(pushNotificationMessageDataFromFCM);
Future handlePushNotificationFuture = callAgent.handlePushNotification(notification).get();
}
catch(Exception e) {
System.out.println("Something went wrong while handling the Incoming Calls Push Notifications.");
}
プッシュ通知メッセージの処理が成功し、すべてのイベント ハンドラーが適切に登録されると、アプリケーションによって発信されます。
プッシュ通知の登録を解除する
アプリケーションでは、プッシュ通知の登録をいつでも解除できます。 登録を解除するには、callAgent
で unregisterPushNotification()
メソッドを呼び出します。
try {
callAgent.unregisterPushNotification().get();
}
catch(Exception e) {
System.out.println("Something went wrong while un-registering for all Incoming Calls Push Notifications.")
}
着信の内部プッシュ通知を無効にする
着信のプッシュ ペイロードは、2 つの方法で呼び出し先に配信できます。
- FCM を使い、前に説明した API (
CallAgent
またはTeamsCallAgent
のregisterPushNotification
) でデバイス トークンを登録します - プッシュ ペイロードを配信するための
CallAgent
またはTeamsCallAgent
を作成するときに、SDK を内部サービスに登録します
CallAgentOptions
または TeamsCallAgentOptions
のプロパティ setDisableInternalPushForIncomingCall
を使うと、内部プッシュ サービスによるプッシュ ペイロードの配信を無効にするよう SDK に指示できます。
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisableInternalPushForIncomingCall(true);
モバイル プッシュ通知に関する考慮事項
モバイル プッシュ通知は、モバイル デバイスに表示されるポップアップ通知です。 通話については、この記事ではボイス オーバー IP (VoIP) プッシュ通知に焦点を当てます。 iOS アプリケーションでの CallKit の統合に関するガイドについては、「CallKit との統合」をご覧ください。
Note
アプリケーションで、プッシュ通知に登録するときと、Teams ユーザーに対する着信プッシュ通知を処理するときは、同じ API を使います。 この記事で説明する API は、CommonCallAgent
または TeamsCallAgent
クラスで呼び出すこともできます。
システムを設定する
次の手順のようにして、システムを設定します。
Xcode プロジェクトを作成する
Xcode で、新しい iOS プロジェクトを作成し、[単一ビュー アプリ] テンプレートを選択します。 この記事では SwiftUI フレームワークを使うので、[言語] を [Swift] に、[インターフェイス] を [SwiftUI] に設定する必要があります。
この記事では、テストは作成しません。 [Include Tests] チェック ボックスはオフにしてもかまいません。
CocoaPods を使用してパッケージと依存関係をインストールする
この例のように、アプリケーション用の Podfile を作成します。
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
pod install
を実行します。Xcode を使用して
.xcworkspace
を開きます。
マイクへのアクセスを要求する
デバイスのマイクにアクセスするには、NSMicrophoneUsageDescription
を使用してアプリの情報プロパティ一覧を更新する必要があります。 関連付けられる値には、システムがユーザーにアクセスを要求するために使うダイアログに含まれる文字列を設定します。
プロジェクト ツリーの [Info.plist] エントリを右クリックし、[Open As]>[Source Code] を選択します。 最上位の <dict>
セクションに以下の行を追加してから、ファイルを保存します。
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>
アプリのフレームワークを設定する
プロジェクトの ContentView.swift
ファイルを開きます。 ファイルの先頭に import
宣言を追加して、AzureCommunicationCalling
ライブラリをインポートします。 さらに、AVFoundation
をインポートします。 これは、コードでのオーディオ アクセス許可の要求に必要です。
import AzureCommunicationCalling
import AVFoundation
CallAgent を初期化する
CallClient
から CallAgent
インスタンスを作成するには、初期化された後に CallAgent
オブジェクトを非同期に返す callClient.createCallAgent
メソッドを使用する必要があります。
通話クライアントを作成するには、CommunicationTokenCredential
オブジェクトを渡します。
import AzureCommunication
let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
updates("Couldn't created Credential object", false)
initializationDispatchGroup!.leave()
return
}
// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
let newToken = self.tokenProvider!.fetchNewToken()
onCompletion(newToken, nil)
}
作成した CommunicationTokenCredential
オブジェクトを CallClient
に渡し、表示名を設定します。
self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"
self.callClient!.createCallAgent(userCredential: userCredential!,
options: callAgentOptions) { (callAgent, error) in
if error == nil {
print("Create agent succeeded")
self.callAgent = callAgent
} else {
print("Create agent failed")
}
})
プッシュ通知の設定
プッシュ通知の登録、処理、登録解除のタスクを始める前に、次のセットアップ タスクを完了します。
- Xcode で、[Signing & Capabilities]\(署名と機能\) に移動します。 [+ Capability]\(+ 機能\) を選択して機能を追加してから、[プッシュ通知] を選択します。
- [+ Capability]\(+ 機能\) を選択して別の機能を追加してから、[バックグラウンド モード] を選びます。
- [バックグラウンド モード] で、[ボイス オーバー IP] と [リモート通知] のチェックボックスをオンにします。
プッシュ通知に登録する
プッシュ通知に登録するには、デバイス登録トークンを使って CallAgent
インスタンスで registerPushNotification()
を呼び出します。
プッシュ通知への登録は、初期化が正常に完了した後に行われる必要があります。 callAgent
オブジェクトが破棄されると、logout
が呼び出されて、プッシュ通知の登録が自動的に解除されます。
let deviceToken: Data = pushRegistry?.pushToken(for: PKPushType.voIP)
callAgent.registerPushNotifications(deviceToken: deviceToken!) { (error) in
if(error == nil) {
print("Successfully registered to push notification.")
} else {
print("Failed to register push notification.")
}
}
プッシュ通知を処理する
着信のプッシュ通知を受け取るには、ディクショナリ ペイロードを設定して CallAgent
インスタンスで handlePushNotification()
を呼び出します。
let callNotification = PushNotificationInfo.fromDictionary(pushPayload.dictionaryPayload)
callAgent.handlePush(notification: callNotification) { (error) in
if (error == nil) {
print("Handling of push notification was successful")
} else {
print("Handling of push notification failed")
}
}
プッシュ通知の登録を解除する
アプリケーションでは、プッシュ通知の登録をいつでも解除できます。 登録を解除するには、CallAgent
で unregisterPushNotification
メソッドを呼び出します。
Note
ログアウト時に、プッシュ通知からアプリケーションの登録が自動的に解除されることはありません。
callAgent.unregisterPushNotification { (error) in
if (error == nil) {
print("Unregister of push notification was successful")
} else {
print("Unregister of push notification failed, please try again")
}
}
着信の内部プッシュ通知を無効にする
着信のプッシュ ペイロードは、2 つの方法で呼び出し先に配信できます。
- Apple Push Notification Service (APNS) を使い、前に説明した API (
CallAgent
またはTeamsCallAgent
のregisterPushNotification
) でデバイス トークンを登録します - プッシュ ペイロードを配信するための
CallAgent
またはTeamsCallAgent
を作成するときに、SDK を内部サービスに登録します
CallAgentOptions
または TeamsCallAgentOptions
のプロパティ disableInternalPushForIncomingCall
を使うと、内部プッシュ サービスによるプッシュ ペイロードの配信を無効にするよう SDK に指示できます。
let options = CallAgentOptions()
options.disableInternalPushForIncomingCall = true
Windows プッシュ通知に関する考慮事項
モバイル プッシュ通知は、モバイル デバイスに表示されるポップアップ通知です。 通話については、この記事ではボイス オーバー IP (VoIP) プッシュ通知に焦点を当てます。
Windows プラットフォームでのプッシュ通知は、Windows プッシュ通知サービス (WNS) を使って配信されます。
Note
アプリケーションで、プッシュ通知に登録するときと、カスタム Teams エンドポイント (CTE) に対するプッシュ通知を処理するときは、同じ API を使います。 この記事で説明する API は、CTE の CommonCallAgent
または TeamsCallAgent
クラスで呼び出すこともできます。
システムを設定する
次の手順のようにして、システムを設定します。
Visual Studio プロジェクトの作成
ユニバーサル Windows プラットフォーム アプリの場合は、Visual Studio 2022 で、新しい空のアプリ (ユニバーサル Windows) プロジェクトを作成します。 プロジェクト名を入力した後、10.0.17763.0 より後の Windows SDK を自由に選択できます。
WinUI 3 アプリの場合、Blank App, Packaged (WinUI 3 in Desktop) テンプレートで新しいプロジェクトを作成し、シングルページの WinUI 3 アプリを設定します。 Windows App SDK バージョン 1.3 以降が必要です。
NuGet パッケージ マネージャーを使用してパッケージと依存関係をインストールする
Calling SDK の API とライブラリは、NuGet パッケージにより一般公開されています。
Calling SDK NuGet パッケージを検索、ダウンロード、インストールするには:
- [ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理] を選んで、NuGet パッケージ マネージャーを開きます。
- [参照] を選んでから、検索ボックスに「Azure.Communication.Calling.WindowsClient」と入力します。
- [プレリリースを含める] チェックボックスがオンになっていることを確認します。
- Azure.Communication.Calling.WindowsClient パッケージを選び、Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 以降のバージョンを選びます。
- 右側のペインで、Azure Communication Services プロジェクトに対応するチェックボックスをオンにします。
- [インストール] を選択します。
プッシュ通知の設定
着信の応答または拒否を行うための Windows 通知の登録、処理、表示のタスクを始める前に、次のセットアップ タスクを完了します。
「チュートリアル: Azure Notification Hubs を使用してユニバーサル Windows プラットフォーム アプリに通知を送信する」に従います。 このチュートリアルのとおりにすると、次のものが作成されます。
WindowsAzure.Messaging.Managed
パッケージとMicrosoft.Toolkit.Uwp.Notifications
パッケージを含むアプリケーション。- Azure Notification Hub のハブ名 (この記事では
<AZURE_PNH_HUB_NAME>
として参照) と Azure Notification Hub の接続文字列 (<AZURE_PNH_HUB_CONNECTION_STRING>
として参照)。
すべてのアプリケーション初期化で WNS チャネルに登録するには、
App.xaml.cs
ファイルに初期化コードを追加します。// App.xaml.cs protected override async void OnLaunched(LaunchActivatedEventArgs e) { await InitNotificationsAsync(); ... } private async Task InitNotificationsAsync() { if (AZURE_PNH_HUB_NAME != "<AZURE_PNH_HUB_NAME>" && AZURE_PNH_HUB_CONNECTION_STRING != "<AZURE_PNH_HUB_CONNECTION_STRING>") { var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); channel.PushNotificationReceived += Channel_PushNotificationReceived; var hub = new NotificationHub(AZURE_PNH_HUB_NAME, AZURE_PNH_HUB_CONNECTION_STRING); var result = await hub.RegisterNativeAsync(channel.Uri); if (result.ChannelUri != null) { PNHChannelUri = new Uri(result.ChannelUri); } else { Debug.WriteLine("Cannot register WNS channel"); } } }
新しいプッシュ通知メッセージが
App.xaml.cs
に届くとアクティブ化されるイベント ハンドラーを登録します。// App.xaml.cs private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) { switch (args.NotificationType) { case PushNotificationType.Toast: case PushNotificationType.Tile: case PushNotificationType.TileFlyout: case PushNotificationType.Badge: break; case PushNotificationType.Raw: var frame = (Frame)Window.Current.Content; if (frame.Content is MainPage) { var mainPage = frame.Content as MainPage; await mainPage.HandlePushNotificationIncomingCallAsync(args.RawNotification.Content); } break; } }
プッシュ通知に登録する
プッシュ通知に登録するには、アプリケーションの初期化で取得される WNS 登録チャンネルを使って、CallAgent
インスタンスで RegisterForPushNotificationAsync()
を呼び出します。
プッシュ通知への登録は、初期化が正常に完了した後に行われる必要があります。
// MainPage.xaml.cs
this.callAgent = await this.callClient.CreateCallAgentAsync(tokenCredential, callAgentOptions);
if ((Application.Current as App).PNHChannelUri != null)
{
await this.callAgent.RegisterForPushNotificationAsync((Application.Current as App).PNHChannelUri.ToString());
}
this.callAgent.CallsUpdated += OnCallsUpdatedAsync;
this.callAgent.IncomingCallReceived += OnIncomingCallAsync;
プッシュ通知を処理する
着信のプッシュ通知を受け取るには、ディクショナリ ペイロードを設定して CallAgent
インスタンスで handlePushNotification()
を呼び出します。
// MainPage.xaml.cs
public async Task HandlePushNotificationIncomingCallAsync(string notificationContent)
{
if (this.callAgent != null)
{
PushNotificationDetails pnDetails = PushNotificationDetails.Parse(notificationContent);
await callAgent.HandlePushNotificationAsync(pnDetails);
}
}
この呼び出しにより、着信通知を示す着信イベントが CallAgent
でトリガーされます。
// MainPage.xaml.cs
private async void OnIncomingCallAsync(object sender, IncomingCallReceivedEventArgs args)
{
incomingCall = args.IncomingCall;
(Application.Current as App).ShowIncomingCallNotification(incomingCall);
}
// App.xaml.cs
public void ShowIncomingCallNotification(IncomingCall incomingCall)
{
string incomingCallType = incomingCall.IsVideoEnabled ? "Video" : "Audio";
string caller = incomingCall.CallerDetails.DisplayName != "" ? incomingCall.CallerDetails.DisplayName : incomingCall.CallerDetails.Identifier.RawId;
new ToastContentBuilder()
.SetToastScenario(ToastScenario.IncomingCall)
.AddText(caller + " is calling you.")
.AddText("New Incoming " + incomingCallType + " Call")
.AddButton(new ToastButton()
.SetContent("Decline")
.AddArgument("action", "decline"))
.AddButton(new ToastButton()
.SetContent("Accept")
.AddArgument("action", "accept"))
.Show();
}
通知に対するボタン押下を処理するコードを OnActivated
メソッドに追加します。
// App.xaml.cs
protected override async void OnActivated(IActivatedEventArgs e)
{
// Handle notification activation
if (e is ToastNotificationActivatedEventArgs toastActivationArgs)
{
ToastArguments args = ToastArguments.Parse(toastActivationArgs.Argument);
string action = args?.Get("action");
if (!string.IsNullOrEmpty(action))
{
var frame = Window.Current.Content as Frame;
if (frame.Content is MainPage)
{
var mainPage = frame.Content as MainPage;
await mainPage.AnswerIncomingCall(action);
}
}
}
}
// MainPage.xaml.cs
public async Task AnswerIncomingCall(string action)
{
if (action == "accept")
{
var acceptCallOptions = new AcceptCallOptions()
{
IncomingVideoOptions = new IncomingVideoOptions()
{
StreamKind = VideoStreamKind.RemoteIncoming
}
};
call = await incomingCall?.AcceptAsync(acceptCallOptions);
call.StateChanged += OnStateChangedAsync;
call.RemoteParticipantsUpdated += OnRemoteParticipantsUpdatedAsync;
}
else if (action == "decline")
{
await incomingCall?.RejectAsync();
}
}