Partilhar via


Ativar notificações push para chamadas

Aqui, aprendemos como habilitar notificações por push para chamadas dos Serviços de Comunicação do Azure. A configuração das notificações push permite que os usuários saibam quando recebem uma chamada, que eles podem responder.

Notificação push

As notificações push permitem-lhe enviar informações da sua aplicação para os dispositivos dos utilizadores. Você pode usar notificações por push para mostrar uma caixa de diálogo, reproduzir um som ou exibir chamadas de entrada na camada da 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 seus aplicativos.

Token TTL

O token TTL (Time To Live) é uma configuração que determina o período de 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 o envolvimento do usuário não requer interação diária, mas permanece crítico por períodos mais longos.

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

Atualmente, o valor máximo para TTL é de 180 dias (15.552.000 segundos) e o valor mínimo é de 5 minutos (300 segundos). Pode introduzir este valor e ajustá-lo de acordo com as 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 da vida útil do TTL, as informações do ponto de extremidade do dispositivo são excluídas. Quaisquer chamadas recebidas nesses dispositivos não poderão ser entregues aos dispositivos se esses dispositivos não chamarem a API de notificação por push de registro novamente.

Caso pretenda revogar uma identidade, tem de seguir este processo, uma vez revogada a identidade, a entrada do Registrar deve ser eliminada.

Nota

Para um usuário do Teams, o valor máximo de TTL é de 24 horas (86.400 segundos). Não há como aumentar esse valor. A Contoso deve ativar o aplicativo a cada 24 horas em segundo plano e realizar o registro do token de dispositivo. Na plataforma iOS siga as instruções aqui e para Android aqui para acordar o aplicativo, buscar o novo token e realizar o cadastro.

Pré-requisitos

SDK de Chamada na Web dos Serviços de Comunicação do Azure - início rápido de notificações por push da Web

Importante

Esta funcionalidade dos Serviços de Comunicação do Azure está atualmente em pré-visualização.

As APIs e SDKs de visualização são fornecidos sem um contrato de nível de serviço. Recomendamos que você não os use para cargas de trabalho de produção. Alguns recursos podem não ser suportados ou podem ter recursos restritos.

Para obter mais informações, consulte Termos de Utilização Suplementares para Pré-visualizações do Microsoft Azure.

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

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

Importante

Em 20 de junho de 2023, o Google anunciou que desativou o envio de mensagens usando as APIs herdadas do FCM. O Google está removendo o FCM legado do serviço em junho de 2024. O Google recomenda a migração de APIs herdadas do FCM para o FCM HTTP v1. Siga este guia de migração se o seu relatório de comunicação ainda estiver usando as APIs herdadas antigas do FCM.

Instale o SDK

Localize seu 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 do módulo, adicione as seguintes linhas à dependencies seção :

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

Inicializar os objetos necessários

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

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

Para acessar DeviceManagero , você deve criar uma callAgent instância primeiro. Então você pode usar o CallClient.getDeviceManager método 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 push

Uma conta do Firebase configurada com o Cloud Messaging (FCM) habilitado e com seu serviço Firebase Cloud Messaging conectado a uma instância do Hub de Notificação do Azure. Consulte 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 seu aplicativo.

É necessário um conjunto de permissões para o aplicativo Android para poder receber mensagens de notificação do Firebase Cloud Messaging. No arquivo AndroidManifest.xml , adicione o seguinte conjunto de permissões logo após a tag ou <manifest ...> abaixo dela </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" />

Descrição geral

As notificações push móveis são as notificações pop-up que você vê em dispositivos móveis. Para chamadas, vamos nos concentrar em notificações push VoIP (Voz sobre Protocolo de Internet). Nós nos registramos para notificações push, lidamos com notificações push e, em seguida, cancelamos o registro de notificações push.

Nota

Registrando-se para Notificações por Push e manipulando as Notificações por Push recebidas para um usuário do Teams, as APIs são as mesmas. As APIs descritas aqui também podem ser invocadas CommonCallAgent nas classes or TeamsCallAgent .

Registe-se para receber notificações push

Para se registrar para notificações por push, o aplicativo precisa chamar registerPushNotification() uma CallAgent instância 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 do 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 a seguinte linha na dependencies seção se ela ainda não estiver lá:

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

Adicione o seguinte plugin ao início do arquivo, se ele ainda não estiver lá:

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

Selecione Sincronizar agora na barra de ferramentas. Adicione o seguinte trecho de código para obter o token de registro do dispositivo gerado pelo SDK do Firebase Cloud Messaging para a instância do aplicativo cliente. Certifique-se de adicionar as importações abaixo ao cabeçalho da atividade principal da instância para recuperar 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 este trecho 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 do dispositivo com o SDK dos Serviços de Chamada para notificações por push de chamadas 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.")
}

Tratamento de notificações push

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

Para obter a carga do Firebase Cloud Messaging, comece criando um novo Serviço (File > New > Service > Service) que estenda a classe FirebaseMessagingService Firebase SDK e substitua o onMessageReceived método. 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 AndroidManifest.xml arquivo, dentro da <application> tag :

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

Depois que a carga é recuperada, ela pode ser passada para o SDK dos Serviços de Comunicação para ser analisada em um objeto IncomingCallInformation interno que manipulará a chamada do método handlePushNotification em uma instância do CallAgent. Uma CallAgent instância é criada chamando o createCallAgent(...) método na CallClient classe.

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 o processamento da mensagem de notificação por push é bem-sucedido e todos os manipuladores de eventos são registrados corretamente, o aplicativo toca.

Cancelar o registro de notificações push

Os aplicativos podem cancelar o registro da notificação por push a qualquer momento. Chame o método em callAgent para cancelar o unregisterPushNotification() registro.

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

Desativar o push interno para chamadas recebidas

Há duas maneiras pelas quais uma carga push de uma chamada recebida pode ser entregue ao destinatário.

  • Usando o FCM e registrando o token do dispositivo com a API mencionada acima, registerPushNotification em CallAgent ou TeamsCallAgent.
  • Quando um CallAgent ou TeamsCallAgent é criado, o SDK também se registra em um serviço interno para obter a carga útil por push entregue.

Usando a propriedade setDisableInternalPushForIncomingCall em CallAgentOptions ou TeamsCallAgentOptions é possível instruir o SDK para desativar a entrega da carga de push usando o serviço de push interno.

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

Configure o seu sistema

Criar o projeto Xcode

No Xcode, crie um novo projeto iOS e selecione o modelo Single View App . Este início rápido usa a estrutura SwiftUI, portanto, você deve definir Language como Swift e Interface como SwiftUI.

Você não vai criar testes durante este início rápido. Sinta-se à vontade para desmarcar a caixa de seleção Incluir testes .

Captura de tela que mostra a janela para criar um projeto no Xcode.

Instale 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 o pod install.

  3. Abra .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 seu aplicativo usando NSMicrophoneUsageDescription. Você define o valor associado para 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 do projeto e selecione Abrir como>código-fonte. Adicione as seguintes linhas na secção de nível <dict> superior e, em seguida, guarde o ficheiro.

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

Configurar a estrutura do aplicativo

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

import AzureCommunicationCalling
import AVFoundation

Inicializar o CallAgent

Para criar uma CallAgent instância a partir do CallClient, você precisa usar um callClient.createCallAgent método que retorna de forma assíncrona um CallAgent objeto depois que ele é inicializado.

Para criar um cliente de chamada, passe um CommunicationTokenCredential objeto:

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 CommunicationTokenCredential objeto que você criou para CallCliente defina o nome para 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")
        }
})

Descrição geral

As notificações push móveis são as notificações pop-up que você vê em dispositivos móveis. Para chamadas, vamos nos concentrar em notificações push VoIP (Voz sobre Protocolo de Internet). Registraremos notificações push, lidaremos com notificações push e, em seguida, cancelaremos o registro de notificações push. Para obter um guia sobre a integração do CallKit em seu aplicativo iOS, consulte aqui, Integração do CallKit com o iOS ACS SDK.

Nota

Registrando-se para Notificações por Push e manipulando as Notificações por Push recebidas para um usuário do Teams, as APIs são as mesmas. As APIs descritas aqui também podem ser invocadas CommonCallAgent nas classes or TeamsCallAgent .

Configurar notificações por push

Uma notificação por push móvel é a notificação pop-up que você recebe no dispositivo móvel. Para chamadas, vamos nos concentrar em notificações push VoIP (voz sobre protocolo de Internet).

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

  1. No Xcode, vá para Assinando & Recursos. Adicione uma funcionalidade selecionando + Capacidade e, em seguida, selecione Notificações push.
  2. Adicione outro recurso selecionando + Capacidade e, em seguida, selecione Modos em segundo plano.
  3. Em Modos em segundo plano, marque as caixas de seleção Voz sobre IP e Notificações remotas.

Captura de tela que mostra como adicionar recursos no Xcode.

Registe-se para receber notificações push

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

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

Lidar com notificações por push

Para receber notificações por push para chamadas recebidas, chame handlePushNotification() uma CallAgent instância com uma carga útil 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 push

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

Nota

Os aplicativos não são automaticamente cancelados das notificações por push ao fazer 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")
    }
}

Desativar o push interno para chamadas recebidas

Há 2 maneiras pelas quais uma carga push de uma chamada recebida pode ser entregue ao destinatário.

  • Usando APNS e registrando o token do dispositivo com a API mencionada acima, registerPushNotification em CallAgent ou TeamsCallAgent.
  • Quando um CallAgent ou TeamsCallAgent é criado, o SDK também se registra em um serviço interno para obter a carga útil por push entregue.

Usando a propriedade disableInternalPushForIncomingCall em CallAgentOptions ou TeamsCallAgentOptions é possível instruir o SDK para desativar a entrega da carga de push usando o serviço de push interno.

let options = CallAgentOptions()
options.disableInternalPushForIncomingCall = true

Configure o seu sistema

Criar o projeto do Visual Studio

Para um aplicativo UWP, no Visual Studio 2022, crie um novo projeto Aplicativo em Branco (Universal Windows ). Depois de inserir o nome do projeto, sinta-se à 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. É necessário o SDK de Aplicativos Windows versão 1.3 ou posterior.

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

As APIs e bibliotecas 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 NuGet do SDK de chamada:

  1. Abra o Gerenciador de Pacotes NuGet selecionando Ferramentas>Gerenciador>de Pacotes NuGet Gerenciar Pacotes NuGet para Solução.
  2. Selecione Procurar e, em seguida, introduza 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 Azure.Communication.Calling.WindowsClient pacote e, em seguida, selecione Azure.Communication.Calling.WindowsClient 1.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 do lado direito.
  6. Selecione o botão Instalar .

Descrição geral

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

Nota

Para se registrar para notificações por push e lidar com as notificações por push para um ponto de extremidade de equipes personalizado (CTE), as APIs são as mesmas. As APIs descritas abaixo também podem ser invocadas na classe ou TeamsCallAgent para Custom CommonCallAgent Teams Endpoint (CTE).

Configurar notificações por push

Uma notificação por push é a notificação pop-up que você recebe no seu dispositivo. Para chamadas, vamos nos concentrar em notificações push VoIP (voz sobre protocolo de Internet).

As seções a seguir descrevem como registrar, manipular e mostrar uma notificação do Windows para atender/recusar uma chamada de entrada. Antes de iniciar essas tarefas, preencha estes pré-requisitos:

  1. Siga o Tutorial: Enviar notificações para aplicativos da Plataforma Universal do Windows usando os Hubs de Notificação do Azure. Depois de seguir este tutorial, você tem:

    • Um aplicativo que tem o WindowsAzure.Messaging.Managed e Microsoft.Toolkit.Uwp.Notifications pacotes.
    • Um nome de Hub PNH do Azure (Hub de Notificações por Push) referenciado como <AZURE_PNH_HUB_NAME> e a Cadeia de Conexão PNH do Azure referenciada como <AZURE_PNH_HUB_CONNECTION_STRING> neste início rápido.
  2. Para se registrar em um canal WNS (Serviço de Notificação do Windows) em cada entrada do aplicativo, certifique-se de adicionar o código de inicialização no 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 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;
    }
}

Registe-se para receber notificações push

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

O registro para 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;

Lidar com notificações por push

Para receber notificações por push para chamadas recebidas, chame handlePushNotification() uma CallAgent instância com uma carga útil 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 de entrada no CallAgent que mostra a notificação de chamada de entrada.

// 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 para manipular a pressão do 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óximos passos