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


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

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

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

Общие сведения о маркерах TTL

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

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

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

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

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

Примечание.

Для пользователя Microsoft Teams максимальное значение TTL составляет 24 часа (86 400 секунд). Нет способа увеличить это значение. Вы должны проснуть приложение каждые 24 часа в фоновом режиме и зарегистрировать маркер устройства.

Чтобы проснуть приложение, получить новый маркер и выполнить регистрацию, следуйте инструкциям для платформы iOS или инструкций для платформы Android.

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

Следуйте краткому руководству

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

Внимание

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

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

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

Пошаговые инструкции см. в кратком руководстве по GitHub.

  • Учетная запись Firebase с поддержкой Firebase Cloud Messaging (FCM) и службой FCM, подключенной к экземпляру Центров уведомлений Azure. Дополнительные сведения см. в разделе "Уведомления служб коммуникации".

  • 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" />
    

Внимание

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

Если ресурс Служб коммуникации по-прежнему использует устаревшие API FCM, следуйте этому руководству по миграции.

Рекомендации по отправке push-уведомлений для мобильных устройств

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

Примечание.

Когда приложение регистрирует push-уведомления и обрабатывает входящие push-уведомления для пользователя Teams, интерфейсы API одинаковы. Api, описываемые в этой статье, также могут вызываться в CommonCallAgent или TeamsCallAgent классе.

Установка пакета 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-уведомлений

Чтобы зарегистрировать 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'

На панели инструментов выберите "Синхронизировать сейчас". Добавьте следующий фрагмент кода, чтобы получить маркер регистрации устройства, созданный пакетом SDK Firebase Cloud Messaging для экземпляра клиентского приложения. Обязательно добавьте следующие импорты в заголовок основного действия для экземпляра, чтобы получить маркер.

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 служб вызовов для получения 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-уведомления о CallAgent входящих вызовах, вызовите handlePushNotification() экземпляр с полезными данными.

Чтобы получить полезные данные из Firebase Cloud Messaging, начните с создания новой службы (выберите файл>новой>службы),> которая расширяет FirebaseMessagingService класс пакета SDK Firebase и переопределяет 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 the 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.")
}

Отключение внутренних push-уведомлений для входящего вызова

Полезные данные отправки входящих вызовов могут быть доставлены вызывающей участнику двумя способами:

  • Использование FCM и регистрация маркера устройства в API, упоминаемом ранее, registerPushNotification или CallAgentTeamsCallAgent
  • Регистрация пакета SDK в внутренней службе при создании или TeamsCallAgent получении полезных CallAgent данных отправки.

Используя свойство setDisableInternalPushForIncomingCall в CallAgentOptions или TeamsCallAgentOptions, можно указать пакету SDK отключить доставку полезных данных push-уведомлений через внутреннюю службу push-уведомлений:

CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisableInternalPushForIncomingCall(true);

Рекомендации по отправке push-уведомлений для мобильных устройств

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

Примечание.

Когда приложение регистрирует push-уведомления и обрабатывает входящие push-уведомления для пользователя Teams, интерфейсы API одинаковы. Api, описываемые в этой статье, также могут вызываться в CommonCallAgent или TeamsCallAgent классе.

Настройка системы

Выполните следующие действия, чтобы настроить систему.

Создайте проект Xcode

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

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

Отключение внутренних push-уведомлений для входящего вызова

Полезные данные отправки входящих вызовов могут быть доставлены вызывающей участнику двумя способами:

  • Использование службы push-уведомлений Apple (APNS) и регистрация маркера устройства в API, упоминаемом ранее, registerPushNotification или CallAgentTeamsCallAgent
  • Регистрация пакета SDK в внутренней службе при создании или TeamsCallAgent получении полезных CallAgent данных отправки.

Используя свойство disableInternalPushForIncomingCall в CallAgentOptions или TeamsCallAgentOptions, можно указать пакету SDK отключить доставку полезных данных push-уведомлений через внутреннюю службу push-уведомлений:

let options = CallAgentOptions()
options.disableInternalPushForIncomingCall = true

Рекомендации по отправке push-уведомлений Windows

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

Push-уведомления на платформе Windows доставляются через службу push-уведомлений Windows (WNS).

Примечание.

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

Настройка системы

Выполните следующие действия, чтобы настроить систему.

Создание проекта Visual Studio

Для приложения универсальная платформа Windows в 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. Установите флажок, соответствующий проекту Службы коммуникации Azure на правой панели.
  6. Выберите Установить.

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

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

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

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

Регистрация для 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();
    }
}