Краткое руководство. Добавление функции голосового вызова в приложение

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

Важно!

Выполните обновление до пакета вызовов SDK для вызовов версии 1.1.0 (или более новой) Служб коммуникации Azure для JavaScript до 31 июля 2021 г.

API-интерфейс протокола SDP в плане B объявлен нерекомендуемым. Чтобы это событие не затронуло ваших пользователей, обновите пакеты SDK для вызовов Служб коммуникации до версии 1.1.0 (или более новой) до 31 июля 2021 г. Дополнительные сведения см. в заметках о выпуске библиотеки вызовов.

Важно!

Службы коммуникации Azure не поддерживают вызовы экстренной помощи

Службы исходящих голосовых звонков в Службах коммуникации Azure нельзя использовать для вызова служб экстренной помощи. Для таких вызов используйте стандартную телефонную связь.

Из этого краткого руководства вы узнаете, как начать вызов с помощью пакета SDK Служб коммуникации Azure для вызовов для ОС Windows.

Пример кода

Пример приложения можно загрузить в репозитории GitHub.

Предварительные требования

Для работы с этим руководством вам потребуется:

Настройка

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

Создайте в Visual Studio новый проект с помощью шаблона Пустое приложение (универсальное приложение Windows) , чтобы настроить одностраничное приложение универсальной платформы Windows (UWP).

Снимок экрана с окном создания проекта в Visual Studio

Установка пакета

Щелкните проект правой кнопкой мыши и выберите Manage Nuget Packages, чтобы установить Azure.Communication.Calling.

Запрос доступа

Перейдите к Package.appxmanifest и щелкните Capabilities. Установите флажок Internet (Client & Server), чтобы получить входящий и исходящий доступ в Интернет. Установите флажок Microphone, чтобы получить доступ к звуковому каналу микрофона.

Снимок экрана, показывающий запрос доступа к Интернету и микрофону в Visual Studio

Настройка платформы приложения

Необходимо настроить базовую структуру для подключения нашей логики. Чтобы совершить исходящий звонок, потребуется TextBox, где будет указан ИД пользователя вызываемого абонента. Будут также необходимы кнопки Start Call и Hang Up. Откройте MainPage.xaml проекта и добавьте узел StackPanel в Page.

<Page
    x:Class="CallingQuickstart.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CallingQuickstart"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBox Text="Who would you like to call?" TextWrapping="Wrap" x:Name="CalleeTextBox" Margin="10,10,10,10"></TextBox>
        <Button Content="Start Call" Click="CallButton_ClickAsync" x:Name="CallButton" Margin="10,10,10,10"></Button>
        <Button Content="Hang Up" Click="HangupButton_Click" x:Name="HangupButton" Margin="10,10,10,10"></Button>
    </StackPanel>
</Page>

Откройте файл MainPage.xaml.cs и замените его содержимое следующей реализацией.

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

using Azure.Communication;
using Azure.Communication.Calling;

namespace CallingQuickstart
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            this.InitCallAgent();
        }
        
        private async void InitCallAgent()
        {
            // Create Call Client and initialize Call Agent
        }
        
        private async void CallButton_ClickAsync(object sender, RoutedEventArgs e)
        {
            // Start call
        }

        private async void HangupButton_Click(object sender, RoutedEventArgs e)
        {
            // End the current call
        }

        CallClient call_client_;
        CallAgent call_agent_;
        Call call_;
    }
}

Объектная модель

Следующие классы и интерфейсы реализуют некоторые основные функции пакета SDK Служб коммуникации Azure для вызовов.

Имя Описание
CallClient CallClient — это основная точка входа в пакет SDK для вызовов.
CallAgent CallAgent используется для инициирования вызовов и управления ими.
CommunicationTokenCredential CommunicationTokenCredential используется в качестве учетных данных маркера для создания экземпляра CallAgent.
CommunicationUserIdentifier CommunicationUserIdentifier используется для представления идентификатора пользователя, который может иметь один из следующих типов: CommunicationUserIdentifier, PhoneNumberIdentifier или CallingApplication.

Аутентификация клиента

Инициализируйте экземпляр CallAgent с помощью маркера доступа пользователя, что позволит нам выполнять и принимать вызовы.

В следующем фрагменте кода замените <USER_ACCESS_TOKEN> маркером доступа пользователя. Если у вас еще нет доступного маркера, см. документацию по маркеру доступа пользователя.

Добавьте в функцию InitCallAgent следующий код.

CommunicationTokenCredential token_credential = new CommunicationTokenCredential("<USER_ACCESS_TOKEN>");
call_client_ = new CallClient();

CallAgentOptions callAgentOptions = new CallAgentOptions()
{
    DisplayName = "<YOUR_DISPLAY_NAME>"
};
call_agent_ = await call_client_.CreateCallAgent(token_credential, callAgentOptions);

Инициирование вызова

Добавьте реализацию в CallButton_ClickAsync, чтобы начать вызов с call_agent, созданным нами.

StartCallOptions startCallOptions = new StartCallOptions();
ICommunicationIdentifier[] callees = new ICommunicationIdentifier[1]
{
    new CommunicationUserIdentifier(CalleeTextBox.Text)
};
call_ = await call_agent_.StartCallAsync(callees, startCallOptions);

Завершение вызова

Текущий вызов завершается при нажатии кнопки Hang Up.

await call_.HangUpAsync(new HangUpOptions());

Выполнение кода

Вы можете выполнить сборку и запустить код в Visual Studio. Учтите, что в качестве платформ решения поддерживаются ARM64, x64 и x86.

Вы можете выполнить исходящий вызов, указав идентификатор пользователя в текстовом поле и нажав кнопку Start Call. При вызове 8:echo123 вы будете подключены к эхо-боту, что позволит начать работу и проверить работоспособность ваших аудиоустройств.

Снимок экрана, показывающий запуск приложения краткого руководства

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

Образец кода

Пример приложения можно скачать в репозитории GitHub.

Предварительные требования

Настройка

создание приложения Node.js;

Откройте терминал или командное окно, создайте каталог для своего приложения и перейдите к нему.

mkdir calling-quickstart && cd calling-quickstart

Воспользуйтесь командой npm init -y, чтобы создать файл package.json с параметрами по умолчанию.

npm init -y

Установка пакета

Используйте команду npm install, чтобы установить пакет SDK Служб коммуникации Azure для реализации вызовов на JavaScript.

npm install @azure/communication-common --save
npm install @azure/communication-calling@1.1.0 --save

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

"webpack": "^4.42.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"

Параметр --save указывает библиотеку как зависимость в файле пакета package.json.

Настройка платформы приложения

В этом кратком руководстве для объединения ресурсов приложения используется webpack. Выполните следующую команду, чтобы установить пакеты npm webpack, webpack-cli и webpack-dev-server, а также указать их в качестве зависимостей разработки в файле package.json:

npm install webpack@4.42.0 webpack-cli@3.3.11 webpack-dev-server@3.10.3 --save-dev

Создайте файл index.html в корневом каталоге проекта. Мы будем использовать этот файл для настройки базового макета, с помощью которого пользователь сможет выполнить вызов.

Вот этот код:

<!DOCTYPE html>
<html>
  <head>
    <title>Communication Client - Calling Sample</title>
  </head>
  <body>
    <h4>Azure Communication Services</h4>
    <h1>Calling Quickstart</h1>
    <input 
      id="token-input"
      type="text"
      placeholder="User access token"
      style="margin-bottom:1em; width: 200px;"
    />
    </div>
    <button id="token-submit" type="button">
        Submit
    </button>
    <input 
      id="callee-id-input"
      type="text"
      placeholder="Who would you like to call?"
      style="margin-bottom:1em; width: 200px; display: block;"
    />
    <div>
      <button id="call-button" type="button" disabled="true">
        Start Call
      </button>
      &nbsp;
      <button id="hang-up-button" type="button" disabled="true">
        Hang Up
      </button>
    </div>
    <script src="./bundle.js"></script>
  </body>
</html>

Создайте файл в корневом каталоге проекта с именем client.js, чтобы включить логику приложения для этого краткого руководства. Добавьте следующий код, чтобы импортировать клиент вызова и получить ссылки на элементы модели DOM, чтобы мы могли присоединить нашу бизнес-логику.

import { CallClient, CallAgent } from "@azure/communication-calling";
import { AzureCommunicationTokenCredential } from '@azure/communication-common';

let call;
let callAgent;
let tokenCredential = "";
const userToken = document.getElementById("token-input");
const calleeInput = document.getElementById("callee-id-input");
const submitToken = document.getElementById("token-submit");
const callButton = document.getElementById("call-button");
const hangUpButton = document.getElementById("hang-up-button");

Объектная модель

Следующие классы и интерфейсы реализуют некоторые основные функции пакета SDK Служб коммуникации Azure для вызовов.

Имя Описание
CallClient CallClient — это основная точка входа в пакет SDK для вызовов.
CallAgent CallAgent используется для инициирования вызовов и управления ими.
AzureCommunicationTokenCredential Класс AzureCommunicationTokenCredential реализует интерфейс CommunicationTokenCredential, который используется для создания экземпляра CallAgent.

Аутентификация клиента

Введите допустимый маркер доступа пользователя для ресурса в текстовом поле и нажмите кнопку "Отправить". Если у вас еще нет доступного маркера, см. документацию по маркеру доступа пользователя. С помощью CallClient инициализируйте экземпляр CallAgent с CommunicationTokenCredential, который позволит нам выполнять и принимать вызовы.

Добавьте следующий код в файл client.js:

submitToken.addEventListener("click", async () => {
  const callClient = new CallClient(); 
  const userTokenCredential = userToken.value;
    try {
      tokenCredential = new AzureCommunicationTokenCredential(userTokenCredential);
      callAgent = await callClient.createCallAgent(tokenCredential);
      callButton.disabled = false;
      submitToken.disabled = true;
    } catch(error) {
      window.alert("Please submit a valid token!");
    }
})

Инициирование вызова

Добавьте обработчик событий для инициации вызова при нажатии callButton:

callButton.addEventListener("click", () => {
    // start a call
    const userToCall = calleeInput.value;
    // To call an ACS communication user, use {communicationUserId: 'ACS_USER_ID'}.
    // To call echobot, use {id: '8:echo123'}.
    call = callAgent.startCall(
        [{ communicationUserId: userToCall }],
        {}
    );
    // toggle button states
    hangUpButton.disabled = false;
    callButton.disabled = true;
});

Завершение вызова

Добавьте прослушиватель событий для завершения текущего вызова при нажатии hangUpButton:

hangUpButton.addEventListener("click", () => {
  // end the current call
  call.hangUp({ forEveryone: true });

  // toggle button states
  hangUpButton.disabled = true;
  callButton.disabled = false;
  submitToken.disabled = false;
});

Свойство forEveryone позволяет завершить вызов для всех его участников.

Выполнение кода

Чтобы создать и запустить приложение, используйте webpack-dev-server. Выполните следующую команду, чтобы создать пакет узла приложения на локальном веб-сервере:

npx webpack-dev-server --entry ./client.js --output bundle.js --debug --devtool inline-source-map

Откройте веб-браузер и перейдите по адресу http://localhost:8080/. Вы увидите следующее:

Снимок экрана: готовое приложение JavaScript.

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

При вызове 8:echo123 вы будете подключены к эхо-боту, что позволит начать работу и проверить работоспособность ваших аудиоустройств. Передайте {id: '8:echo123'} в API CallAgent.startCall(), чтобы вызвать эхо-бота. Чтобы вызвать пользователя ACS, передайте {communicationUserId: 'ACS_USER_ID'} в API CallAgent.startCall().

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

Пример кода

Пример приложения можно загрузить в репозитории GitHub.

Предварительные требования

Настройка

Создание приложения Android с пустым действием

В Android Studio щелкните Start a new Android Studio project (Создать проект Android Studio).

Снимок экрана с выбранной кнопкой создания нового проекта в Android Studio.

Выберите шаблон проекта Empty Activity (Пустое действие) из раздела Phone and Tablet (Телефон и планшет).

Снимок экрана с экраном шаблона проекта, где выбран вариант Empty Activity (Пустое действие).

Выберите минимальную версию пакета SDK: "API 26: Android 8.0 (Oreo)" или более позднюю.

Снимок экрана с экраном шаблона проекта, где выбран вариант Empty Activity (Пустое действие) (2).

Установка пакета

Выберите build.gradle на уровне проекта и добавьте mavenCentral() в список репозиториев в разделах buildscript и allprojects.

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

Затем добавьте в build.gradle на уровне модуля следующие строки в разделах dependencies и android.

android {
    ...
    packagingOptions {
        pickFirst  'META-INF/*'
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

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

Добавление разрешений в манифест приложения

Чтобы запросить разрешения, необходимые для выполнения вызова, их нужно сначала объявить в манифесте приложения (app/src/main/AndroidManifest.xml). Замените содержимое этого файла приведенным ниже:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.contoso.acsquickstart">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!--Our Calling SDK depends on the Apache HTTP SDK.
When targeting Android SDK 28+, this library needs to be explicitly referenced.
See https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p-->
        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
    

Настройка макета для приложения

Нам нужны два элемента: текстовое поле для идентификатора вызываемого участника и кнопка для начала вызова. Их можно добавить с помощью конструктора или прямым редактированием XML-документа макета. Создайте кнопку с идентификатором call_button и текстовое поле callee_id. Перейдите к app/src/main/res/layout/activity_main.xml и замените содержимое этого файла приведенным ниже:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/call_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:text="Call"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@+id/callee_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Callee Id"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/call_button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Создание шаблонов и привязок для основных событий

После создания макета вы можете добавить в действие привязки и основные шаблоны. Действие будет обрабатывать запросы разрешений в среде выполнения, создавать агент вызова и выполнять вызов при нажатии кнопки. Каждый из этих элементов рассматривается в отдельном разделе. Мы переопределим метод onCreate, добавив вызов getAllPermissions и createAgent, а также привязки для кнопки вызова. Это будет происходить только один раз при создании действия. Дополнительные сведения о onCreate см. в руководстве Сведения о жизненном цикле действий.

Перейдите к файлу MainActivity.java и замените его содержимое следующим кодом:

package com.contoso.acsquickstart;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.media.AudioManager;
import android.Manifest;
import android.content.pm.PackageManager;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.azure.android.communication.common.CommunicationUserIdentifier;
import com.azure.android.communication.common.CommunicationTokenCredential;
import com.azure.android.communication.calling.CallAgent;
import com.azure.android.communication.calling.CallClient;
import com.azure.android.communication.calling.StartCallOptions;


import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    
    private CallAgent callAgent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getAllPermissions();
        createAgent();
        
        // Bind call button to call `startCall`
        Button callButton = findViewById(R.id.call_button);
        callButton.setOnClickListener(l -> startCall());
        
        setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
    }

    /**
     * Request each required permission if the app doesn't already have it.
     */
    private void getAllPermissions() {
        // See section on requesting permissions
    }

    /**
      * Create the call agent for placing calls
      */
    private void createAgent() {
        // See section on creating the call agent
    }

    /**
     * Place a call to the callee id provided in `callee_id` text input.
     */
    private void startCall() {
        // See section on starting the call
    }
}

Запрос разрешений во время выполнения

В Android 6.0 и более поздних версий (API уровня 23) или targetSdkVersion версии 23 или более поздней разрешения предоставляются не при установке приложения, а во время выполнения. С целью поддержки этого механизма можно реализовать getAllPermissions для вызова ActivityCompat.checkSelfPermission и ActivityCompat.requestPermissions для каждого необходимого разрешения.

/**
 * Request each required permission if the app doesn't already have it.
 */
private void getAllPermissions() {
    String[] requiredPermissions = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE};
    ArrayList<String> permissionsToAskFor = new ArrayList<>();
    for (String permission : requiredPermissions) {
        if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsToAskFor.add(permission);
        }
    }
    if (!permissionsToAskFor.isEmpty()) {
        ActivityCompat.requestPermissions(this, permissionsToAskFor.toArray(new String[0]), 1);
    }
}

Примечание

При проектировании приложения учитывайте, когда будут запрошены такие разрешения. Разрешения следует запрашивать по мере необходимости, а не заранее. Дополнительные сведения см. в руководстве по разрешениям Android.

Объектная модель

Следующие классы и интерфейсы реализуют некоторые основные функции пакета SDK Служб коммуникации Azure для вызовов.

Имя Описание
CallClient CallClient — это основная точка входа в пакет SDK для вызовов.
CallAgent CallAgent используется для инициирования вызовов и управления ими.
CommunicationTokenCredential CommunicationTokenCredential используется в качестве учетных данных маркера для создания экземпляра CallAgent.
CommunicationIdentifier CommunicationIdentifier используется в качестве участника другого типа, который может быть частью вызова.

Создание агента на основе маркера доступа пользователя

Наличие маркера пользователя позволяет создать экземпляр агента вызова, подлинность которого проверена. Как правило, этот маркер создается в службе, которая отвечает за аутентификацию для приложения. Дополнительные сведения о маркерах доступа пользователей см. в этом руководстве.

Для целей этого краткого руководства замените <User_Access_Token> маркером доступа пользователя, который был создан для вашего ресурса Службы коммуникации Azure.


/**
 * Create the call agent for placing calls
 */
private void createAgent() {
    String userToken = "<User_Access_Token>";

    try {
        CommunicationTokenCredential credential = new CommunicationTokenCredential(userToken);
        callAgent = new CallClient().createCallAgent(getApplicationContext(), credential).get();
    } catch (Exception ex) {
        Toast.makeText(getApplicationContext(), "Failed to create call agent.", Toast.LENGTH_SHORT).show();
    }
}

Инициирование вызова с помощью агента вызовов

Вызов можно выполнить через агент вызова — для этого достаточно предоставить список идентификаторов вызываемых участников и параметры вызова. Для примера в этом кратком руководстве используются параметры вызова по умолчанию, без поддержки видео, и один идентификатор вызываемого участника из текстового поля.

/**
 * Place a call to the callee id provided in `callee_id` text input.
 */
private void startCall() {
    EditText calleeIdView = findViewById(R.id.callee_id);
    String calleeId = calleeIdView.getText().toString();
    
    StartCallOptions options = new StartCallOptions();

    callAgent.startCall(
        getApplicationContext(),
        new CommunicationUserIdentifier[] {new CommunicationUserIdentifier(calleeId)},
        options);
}

Запуск приложения и вызов эхо-бота

Теперь вы можете запустить приложение с помощью кнопки Run App (Запустить приложение) на панели инструментов или нажав клавиши SHIFT+F10. Убедитесь, что вы можете выполнять вызовы, инициировав вызов к 8:echo123. В ответ вы должны услышать предварительно записанное сообщение и повтор сказанного вами сообщения.

Снимок экрана с готовым приложением.

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

Пример кода

Пример приложения можно загрузить в репозитории GitHub.

Предварительные требования

Для работы с этим руководством вам потребуется:

Настройка

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

В Xcode создайте новый проект iOS и выберите шаблон Single View App (Приложение с одним представлением). В этом руководстве используется платформа SwiftUI, поэтому для параметра Language (Язык) нужно задать значение Swift, а для параметра User Interface (Пользовательский интерфейс) — значение SwiftUI. В рамках этого краткого руководства вы не будете создавать тесты. Вы можете снять флажок Include Tests (Включить тесты).

Снимок экрана с окном New Project (Новый проект) в Xcode.

Установка пакета и его зависимостей с помощью CocoaPods

  1. Чтобы создать Podfile для приложения, откройте терминал, перейдите в папку проекта и выполните команду:

    pod init

  2. Добавьте следующий код в Podfile и сохраните (убедитесь, что "target" соответствует имени проекта):

    platform :ios, '13.0'
    use_frameworks!
    
    target 'AzureCommunicationCallingSample' do
      pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  3. Выполните pod install.

  4. Откройте файл .xcworkspace с помощью Xcode.

Запрос доступа к микрофону

Чтобы получить доступ к микрофону устройства, вам необходимо указать ключ NSMicrophoneUsageDescription в списке свойств сведений приложения. Задайте связанное значение для строки string, которая будет включена в диалоговое окно, отображаемое системой при запрашивании доступа у пользователя.

В дереве проекта щелкните правой кнопкой мыши запись Info.plist и выберите Open As > Source Code (Открыть как > Исходный код). Добавьте в раздел верхнего уровня <dict> следующие строки, а затем сохраните файл.

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

Настройка платформы приложения

Откройте файл ContentView.swift проекта и добавьте объявление import в начало файла, чтобы импортировать AzureCommunicationCalling library. Кроме того, импортируйте AVFoundation, чтобы мы могли реализовать в коде запрос на доступ к аудио.

import AzureCommunicationCalling
import AVFoundation

Замените реализацию структуры ContentView простыми элементами управления пользовательского интерфейса, которые позволяют начать и завершить вызов. В рамках этого краткого руководства к таким элементам управления мы присоединим бизнес-логику.

struct ContentView: View {
    @State var callee: String = ""
    @State var callClient: CallClient?
    @State var callAgent: CallAgent?
    @State var call: Call?

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Who would you like to call?", text: $callee)
                    Button(action: startCall) {
                        Text("Start Call")
                    }.disabled(callAgent == nil)
                    Button(action: endCall) {
                        Text("End Call")
                    }.disabled(call == nil)
                }
            }
            .navigationBarTitle("Calling Quickstart")
        }.onAppear {
            // Initialize call agent
        }
    }

    func startCall() {
        // Ask permissions
        AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
            if granted {
                // Add start call logic
            }
        }
    }

    func endCall() {
        // Add end call logic
    }
}

Объектная модель

Следующие классы и интерфейсы реализуют некоторые основные функции пакета SDK Служб коммуникации Azure для вызовов.

Имя Описание
CallClient CallClient — это основная точка входа в пакет SDK для вызовов.
CallAgent CallAgent используется для инициирования вызовов и управления ими.
CommunicationTokenCredential CommunicationTokenCredential используется в качестве учетных данных маркера для создания экземпляра CallAgent.
CommunicationUserIdentifier CommunicationUserIdentifier используется для представления идентификатора пользователя, который может иметь один из следующих типов: CommunicationUserIdentifier, PhoneNumberIdentifier или CallingApplication.

Аутентификация клиента

Инициализируйте экземпляр CallAgent с помощью маркера доступа пользователя, что позволит нам выполнять и принимать вызовы.

В приведенном ниже коде необходимо заменить <USER ACCESS TOKEN> допустимым маркером доступа пользователя для вашего ресурса. Если у вас еще нет доступного маркера, см. документацию по маркеру доступа пользователя.

Добавьте следующий код в обратный вызов onAppear в ContentView.swift:

var userCredential: CommunicationTokenCredential?
do {
    userCredential = try CommunicationTokenCredential(token: "<USER ACCESS TOKEN>")
} catch {
    print("ERROR: It was not possible to create user credential.")
    return
}

self.callClient = CallClient()

// Creates the call agent
self.callClient?.createCallAgent(userCredential: userCredential!) { (agent, error) in
    if error != nil {
        print("ERROR: It was not possible to create a call agent.")
        return
    }
    else {
        self.callAgent = agent
        print("Call agent successfully created.")
    }
}

Инициирование вызова

Метод startCall задан в качестве действия, которое будет выполняться при нажатии кнопки Начать вызов. Измените реализацию, чтобы вызов начинался с помощью ASACallAgent:

func startCall()
{
    // Ask permissions
    AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
        if granted {
            // start call logic
            let callees:[CommunicationIdentifier] = [CommunicationUserIdentifier(self.callee)]
            self.callAgent?.startCall(participants: callees, options: StartCallOptions()) { (call, error) in
                if (error == nil) {
                    self.call = call
                } else {
                    print("Failed to get call object")
                }
            }
        }
    }
}

Вы также можете использовать свойства в StartCallOptions, чтобы задать первоначальные параметры для вызова (т. е. можно начать вызов с отключенным микрофоном).

Завершение вызова

Реализуйте метод endCall, чтобы завершать текущий вызов при нажатии кнопки Завершить вызов.

func endCall()
{    
    self.call!.hangUp(options: HangUpOptions()) { (error) in
        if (error != nil) {
            print("ERROR: It was not possible to hangup the call.")
        }
    }
}

Выполнение кода

Вы можете создать и запустить свое приложение в симуляторе iOS, выбрав Product > Run (Продукт > Выполнить) или с помощью клавиш (⌘-R).

Окончательный вид приложения из этого краткого руководства

Вы можете выполнить исходящий VOIP-вызов, указав идентификатор пользователя в текстовом поле и нажав кнопку Начать вызов. При вызове 8:echo123 вы будете подключены к эхо-боту, что позволит начать работу и проверить работоспособность ваших аудиоустройств.

Примечание

При первом вызове в системе отобразится запрос на получение доступа к микрофону. В приложении в рабочей среде используйте API AVAudioSession для проверки состояния разрешения и корректно обновите поведение приложения, если разрешение не предоставлено.

Очистка ресурсов

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

Дальнейшие действия

Дополнительные сведения см. в следующих статьях: