Поделиться через


Включение push-уведомлений для вызовов

Здесь мы узнаем, как включить push-уведомления для вызовов Службы коммуникации Azure. Настройка push-уведомлений позволяет пользователям знать, когда у них есть входящий звонок, который затем может ответить.

Push-уведомление

Push-уведомления позволяют отправлять данные из приложения на устройства пользователей. Push-уведомления можно использовать для отображения диалогового окна, воспроизведения звука или отображения входящих вызовов на уровне пользовательского интерфейса приложения. Службы коммуникации Azure обеспечивают интеграцию со службой Сетка событий Azure и Центрами уведомлений Azure, которые позволяют добавлять push-уведомления в приложения.

Токен TTL

Маркер времени жизни (TTL) — это параметр, определяющий период времени, когда маркер уведомления остается допустимым, прежде чем стать недействительным. Этот параметр полезен для приложений, где взаимодействие пользователей не требует ежедневного взаимодействия, но остается критически важным в течение более длительных периодов.

Конфигурация TTL позволяет управлять жизненным циклом push-уведомлений, уменьшая потребность в частом продлении маркеров, гарантируя, что канал связи между приложением и его пользователями остается открытым и надежным в течение длительного времени.

В настоящее время максимальное значение для TTL составляет 180 дней (1552 000 секунд), а минимальное значение — 5 минут (300 секунд). Вы можете ввести это значение и настроить его соответствующим образом в соответствии с вашими потребностями. Если значение не указано, значение по умолчанию — 24 часа (86 400 секунд).

После вызова API push-уведомлений регистрации при сохранении сведений о маркере устройства в регистраторе. После окончания срока жизни TTL сведения о конечной точке устройства удаляются. Любые входящие вызовы на этих устройствах не могут быть доставлены на устройства, если эти устройства еще раз не вызывают API push-уведомлений регистрации.

Если вы хотите отозвать удостоверение, необходимо выполнить этот процесс, после отзыва удостоверения запись регистратора должна быть удалена.

Примечание.

Для CTE (настраиваемая конечная точка Teams) максимальное значение TTL равно 24 часам (86 400 секунд) невозможно увеличить это значение.

Необходимые компоненты

пакет SDK для веб-вызовов Службы коммуникации Azure — краткое руководство по веб-push-уведомлениям

Внимание

Эта функция Службы коммуникации Azure сейчас доступна в предварительной версии.

Предварительные версии API и пакеты SDK предоставляются без соглашения об уровне обслуживания. Рекомендуется не использовать их для рабочих нагрузок. Некоторые функции могут не поддерживаться или могут иметь ограниченные возможности.

Дополнительные сведения см . в дополнительных условиях использования для предварительных версий Microsoft Azure.

пакет SDK для веб-звонков Службы коммуникации Azure — веб-push-уведомления доступны в общедоступной предварительной версии и доступны в составе версии 1.12.0-beta.2+.

Ознакомьтесь с нашим кратким руководством по веб-push-уведомлениям: https://github.com/Azure-Samples/communication-services-javascript-quickstarts/blob/main/calling-web-push-notifications/README.md

Внимание

20 июня 2023 года Google объявил, что не рекомендуется отправлять сообщения с помощью устаревших API FCM. Google удаляет устаревшие FCM из службы в июне 2024 года. Google рекомендует перенести устаревшие API FCM на FCM HTTP версии 1. Следуйте этому руководству по миграции, если ваш обмен данными по-прежнему использует устаревшие API FCM.

Установка пакета SDK

Найдите файл build.gradle уровня проекта и добавьте mavenCentral() в список репозиториев в buildscript разделе иallprojects:

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

Затем в файле build.gradle на уровне модуля добавьте в раздел следующие строкиdependencies:

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

Инициализация обязательных объектов

Чтобы создать CallAgent экземпляр, необходимо вызвать createCallAgent метод в экземпляре CallClient . Этот вызов асинхронно возвращает объект экземпляра 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();

Дополнительные предварительные требования для push-уведомлений

Учетная запись Firebase, для которой включена облачная служба сообщений (FCM), и служба Firebase Cloud Messaging, подключенная к экземпляру центра уведомлений Azure. Дополнительные сведения см. в разделе Уведомления в Службах коммуникации. Кроме того, в этом руководстве предполагается, что для создания приложения вы используете 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" />

Обзор

Мобильные push-уведомления — это всплывающие уведомления, которые отображаются на мобильных устройствах. Для вызовов мы будем использовать push-уведомления протокола VoIP (голосовые вызовы через IP). Мы изучим регистрацию для получения push-уведомлений, обработку push-уведомлений и отмену регистрации для получения push-уведомлений.

Примечание.

Для регистрации push-уведомлений и обработки push-уведомлений для пользовательской конечной точки Teams (CTE) API одинаковы. Описанный ниже API также можно вызвать в CommonCallAgentTeamsCallAgent пользовательской конечной точке Teams (CTE).

Регистрация для получения push-уведомлений

Чтобы зарегистрировать push-уведомления, приложению необходимо вызвать registerPushNotification()CallAgent экземпляр с маркером регистрации устройства.

Чтобы получить маркер регистрации устройства, добавьте пакет SDK Firebase в файл модуля build.gradle приложения, добавив следующие строки в dependencies раздел, если он еще не существует:

// 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 для экземпляра клиентского приложения. Обязательно добавьте приведенные ниже инструкции import в заголовок главного действия (Activity) для экземпляра. Они необходимы для того, чтобы фрагмент кода получил маркер:

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 служб вызовов для получения push-уведомлений о входящих вызовах:

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

Обработка push-уведомлений

Чтобы получать push-уведомления о входящих вызовах, вызовите handlePushNotification() для экземпляра CallAgent, передав полезные данные.

Чтобы получить полезные данные из Firebase Cloud Messaging, начните с создания новой службы (file > New > Service > ), которая расширяет класс FirebaseMessagingService Firebase SDK и переопределите onMessageReceived метод. Этот метод является обработчиком событий и вызывается, когда Firebase Cloud Messaging доставляет в приложение push-уведомление.

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

Добавьте приведенное ниже определение службы внутри тега <application> в файле AndroidManifest.xml.

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
  • Полученные полезные данные можно передать в пакет SDK Служб коммуникации, где они будут преобразованы во внутренний объект IncomingCallInformation, для обработки которого вызывается метод handlePushNotification для экземпляра CallAgent. Экземпляр CallAgent создается путем вызова метода createCallAgent(...) для класса CallClient.
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.");
}

Если обработка push-уведомления пройдет успешно и все обработчики событий будут правильно зарегистрированы, в приложении прозвучит сигнал вызова.

Отмена регистрации для получения push-уведомлений

В приложениях можно в любое время отменить регистрацию для получения push-уведомлений. Чтобы отменить регистрацию, вызовите метод unregisterPushNotification() для CallAgent.

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 и выберите шаблон Single View App (Приложение с одним представлением). В этом кратком руководстве используется платформа SwiftUI, поэтому необходимо задать для языка значениеSwiftUI и задать для интерфейса значение SwiftUI.

В рамках этого краткого руководства вы не будете создавать тесты. Снимите флажок "Включить тесты ".

Снимок экрана, на котором показано окно для создания проекта в Xcode.

Установка пакета и зависимостей с помощью CocoaPods

  1. Создайте Podfile для приложения, как показано в следующем примере:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Запустите pod install.

  3. Откройте .xcworkspace с помощью Xcode.

Запрос доступа к микрофону

Чтобы получить доступ к микрофону устройства, необходимо обновить список свойств приложения с помощью NSMicrophoneUsageDescription. Вы задаете связанное значение строке, которая будет включена в диалоговое окно, которое система использует для запроса доступа от пользователя.

Щелкните правой кнопкой мыши запись Info.plist дерева проекта и выберите "Открыть как>исходный код". Добавьте в раздел верхнего уровня <dict> следующие строки, а затем сохраните файл.

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

Настройка платформы приложения

Откройте файл ContentView.swift проекта. import Добавьте объявление в начало файла для импорта библиотекиAzureCommunicationCalling. Кроме того, импортируйте AVFoundation. Она понадобится для запросов разрешений на аудио в коде.

import AzureCommunicationCalling
import AVFoundation

Инициализация CallAgent

Чтобы создать экземпляр CallAgent из CallClient, необходимо использовать метод callClient.createCallAgent, который асинхронно возвращает объект CallAgent после его инициализации.

Чтобы создать клиент вызова, передайте 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")
        }
})

Обзор

Мобильные push-уведомления — это всплывающие уведомления, которые отображаются на мобильных устройствах. Для вызовов мы будем использовать push-уведомления протокола VoIP (голосовые вызовы через IP). Мы изучим регистрацию для получения push-уведомлений, обработку push-уведомлений и отмену регистрации для получения push-уведомлений. Руководство по интеграции CallKit в приложении iOS см. здесь: интеграция CallKit с пакетом SDK для iOS ACS.

Примечание.

Чтобы зарегистрировать push-уведомления и обрабатывать push-уведомления для пользовательской конечной точки Teams (CTE), API одинаковы. Описанные API также можно вызвать в пользовательской CommonCallAgent конечной точке Teams (CTE) или TeamsCallAgent классе.

Настройка push-уведомлений

Мобильное push-уведомление — это всплывающее уведомление, которое вы получаете на мобильном устройстве. Для вызовов мы будем использовать push-уведомления протокола VoIP (голосовые вызовы через IP).

В следующих разделах описывается регистрация push-уведомлений, работа с ними и их отмена. Прежде чем приступить к выполнению этих задач, выполните следующие предварительные требования.

  1. В Xcode перейдите к разделу Подписывание и возможности. Добавьте возможность, выбрав пункт + возможность, а затем — Push-уведомления.
  2. Добавьте еще одну возможность, выбрав пункт + возможность, а затем — Режимы фоновой работы.
  3. В разделе Режимы фоновой работы выберите флажки Голосовая связь через IP и Удаленные уведомления.

Снимок экрана: как добавить новые возможности в Xcode.

Регистрация для получения push-уведомлений

Чтобы зарегистрироваться для получения push-уведомлений, необходимо вызвать registerPushNotification() для экземпляра CallAgent и передать маркер регистрации устройства.

Регистрация для push-уведомлений должна быть выполнена после успешной инициализации. При уничтожении объекта callAgent будет вызван метод logout, который автоматически отменит регистрацию на получение push-уведомлений.

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

Работа с push-уведомлениями

Чтобы получать push-уведомления о входящих вызовах, вызовите handlePushNotification() для экземпляра CallAgent, передав полезные данные словаря.

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

Отмена регистрации для получения push-уведомлений

В приложениях можно в любое время отменить регистрацию для получения push-уведомлений. Просто вызовите unregisterPushNotification метод в CallAgent.

Примечание.

Регистрация приложений для получения push-уведомлений не отменяется автоматически при выходе из системы.

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). После ввода имени проекта вы можете выбрать любой пакет SDK для Windows позже 10.0.17763.0.

Для приложения WinUI 3 создайте проект с шаблоном "Пустое приложение" (WinUI 3 в классическом приложении) для настройки одностраничного приложения WinUI 3. Требуется пакет SDK для приложений Windows версии 1.3 или более поздней.

Установка пакета и зависимостей с помощью NuGet диспетчер пакетов

Api и библиотеки пакета SDK для вызовов общедоступны через пакет NuGet.

Ниже приведены инструкции по поиску, скачиванию и установке пакета NuGet пакета Sdk для вызовов:

  1. Откройте nuGet диспетчер пакетов, выбрав инструменты>NuGet диспетчер пакетов> Manage NuGet Packages for Solution.
  2. Нажмите кнопку "Обзор", а затем введите Azure.Communication.Calling.WindowsClient в поле поиска.
  3. Убедитесь, что установлен флажок "Включить предварительную версию ".
  4. Azure.Communication.Calling.WindowsClient Выберите пакет и выберите Azure.Communication.Calling.WindowsClientверсию 1.4.0-beta.1 или более новую версию.
  5. Установите флажок, соответствующий проекту Служб коммуникации на правой части вкладки.
  6. Нажмите кнопку Установить.

Обзор

Push-уведомления на платформе Windows доставляются с помощью Windows Push Notification Service (WNS),.

Примечание.

Для регистрации push-уведомлений и обработки push-уведомлений для пользовательской конечной точки Teams (CTE) API одинаковы. Описанный ниже API также можно вызвать в CommonCallAgentTeamsCallAgent пользовательской конечной точке Teams (CTE).

Настройка push-уведомлений

Push-уведомление — это всплывающее уведомление, которое вы получаете на устройстве. Для вызовов мы будем использовать push-уведомления протокола VoIP (голосовые вызовы через IP).

В следующих разделах описывается, как зарегистрировать, обработать и отобразить уведомление Windows, чтобы ответить или отклонить входящий вызов. Прежде чем приступить к выполнению этих задач, выполните следующие предварительные требования.

  1. Следующее руководство. Отправка уведомлений в приложения универсальная платформа Windows с помощью Центров уведомлений Azure. После выполнения этого руководства у вас есть:

    • Приложение, которое содержит WindowsAzure.Messaging.Managed и Microsoft.Toolkit.Uwp.Notifications пакеты.
    • Имя концентратора push-уведомлений Azure PNH, на который <AZURE_PNH_HUB_NAME> ссылается Центр push-уведомлений, и строка подключения Azure PNH, <AZURE_PNH_HUB_CONNECTION_STRING> указанная в этом кратком руководстве.
  2. Чтобы зарегистрировать канал WNS (служба уведомлений Windows) на каждом инициализации приложения, добавьте код инициализации в файл 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. Зарегистрируйте обработчик событий, активированный при поступлении нового push-уведомления на 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;
    }
}

Регистрация для получения push-уведомлений

Чтобы зарегистрировать push-уведомления, вызовите RegisterForPushNotificationAsync()CallAgent экземпляр с каналом регистрации WNS, полученным в приложении init.

Регистрация для push-уведомлений должна быть выполнена после успешной инициализации.

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

Работа с push-уведомлениями

Чтобы получать push-уведомления о входящих вызовах, вызовите handlePushNotification() для экземпляра CallAgent, передав полезные данные словаря.

// 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();
    }
}

Следующие шаги