Compartilhar via


Habilitar notificações por push para chamadas

Aqui, aprenderemos a habilitar notificações por push para as chamadas dos Serviços de Comunicação do Azure. A configuração das notificações por push permitirá que os usuários saibam quando eles têm uma chamada de entrada que eles podem responder.

Notificação por push

As notificações por push permitem que você envie informações do aplicativo para os dispositivos dos usuários. Você pode usar notificações por push para mostrar uma caixa de diálogo, tocar um som ou exibir a chamada de entrada na camada de interface do usuário do aplicativo. Os Serviços de Comunicação do Azure fornecem integrações com a Grade de Eventos do Azure e os Hubs de Notificação do Azure, que permitem adicionar notificações por push aos aplicativos.

Token TTL

O token TTL (vida útil) é uma configuração que determina o tempo em que um token de notificação permanece válido antes de se tornar inválido. Essa configuração é útil para aplicativos em que a participação do usuário não requer interação diária, mas permanece crítico por períodos mais longos.

A configuração de TTL permite o gerenciamento do ciclo de vida das notificações por push, reduzindo a necessidade de renovações frequentes de token, garantindo que o canal de comunicação entre o aplicativo e seus usuários permaneça aberto e confiável por longas durações.

Atualmente, o valor máximo da TTL é de 180 dias (15.552.000 segundos)e o valor mínimo é de 5 minutos (300 segundos). Você pode inserir esse valor e ajustá-lo de acordo com suas necessidades. Se você não fornecer um valor, o valor padrão será 24 horas (86.400 segundos).

Depois que a API de notificação por push de registro é chamada quando as informações do token do dispositivo são salvas no Registrador. Após o término do tempo de vida útil, as informações do ponto de extremidade do dispositivo são excluídas. As chamadas recebidas nesses dispositivos não podem ser entregues aos dispositivos se esses dispositivos não chamarem a API de notificação por push de registro novamente.

Caso deseje revogar uma identidade, você precisará seguir esse processo, depois que a identidade for revogada, a entrada do Registrador deverá ser excluída.

Observação

No caso do CTE (Ponto de Extremidade do Teams Personalizado), o valor máximo da TTL é de 24 horas (86.400 segundos). Não há como aumentar esse valor.

Pré-requisitos

Guia rápido do SDK de Chamada à Web dos Serviços de Comunicação do Azure – notificações por push da Web

Importante

Este recurso dos Serviços de Comunicação do Azure estão atualmente em versão prévia.

Versões prévias das APIs e dos SDKs são fornecidas sem um contrato de nível de serviço. É recomendável que você não as use para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou talvez ter restrição de recursos.

Para saber mais, consulte os Termos de Uso Complementares das Versões Prévias do Microsoft Azure.

SDK de Chamada Da Web dos Serviços de Comunicação do Azure – as notificações por push da Web estão em versão prévia pública e estão disponíveis como parte da versão 1.12.0-beta.2+.

Visite nosso tutorial de início rápido de notificações por push na Web: https://github.com/Azure-Samples/communication-services-javascript-quickstarts/blob/main/calling-web-push-notifications/README.md

Instalar o SDK

Localize o arquivo build.gradle no nível do projeto e adicione mavenCentral() à lista de repositórios em buildscript e allprojects:

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

Em seguida, no arquivo build.gradle no nível de módulo, adicione as seguintes linhas à seção dependencies:

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

Inicializar objetos necessários

Para criar uma instância CallAgent, você precisa chamar o método createCallAgent em uma instância CallClient. Essa chamada retorna de forma assíncrona um objeto de instância CallAgent.

O método createCallAgent usa CommunicationUserCredential como argumento, que encapsula um token de acesso.

Para acessar DeviceManager, você deverá criar uma instância callAgent primeiro. Em seguida, você poderá usar o método CallClient.getDeviceManager para obter 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 definir um nome de exibição para o chamador, 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();

Pré-requisitos adicionais para notificações por push

Uma conta do Firebase configurada com o FCM (Firebase Cloud Messaging) habilitado e com o serviço do FCM conectado a uma instância do Hub de Notificações do Azure. Confira Notificações dos Serviços de Comunicação para obter mais informações. Além disso, o tutorial pressupõe que você esteja usando o Android Studio versão 3.6 ou superior para criar o seu aplicativo.

Um conjunto de permissões é necessário para que o aplicativo Android possa receber mensagens de notificações do Firebase Cloud Messaging. No arquivo AndroidManifest.xml, adicione o conjunto de permissões a seguir logo após <manifest ...> ou abaixo da marca </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" />

Visão geral

As notificações por push móveis são as notificações pop-up que você vê em dispositivos móveis. Para chamadas, nos concentraremos em notificações por push de protocolo VoIP. Faremos o registro de notificações por push, a administração de notificações por push e o cancelamento do registro de notificações por push.

Observação

Para registrar para notificações por push e tratamento das notificações por push para um CTE (ponto de extremidade personalizado do Teams) as API são as mesmas. A API descrita abaixo também pode ser invocada na classe CommonCallAgent ou TeamsCallAgent do CTE (Ponto de Extremidade Personalizado do Teams).

Registrar notificações por push

Para se registrar para notificações por push, o aplicativo precisa chamar registerPushNotification() em uma instância CallAgent com um token de registro de dispositivo.

Para obter o token de registro do dispositivo, adicione o SDK do Firebase ao arquivo do módulo de build.gradle aplicativo adicionando as seguintes linhas na dependencies seção se ele ainda não estiver lá:

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

No arquivo build.gradle do nível do projeto, adicione os seguintes itens na seção dependencies, caso eles ainda não tenham sido adicionados:

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

Adicione o seguinte plug-in ao início do arquivo, caso ele ainda não tenha sido adicionado:

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

Selecione Sincronizar Agora na barra de ferramentas. Adicione o snippet de código a seguir para obter o token de registro do dispositivo gerado pelo SDK do Firebase Cloud Messaging para a instância do aplicativo cliente. Verifique se as importações abaixo foram adicionadas ao cabeçalho da atividade principal da instância. Elas são necessárias para que o snippet recupere o 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;

Adicione esse snippet para recuperar o 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 new Instance ID token
            String deviceToken = task.getResult().getToken();
            // Log
            Log.d("PushNotification", "Device Registration token retrieved successfully");
        }
    });

Registre o token de registro de dispositivo com o SDK dos Serviços de Chamada para obter notificações por push da chamada de entrada:

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

Gerenciamento de notificações por push

Para receber notificações por push de chamadas de entrada, chame handlePushNotification() em uma instância CallAgent com um conteúdo.

Para obter o conteúdo do Firebase Cloud Messaging, comece criando um serviço (Arquivo > Novo > Serviço > Serviço) que estende a classe do SDK do Firebase FirebaseMessagingService e substitui o método onMessageReceived. Esse método é o manipulador de eventos chamado quando o Firebase Cloud Messaging entrega a notificação por push ao aplicativo.

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

Adicione a seguinte definição de serviço ao arquivo AndroidManifest.xml, dentro da marca <application>:

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
  • Depois que o conteúdo for recuperado, ele poderá ser passado para o SDK dos Serviços de Comunicação para ser analisada em um objeto IncomingCallInformation interno que será administrado chamando o método handlePushNotification em uma instância CallAgent. Uma instância CallAgent é criada chamando o método createCallAgent(...) na classe 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.");
}

Quando a administração de mensagens de notificação por push for bem-sucedida e os todos os manipuladores de eventos forem registrados corretamente, o aplicativo tocará.

Cancelar o registro de notificações por push

Os aplicativos podem cancelar o registro de notificações por push a qualquer momento. Chame o método unregisterPushNotification() no callAgent para cancelar o registro.

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

Configurar o backup do sistema

Criar o projeto do Xcode

No Xcode, crie um projeto do iOS e selecione o modelo Aplicativo de Modo de Exibição Único. Este início rápido usa a estrutura SwiftUI, portanto, você deve definir a Linguagem como Swift e a Interface como SwiftUI.

Você não criará testes durante este início rápido. Fique à vontade para limpar a caixa de seleção Incluir Testes.

Captura de tela que mostra a janela para a criação de um projeto no Xcode.

Instalar o pacote e as dependências usando o CocoaPods

  1. Crie um Podfile para seu aplicativo, como este exemplo:

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

  3. Abra o .xcworkspace usando o Xcode.

Solicitar acesso ao microfone

Para acessar o microfone do dispositivo, você precisa atualizar a lista de propriedades de informações do aplicativo usando NSMicrophoneUsageDescription. Defina o valor associado a uma cadeia de caracteres que será incluída na caixa de diálogo que o sistema usa para solicitar acesso do usuário.

Clique com o botão direito do mouse na entrada Info.plist da árvore de projeto e selecione Abrir Como>Código-Fonte. Adicione as linhas a seguir na seção do nível superior<dict>e, em seguida, salve o arquivo.

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

Configurar o framework de aplicativos

Abra o arquivo ContentView.swift do projeto. Adicione uma declaração import à parte superior do arquivo para importar a biblioteca AzureCommunicationCalling. Além disso, importeAVFoundation. Você precisará dela para as solicitações de permissão do áudio no código.

import AzureCommunicationCalling
import AVFoundation

Inicialização do CallAgent

Para criar umaCallAgentinstânciaCallClient,você precisa usar um método callClient.createCallAgentque retorne de modo assíncrono um objetoCallAgentdepois que ele for inicializado.

Para criar um cliente de chamada, passe um 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)
}

Passe o objeto CommunicationTokenCredential que você criou para CallClient e defina o nome de exibição:

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

Visão geral

As notificações por push móveis são as notificações pop-up que você vê em dispositivos móveis. Para chamadas, nos concentraremos em notificações por push de protocolo VoIP. Faremos o registro de notificações por push, a administração de notificações por push e o cancelamento do registro de notificações por push. Para obter um guia sobre a integração do CallKit em seu aplicativo iOS, consulte aqui Integração do CallKit com o SDK do iOS ACS.

Observação

Para registrar para notificações por push e tratamento das notificações por push para um CTE (ponto de extremidade personalizado do Teams) as API são as mesmas. A API descrita também pode ser invocada na classe CommonCallAgent ou TeamsCallAgent do CTE (Ponto de Extremidade Personalizado do Teams).

Configurar notificações por push

A notificação por push móvel é a notificação de item pop-up que você obtém no dispositivo móvel. Para as chamadas, nos concentraremos em notificações por push do (protocolo de chamada de voz por IP).

As seções a seguir descrevem como registrar-se para identificar e cancelar o registro de notificações por push. Antes de iniciar estas tarefas, conclua estes pré-requisitos:

  1. Em Xcode, vá paraAssinatura e Funcionalidades. Adicione uma funcionalidade selecionando+ funcionalidadee,em seguida, selecioneNotificações por Push.
  2. Adicione outra funcionalidade selecionando+ funcionalidadee, em seguida, selecioneModos de Segundo Plano.
  3. Em caixas de seleção ou botões de opçãoModos de Segundo Plano,selecione oProtocolo de chamada de voz por IPe Notificações Remotas.

Captura de tela que mostra como adicionar as funcionalidades no Xcode.

Registrar notificações por push

Para registrar notificações por push, chamarregisterPushNotification()em umaCallAgent instância com um token de registro de dispositivo.

O registro das notificações por push precisa acontecer após a inicialização bem-sucedida. Quando o objetocallAgentfor destruído,logoutserá chamado, o que cancelará automaticamente o registro das notificações por 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.")
    }
}

Identificar as notificações por push

Para receber notificações de chamadas recebidas por push, em uma chamadahandlePushNotification()de instânciaCallAgentcom um conteúdo de dicionário.

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

Cancelar o registro de notificações por push

Os aplicativos podem cancelar o registro de notificações por push a qualquer momento. Basta chamar o unregisterPushNotification método em CallAgent.

Observação

Os aplicativos não são cancelados automaticamente da notificação por push no logout.

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

Configurar o backup do sistema

Criar o projeto do Visual Studio

Para um aplicativo UWP, no Visual Studio 2022, crie um novo projeto Aplicativo em Branco (Universal do Windows). Depois de inserir o nome do projeto, fique à vontade para escolher qualquer SDK do Windows posterior a 10.0.17763.0.

Para um aplicativo WinUI 3, crie um novo projeto com o modelo Aplicativo em Branco, Empacotado (WinUI 3 na Área de Trabalho) para configurar um aplicativo WinUI 3 de página única. O SDK do Aplicativo do Windows versão 1.3 ou posterior é necessário.

Instalar o pacote e as dependências usando o Gerenciador de Pacotes do NuGet

As bibliotecas e as APIs do SDK de Chamada estão disponíveis publicamente por meio de um pacote NuGet.

As etapas a seguir exemplificam como localizar, baixar e instalar o pacote do NuGet do SDK de chamada:

  1. Abra o Gerenciador de Pacotes do NuGet selecionando Ferramentas>Gerenciador de Pacotes do NuGet>Gerenciar de Pacotes do NuGet para Solução.
  2. Selecione Procurar e, em seguida, insira Azure.Communication.Calling.WindowsClient na caixa de pesquisa.
  3. Verifique se a caixa de seleção Incluir pré-lançamento está marcada.
  4. Selecione o pacote Azure.Communication.Calling.WindowsClient e selecione Azure.Communication.Calling.WindowsClient1.4.0-beta.1 ou uma versão mais recente.
  5. Marque a caixa de seleção que corresponde ao projeto dos Serviços de Comunicação na guia à direita.
  6. Selecione o botão Instalar.

Visão geral

As notificações por push na plataforma Windows são entregues usando Windows Push Notification Service (WNS),.

Observação

Para registrar para notificações por push e tratamento das notificações por push para um CTE (ponto de extremidade personalizado do Teams) as API são as mesmas. A API descrita abaixo também pode ser invocada na classe CommonCallAgent ou TeamsCallAgent do CTE (Ponto de Extremidade Personalizado do Teams).

Configurar notificações por push

Uma notificação por push é a notificação pop-up que você obtém no seu dispositivo. Para as chamadas, nos concentraremos em notificações por push do (protocolo de chamada de voz por IP).

As seções a seguir descrevem como se registrar, lidar e mostrar uma notificação do Windows para responder/recusar uma chamada sendo recebida. Antes de iniciar estas tarefas, conclua estes pré-requisitos:

  1. Siga o Tutorial : Enviar notificações para aplicativos da Plataforma Universal do Windows usando Hubs de Notificação do Azure. Após seguir esse tutorial, você terá o seguinte:

    • Um aplicativo que tem os pacotesWindowsAzure.Messaging.Managed e Microsoft.Toolkit.Uwp.Notifications.
    • Um nome do Hub de PNH (Hub de Notificações por Push) do Azure mencionado como <AZURE_PNH_HUB_NAME> e a Cadeia de Conexão de PNH do Azure mencionada como <AZURE_PNH_HUB_CONNECTION_STRING> nesse início rápido.
  2. Para se registrar em um canal do WNS (Serviço de Notificação do Windows) em cada init de aplicativo, certifique-se de adicionar o código de inicialização ao seu arquivo 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. Registre o manipulador de eventos ativado quando uma nova mensagem de notificação por push chegar no 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;
    }
}

Registrar notificações por push

Para se registrar para receber notificações por push, chame RegisterForPushNotificationAsync() em uma instância de CallAgent com o canal do registro WNS obtido no init do aplicativo.

O registro das notificações por push precisa acontecer após a inicialização bem-sucedida.

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

Identificar as notificações por push

Para receber notificações de chamadas recebidas por push, em uma chamadahandlePushNotification()de instânciaCallAgentcom um conteúdo de dicionário.

// MainPage.xaml.cs

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

Isso dispara um evento de chamada sendo recebida no CallAgent que mostra a notificação da chamada sendo recebida.

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

Adicione o código que irá se encarregar de pressionar o botão para a notificação no 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();
    }
}

Próximas etapas