Compartir por


Habilitación de las notificaciones push para llamadas

Las notificaciones push envían información de la aplicación a los dispositivos de los usuarios. Puede usar notificaciones push para mostrar un cuadro de diálogo, reproducir un sonido o mostrar una llamada entrante en la capa de interfaz de usuario de la aplicación.

En este artículo, aprenderá a habilitar las notificaciones push para las llamadas de Azure Communication Services. Communication Services ofrece integraciones con Azure Event Grid y Azure Notification Hubs que permiten agregar notificaciones push a las aplicaciones.

Información general sobre los tokens de TTL

El token de período de vida (TTL) es una configuración que determina el período de tiempo que un token de notificación permanece válido antes de convertirse en no válido. Esta configuración es útil para las aplicaciones en las que la interacción del usuario no requiere interacción diaria, pero permanece crítica durante períodos más largos.

La configuración de TTL permite administrar el ciclo de vida de las notificaciones push. Reduce la necesidad de renovaciones frecuentes de tokens, a la vez que ayuda a garantizar que el canal de comunicación entre la aplicación y sus usuarios permanezca abierto y confiable durante largos períodos de duración.

Actualmente, el valor máximo de TTL es de 180 días (15 552 000 segundos) y el valor mínimo es de 5 minutos (300 segundos). Puede escribir este valor y ajustarlo para adaptarlo a sus necesidades. Si no proporciona un valor, el valor predeterminado es 24 horas (86 400 segundos).

Después de llamar a la API de registro de notificaciones push, la información del token de dispositivo se guarda en el registrador. Una vez finalizada la duración del TTL, se elimina la información del punto de conexión del dispositivo. Las llamadas entrantes en esos dispositivos no se entregarán a los dispositivos si esos dispositivos no vuelven a llamar a la API de registro de notificaciones push.

Si desea revocar una identidad, siga este proceso. Una vez revocada la identidad, se debe eliminar la entrada del registrador.

Nota:

Para un usuario de Microsoft Teams, el valor máximo de TTL es de 24 horas (86 400 segundos). No hay ninguna forma de aumentar este valor. Debe reactivar la aplicación cada 24 horas en segundo plano y registrar el token del dispositivo.

Para reactivar la aplicación, capture el nuevo token y realice el registro. Siga las instrucciones para la plataforma iOS o las instrucciones para la plataforma Android.

Requisitos previos

Siga la guía de inicio rápido

Las notificaciones push web mediante el SDK de llamadas web de Azure Communication Services están en versión preliminar y están disponibles como parte de la versión 1.12.0-beta.2+.

Importante

Esta característica de Azure Communication Services se encuentra actualmente en versión preliminar.

Las API y los SDK en versión preliminar se proporcionan sin contrato de nivel de servicio. Se recomienda no usarlos para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que sus funcionalidades estén limitadas.

Para obtener más información, consulte Términos de uso complementarios para las Versiones preliminares de Microsoft Azure.

Para obtener instrucciones paso a paso, consulte el inicio rápido en GitHub.

  • Una cuenta de Firebase con Firebase Cloud Messaging (FCM) habilitado y con el servicio FCM conectado a una instancia de Azure Notification Hubs. Para más información, consulte Notificaciones de Communication Services.

  • Android Studio versión 3.6 o posterior para compilar la aplicación.

  • Un conjunto de permisos para permitir que la aplicación Android reciba mensajes de notificación de FCM. En el archivo AndroidManifest.xml, agregue los siguientes permisos justo después de <manifest ...> o debajo de la etiqueta </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" />
    

Importante

El 20 de junio de 2023, Google anunció que entraba en desuso el envío de mensajes mediante las API heredadas de FCM y empezaría a retirar FCM heredado del servicio en junio de 2024. Google recomienda Migrar de las API de FCM heredadas a FCM HTTP v1.

Si el recurso de Communication Services sigue usando las API heredadas de FCM, siga esta guía de migración.

Consideraciones sobre las notificaciones push móviles

Las notificaciones push móviles son las notificaciones emergentes que aparecen en los dispositivos móviles. Para las llamadas, este artículo se centra en las notificaciones push de voz sobre el Protocolo de Internet (VoIP).

Nota:

Cuando la aplicación se registra para las notificaciones push y controla las notificaciones push entrantes para un usuario de Teams, las API son las mismas. Las API que describe este artículo también se pueden invocar en la clase CommonCallAgent o TeamsCallAgent.

Instalación del SDK

Busque el archivo build.gradle de nivel de proyecto y agregue mavenCentral() a la lista de repositorios en buildscript y allprojects:

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

Luego, en el archivo build.gradle de nivel de módulo, agregue las siguientes líneas a la sección dependencies:

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

Inicialización de los objetos necesarios

Para crear una instancia de CallAgent, debe llamar al método createCallAgent en una instancia de CallClient. Esta llamada devuelve un objeto de instancia de CallAgent de manera asincrónica.

El método createCallAgent toma CommunicationUserCredential como argumento, que encapsula un token de acceso.

Para acceder a DeviceManager, primero debe crear una instancia de callAgent. A continuación, puede usar el método CallClient.getDeviceManager para obtener 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();

Para establecer un nombre para mostrar para el autor de la llamada, use este método alternativo:

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

Registro de notificaciones push

Para registrarse para recibir notificaciones push, la aplicación debe llamar a registerPushNotification() en una instancia de CallAgent mediante un token de registro de dispositivo.

Para obtener el token de registro del dispositivo, agregue el SDK de Firebase al archivo build.gradle del módulo de aplicación agregando las líneas siguientes en la sección dependencies (si las líneas aún no están ahí):

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

En el archivo build.gradle de nivel de proyecto, agregue la siguiente línea en la sección dependencies si aún no está ahí:

classpath 'com.google.gms:google-services:4.3.3'

Agregue el siguiente complemento al principio del archivo si aún no está ahí:

apply plugin: 'com.google.gms.google-services'

En la barra de herramientas, seleccione Sincronizar ahora. Agregue el siguiente fragmento de código para obtener el token de registro del dispositivo que el SDK de Firebase Cloud Messaging generó para la instancia de la aplicación cliente. Asegúrese de agregar las siguientes importaciones al encabezado de la actividad principal de la instancia para recuperar el token.

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;

Agregue este fragmento de código para recuperar el token:

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

Registre el token de registro de dispositivos con el SDK de servicios de llamada para recibir notificaciones push de llamadas entrantes:

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

Control de las notificaciones de inserción

Para recibir notificaciones push de llamadas entrantes, llame a handlePushNotification() en una instancia de CallAgent con una carga.

Para obtener la carga de Firebase Cloud Messaging, empiece por crear un nuevo servicio (seleccione Archivo>Nuevo>Servicio>Servicio) que extienda la clase FirebaseMessagingService del SDK de Firebase e invalide el método onMessageReceived. Este método es el controlador de eventos al que se llama cuando Firebase Cloud Messaging entrega la notificación push a la aplicación.

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

Agregue la siguiente definición de servicio al archivo AndroidManifest.xml, en la etiqueta <application>:

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Después de recuperar la carga, puede pasarla al SDK de Communication Services para analizarla en un objeto IncomingCallInformation interno. Este objeto controla la llamada al método handlePushNotification en una instancia de CallAgent. Para crear una instancia de CallAgent, llame al método createCallAgent(...) de la clase 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.");
}

Cuando el control del mensaje de la notificación push se realiza correctamente y todos los controladores de eventos se han registrado correctamente, la aplicación llama.

Anulación del registro de notificaciones push

Las aplicaciones pueden anular el registro de notificaciones push en cualquier momento. Para anular el registro, llame al método unregisterPushNotification() de callAgent:

try {
    callAgent.unregisterPushNotification().get();
}
catch(Exception e) {
    System.out.println("Something went wrong while un-registering for all Incoming Calls Push Notifications.")
}

Deshabilitación de las notificaciones push internas para una llamada entrante

La carga de inserción de una llamada entrante se puede entregar al destinatario de dos maneras:

  • Con FCM y el registro del token de dispositivo con la API mencionada antes, registerPushNotification en CallAgent o TeamsCallAgent
  • Registrando el SDK con un servicio interno tras la creación de CallAgent o TeamsCallAgent para entregar la carga de inserción

Mediante el uso de la propiedad setDisableInternalPushForIncomingCall en CallAgentOptions o TeamsCallAgentOptions, es posible indicar al SDK que deshabilite la entrega de la carga de inserción mediante el servicio de inserción interno:

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

Consideraciones sobre las notificaciones push móviles

Las notificaciones push móviles son las notificaciones emergentes que aparecen en los dispositivos móviles. Para las llamadas, este artículo se centra en las notificaciones push de voz sobre el Protocolo de Internet (VoIP). Para obtener una guía sobre la integración de CallKit en la aplicación iOS, consulte Integración con CallKit.

Nota:

Cuando la aplicación se registra para las notificaciones push y controla las notificaciones push entrantes para un usuario de Teams, las API son las mismas. Las API que describe este artículo también se pueden invocar en la clase CommonCallAgent o TeamsCallAgent.

Configuración del sistema

Siga estos pasos para configurar el sistema.

Creación del proyecto de Xcode

En Xcode, cree un nuevo proyecto de iOS y seleccione la plantilla Aplicación de una vista. En este artículo se usa el marco SwiftUI, por lo que debe establecer el Lenguaje en Swift y la Interfaz en SwiftUI.

No va a crear pruebas en este artículo. Puede desactivar la casilla Incluir pruebas.

Captura de pantalla que muestra la ventana para crear un proyecto en Xcode.

Instalación del paquete y las dependencias mediante CocoaPods

  1. Cree un Podfile para la aplicación, como en este ejemplo:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Ejecute pod install.

  3. Abra .xcworkspace mediante Xcode.

Solicitud de acceso al micrófono

Para acceder al micrófono del dispositivo, debe actualizar la lista de propiedades de información de la aplicación mediante NSMicrophoneUsageDescription. Establezca el valor asociado en una cadena que se incluye en el cuadro de diálogo empleado por el sistema para solicitar acceso al usuario.

Haga clic con el botón derecho en la entrada Info.plist del árbol del proyecto y seleccione Abrir como>Código fuente. Agregue las líneas siguientes a la sección <dict> de nivel superior y guarde el archivo.

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

Instalación del marco de la aplicación

Abra el archivo ContentView.swift del proyecto. Agregue una declaración import a la parte superior del archivo para importar la biblioteca AzureCommunicationCalling. Además, importe AVFoundation. Lo necesitará para las solicitudes de permiso de audio en el código.

import AzureCommunicationCalling
import AVFoundation

Inicialización de CallAgent

Para crear una instancia de CallAgent a partir de CallClient, debe usar el método callClient.createCallAgent, que devuelve de manera asincrónica un objeto CallAgent después de que se inicializa.

Para crear un cliente de llamada, pase un objeto 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)
}

Pase el objeto CommunicationTokenCredential que ha creado a CallClient y establezca el nombre para mostrar:

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

Configurar notificaciones de inserción

Antes de iniciar las tareas de registro, control y anulación del registro de notificaciones push, complete esta tarea de configuración:

  1. En Xcode, vaya a Signing & Capabilities (Firma y funcionalidades). Para agregar una funcionalidad, seleccione + Capability (+ Funcionalidad) y, a continuación, seleccione Push Notifications (Notificaciones de inserción).
  2. Para agregar otra funcionalidad, seleccione + Capability (+ Funcionalidad) y, a continuación, seleccione Background Modes (Modos en segundo plano).
  3. En Background Modes (Modos en segundo plano), seleccione las casillas Voice over IP (Voz sobre IP) y Remote notifications (Notificaciones remotas).

Captura de pantalla que muestra cómo agregar funcionalidades en Xcode.

Registro de notificaciones push

Para registrarse para notificaciones push, llame a registerPushNotification() en una instancia de CallAgent mediante un token de registro de dispositivo.

El registro de las notificaciones de inserción se debe producir después de una inicialización correcta. Cuando se destruye el objeto callAgent, se llama a logout, que anula automáticamente el registro de las notificaciones 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.")
    }
}

Control de las notificaciones de inserción

Para recibir notificaciones de inserción de llamadas entrantes, llame a handlePushNotification() en una instancia de CallAgent con una carga de diccionario:

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

Anulación del registro de notificaciones push

Las aplicaciones pueden anular el registro de notificaciones push en cualquier momento. Para anular el registro, llame al método unregisterPushNotification de CallAgent.

Nota:

El registro para que las aplicaciones dejen de recibir notificaciones de inserción no se anula de manera automática al cerrar la sesión.

callAgent.unregisterPushNotification { (error) in
    if (error == nil) {
        print("Unregister of push notification was successful")
    } else {
       print("Unregister of push notification failed, please try again")
    }
}

Deshabilitación de las notificaciones push internas para una llamada entrante

La carga de inserción de una llamada entrante se puede entregar al destinatario de dos maneras:

  • Mediante el uso del servicio de notificaciones push de Apple (APNS) y el registro del token de dispositivo con la API mencionada anteriormente, registerPushNotification en CallAgent o TeamsCallAgent
  • Registrando el SDK con un servicio interno tras la creación de CallAgent o TeamsCallAgent para entregar la carga de inserción

Mediante el uso de la propiedad disableInternalPushForIncomingCall en CallAgentOptions o TeamsCallAgentOptions, es posible indicar al SDK que deshabilite la entrega de la carga de inserción mediante el servicio de inserción interno:

let options = CallAgentOptions()
options.disableInternalPushForIncomingCall = true

Consideraciones sobre las notificaciones push en Windows

Las notificaciones push móviles son las notificaciones emergentes que aparecen en los dispositivos móviles. Para las llamadas, este artículo se centra en las notificaciones push de voz sobre el Protocolo de Internet (VoIP).

Las notificaciones push en la plataforma Windows se entregan mediante Servicios de notificaciones de inserción de Windows (WNS).

Nota:

Cuando la aplicación se registra para las notificaciones push y controla las notificaciones push para un punto de conexión de Teams personalizado (CTE), las API son las mismas. Las API que se describen en este artículo también se pueden invocar en la clase CommonCallAgent o TeamsCallAgent para un CTE.

Configuración del sistema

Siga estos pasos para configurar el sistema.

Creación del proyecto de Visual Studio

En el caso de una aplicación para la Plataforma universal de Windows, en Visual Studio 2022, cree un proyecto de Aplicación vacía (Universal Windows). Después de escribir el nombre del proyecto, puede elegir cualquier Windows SDK posterior a 10.0.17763.0.

En el caso de una aplicación WinUI 3, cree un nuevo proyecto con la plantilla Aplicación vacía, empaquetada (WinUI 3 en escritorio) para configurar una aplicación WinUI 3 de una sola página. Se requiere la versión 1.3 o posterior del SDK de aplicaciones de Windows.

Instalación del paquete y las dependencias mediante el Administrador de paquetes NuGet

Las API y bibliotecas de SDK de llamadas están disponibles públicamente a través de un paquete NuGet.

Para buscar, descargar e instalar el paquete NuGet del SDK de llamadas:

  1. Abra el Administrador de paquetes NuGet desde Herramientas>Administrador de paquetes NuGet>Administrar paquetes NuGet para la solución.
  2. Seleccione Explorar y, después, escriba Azure.Communication.Calling.WindowsClient en el cuadro de búsqueda.
  3. Asegúrese de que la casilla Incluir versión preliminar esté activada.
  4. Seleccione el paquete Azure.Communication.Calling.WindowsClient y, después, Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 o una versión más reciente.
  5. Seleccione la casilla correspondiente al proyecto de Azure Communication Services en el panel derecho.
  6. Seleccione Instalar.

Configurar notificaciones de inserción

Antes de iniciar las tareas de registrarse, controlar y mostrar una notificación de Windows para responder o rechazar una llamada entrante, complete esta tarea de configuración:

  1. Siga Tutorial: Envío de notificaciones a aplicaciones de la Plataforma universal de Windows mediante Azure Notification Hubs. Después de seguir el tutorial, tiene lo siguiente:

    • Una aplicación que tiene los WindowsAzure.Messaging.Managed y Microsoft.Toolkit.Uwp.Notifications paquetes.
    • Un nombre de centro de Azure Notifications Hub al que se hace referencia como <AZURE_PNH_HUB_NAME> y una cadena de conexión de Azure Notifications Hub a la que se hace referencia como <AZURE_PNH_HUB_CONNECTION_STRING> en este artículo.
  2. Para registrarse para un canal de WNS en cada inicialización de la aplicación, asegúrese de agregar el código de inicialización en el archivo 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. Registre el controlador de eventos que se activa cuando llega un nuevo mensaje de notificación push en 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;
        }
    }
    

Registro de notificaciones push

Para registrarse para notificaciones push, llame a RegisterForPushNotificationAsync() en una instancia de CallAgent con el canal de registro de WNS obtenido en la inicialización de la aplicación.

El registro de las notificaciones de inserción se debe producir después de una inicialización correcta.

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

Control de las notificaciones de inserción

Para recibir notificaciones de inserción de llamadas entrantes, llame a handlePushNotification() en una instancia de CallAgent con una carga de diccionario:

// MainPage.xaml.cs

public async Task HandlePushNotificationIncomingCallAsync(string notificationContent)
{
    if (this.callAgent != null)
    {
        PushNotificationDetails pnDetails = PushNotificationDetails.Parse(notificationContent);
        await callAgent.HandlePushNotificationAsync(pnDetails);
    }
}

Esta llamada desencadena un evento de llamada entrante en CallAgent que muestra la notificación de llamada entrante:

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

Agregue el código para controlar la pulsación del botón para la notificación en el método 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();
    }
}