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


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

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

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

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

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

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

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

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

Чтобы получить полезную нагрузку из Firebase Cloud Messaging, начните с создания новой службы (выберите Файл>Новый>Служба>Служба), которая расширяет класс SDK Firebase и переопределяет соответствующий метод FirebaseMessagingService. Этот метод вызывается обработчиком событий, когда 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();
        }
    }
}

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

<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-уведомлений для входящего вызова

Данные push-уведомления о входящем вызове могут быть доставлены вызываемому абоненту двумя способами:

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

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

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

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

Мобильные 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-уведомления о входящем вызове могут быть доставлены вызываемому абоненту двумя способами:

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

Используя свойство 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 или TeamsCallAgent для CTE.

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

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

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

Для универсального приложения платформы Windows в Visual Studio 2022 создайте проект типа Пустое приложение (универсальная платформа Windows). После ввода имени проекта вы можете выбрать любой пакет SDK для Windows позже 10.0.17763.0.

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

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

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

Чтобы найти, скачать и установить пакет NuGet SDK для вызовов:

  1. Откройте nuGet диспетчер пакетов, выбрав > Manage NuGet Packages for Solution.
  2. Выберите "Обзор" и введите Azure.Communication.Calling.WindowsClient в поле поиска.
  3. Убедитесь, что установлен флажок "Включить предварительную версию ".
  4. Выберите пакет Azure.Communication.Calling.WindowsClient, а затем выберите Azure.Communication.Calling.WindowsClient1.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_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();
    }
}