通話のプッシュ通知を有効にする

こちらでは、Azure Communication Services の通話に対してプッシュ通知を有効にする方法を説明します。 プッシュ通知を設定すると、ユーザーは着信があったことを知り、応答できるようになります。

プッシュ通知

プッシュ通知を使用すると、アプリケーションからユーザーのデバイスに情報を送信できます。 プッシュ通知を使用すると、ダイアログを表示したり、音を鳴らしたり、アプリの UI レイヤーに着信を表示したりすることができます。 Azure Communication Services は Azure Event Grid および Azure Notification Hubs と統合されます。これにより、アプリにプッシュ通知を追加することができます。

TTL トークン

Time To Live (TTL) トークンは、通知トークンが無効になるまでの有効期間を決定する設定です。 この設定は、ユーザー エンゲージメントが毎日の操作を必要とせず、より長い期間にわたって重要なままであるアプリケーションに役立ちます。

TTL 構成を使用すると、プッシュ通知のライフサイクルを管理できるため、頻繁にトークンを更新する必要がなくなり、アプリケーションとそのユーザー間の通信チャネルが長期間開いたままになり信頼性が維持されます。

現在、TTL の最大値は 180 日 (15,552,000 秒) で、最小値は 5 分 (300 秒) です。 この値を入力し、ニーズに応じて調整できます。 値を指定しない場合、既定値は 24 時間 (86,400 秒) です。

レジスタ プッシュ通知 API が呼び出されると、デバイス トークン情報がレジストラーに保存されます。 TTL の有効期限が終了すると、デバイス エンドポイント情報は削除されます。 デバイス上の着信は、これらのデバイスがレジスタ プッシュ通知 API を再度呼び出さない場合にはデバイスに配信できません。

ID を取り消す場合は、このプロセスに従う必要があります。ID が取り消されたら、レジストラー エントリを削除する必要があります。

Note

CTE (カスタム Teams エンドポイント) の場合、最大 TTL 値は 24 時間 (86,400 秒) です。この値を増やす方法はありません。

前提条件

Azure Communication Services Web Calling SDK - Web プッシュ通知のクイックスタート

重要

Azure Communication Services のこの機能は、現在プレビュー段階にあります。

プレビューの API と SDK は、サービス レベル アグリーメントなしに提供されます。 運用環境のワークロードには使用しないことをお勧めします。 一部の機能はサポート対象ではなく、機能が制限されることがあります。

詳細については、「Microsoft Azure プレビューの追加利用規約」を確認してください。

Azure Communication Services Web Calling SDK - Web プッシュ通知はパブリック プレビュー段階にあり、バージョン 1.12.0-beta.2 以降の一部として利用できます。

Web プッシュ通知のクイック スタート チュートリアルを参照してください: https://github.com/Azure-Samples/communication-services-javascript-quickstarts/blob/main/calling-web-push-notifications/README.md

SDK のインストール

プロジェクトレベルの build.gradle ファイルを見つけて、buildscriptallprojects の下にあるリポジトリの一覧に「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();

プッシュ通知の追加の前提条件

Cloud Messaging (FCM) が有効になっている Firebase アカウントが設定されており、Firebase Cloud Messaging サービスが Azure Notification Hubs インスタンスに接続されているものとします。 詳細については、「Communication Services の通知」を参照してください。 また、このチュートリアルでは、Android Studio バージョン 3.6 以降を使用してアプリケーションがビルドされているものとします。

Firebase Cloud Messaging から通知メッセージを受信するには、Android アプリケーションに対する一連のアクセス許可が必要です。 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" />

概要

モバイル プッシュ通知は、モバイル デバイスに表示されるポップアップ通知です。 通話に関しては、VoIP (ボイス オーバー IP 通話) でのプッシュ通知に焦点を絞ります。 プッシュ通知の登録を行い、プッシュ通知を処理してから、プッシュ通知を登録解除します。

Note

プッシュ通知に登録し、カスタム Teams エンドポイント (CTE) のプッシュ通知の処理を行う場合、API は同じです。 以下で説明する API は、カスタム Teams エンドポイント (CTE) の CommonCallAgent または TeamsCallAgent クラスでも呼び出すことができます。

プッシュ通知に登録する

プッシュ通知を登録するには、アプリケーションは、デバイス登録トークンを使用して CallAgent インスタンスの registerPushNotification() を呼び出す必要があります。

デバイス登録トークンを取得するには、Firebase SDK がまだ存在しない場合は、 dependencies セクションに次の行を追加して、アプリケーション モジュールの build.gradle ファイルに追加します:

// 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 で生成されたデバイス登録トークンを取得します。メイン Activity のヘッダーには、インスタンス用に下の 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 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 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>
  • ペイロードを取得したら、CallAgent インスタンスで handlePushNotification メソッドを呼び出すことによって処理されるように、Communication Services の SDK にそれを渡して内部 IncomingCallInformation オブジェクトに解析することができます。 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.")
}

システムを設定する

Xcode プロジェクトを作成する

Xcode で、新しい iOS プロジェクトを作成し、[単一ビュー アプリ] テンプレートを選択します。 このクイックスタートでは SwiftUI フレームワークを使用します。そのため、[Language]Swift に、[Interface]SwiftUI に設定する必要があります。

このクイックスタートでは、テストは作成しません。 [Include Tests] チェック ボックスはオフにしてもかまいません。

Xcode 内にプロジェクトを作成するためのウィンドウを示すスクリーンショット。

CocoaPods を使用してパッケージと依存関係をインストールする

  1. この例のように、アプリケーション用の Podfile を作成します。

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. pod install を実行します。

  3. 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")
        }
})

概要

モバイル プッシュ通知は、モバイル デバイスに表示されるポップアップ通知です。 通話に関しては、VoIP (ボイス オーバー IP 通話) でのプッシュ通知に焦点を絞ります。 プッシュ通知の登録を行い、プッシュ通知を処理してから、プッシュ通知を登録解除します。 iOS アプリケーションでの CallKit 統合に関するガイドについては、CallKit と iOS ACS SDK の統合に関する記事を参照してください。

Note

プッシュ通知に登録し、カスタム Teams エンドポイント (CTE) のプッシュ通知の処理を行う場合、API は同じです。 説明する API は、カスタム Teams エンドポイント (CTE) の CommonCallAgent または TeamsCallAgent クラスでも呼び出すことができます。

プッシュ通知の設定

モバイル プッシュ通知は、モバイル デバイスで受け取るポップアップ通知です。 通話に関しては、VoIP (ボイス オーバー IP) でのプッシュ通知に焦点を絞ります。

以下のセクションでは、プッシュ通知の登録、処理、および登録解除を行う方法について説明します。 これらの作業を開始する前に、次の前提条件を満たす必要があります。

  1. Xcode で、[Signing & Capabilities]\(署名と機能\) に移動します。 [+ Capability]\(+ 機能\) を選択して機能を追加してから、[プッシュ通知] を選択します。
  2. [+ Capability]\(+ 機能\) を選択して別の機能を追加してから、[バックグラウンド モード] を選びます。
  3. [バックグラウンド モード] で、[ボイス オーバー IP][リモート通知] のチェックボックスをオンにします。

Xcode での機能の追加方法を示すスクリーンショット。

プッシュ通知に登録する

プッシュ通知に登録するには、デバイス登録トークンを使用して 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")
    }
}

プッシュ通知の登録を解除する

アプリケーションでは、プッシュ通知の登録をいつでも解除できます。 CallAgentunregisterPushNotification メソッドを呼び出すだけです。

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")
    }
}

システムを設定する

Visual Studio プロジェクトの作成

UWP アプリの場合、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 パッケージを検索、ダウンロード、インストールする方法の例を示します。

  1. [ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理] を選んで、NuGet パッケージ マネージャーを開きます。
  2. [参照] を選び、検索ボックスに「Azure.Communication.Calling.WindowsClient」と入力します。
  3. [プレリリースを含める] チェック ボックスがオンになっていることを確認します。
  4. Azure.Communication.Calling.WindowsClient パッケージを選んでから、Azure.Communication.Calling.WindowsClient1.4.0-beta.1 以降のバージョンを選びます。
  5. 右側のタブで、Communication Services プロジェクトに対応するチェック ボックスをオンにします。
  6. [インストール] ボタンを選択します。

概要

Windows プラットフォーム上のプッシュ通知は、Windows Push Notification Service (WNS), を使用して配信されます。

Note

プッシュ通知に登録し、カスタム Teams エンドポイント (CTE) のプッシュ通知の処理を行う場合、API は同じです。 以下で説明する API は、カスタム Teams エンドポイント (CTE) の CommonCallAgent または TeamsCallAgent クラスでも呼び出すことができます。

プッシュ通知の設定

プッシュ通知は、お使いのデバイスで受け取るポップアップ通知です。 通話に関しては、VoIP (ボイス オーバー IP) でのプッシュ通知に焦点を絞ります。

次のセクションでは、着信通話に応答または拒否するため、Windows 通知を登録、処理、表示する方法について説明します。 これらの作業を開始する前に、次の前提条件を満たす必要があります。

  1. チュートリアル: Azure Notification Hubs を使用してユニバーサル Windows プラットフォーム アプリに通知を送信する」に従います。 このチュートリアルのとおりに操作すると、次が与えられます。

    • WindowsAzure.Messaging.Managed パッケージと Microsoft.Toolkit.Uwp.Notifications パッケージを含むアプリケーション。
    • このクイックスタートで <AZURE_PNH_HUB_NAME> として参照される Azure PNH (プッシュ通知ハブ) ハブ名と <AZURE_PNH_HUB_CONNECTION_STRING> として参照される Azure PNH 接続文字列。
  2. すべてのアプリケーション init で WNS (Windows Notification Service) チャネルに登録するには、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");
        }
    }
}
  1. 新しいプッシュ通知メッセージが 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;
    }
}

プッシュ通知に登録する

プッシュ通知を登録するには、アプリケーション init で取得される 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();
    }
}

次のステップ