Azure Communication Servicesを試す

# 1. 概要
仲間内でAzure Communication Services のiOS 用のグループ通話のヒーロー サンプルを動かしてみたいという話があり、Azureをさっぱり知らないのでまずはWeb版から動かしてみる。
2022/09/04時点

# 2. 準備
# 2.1 参考情報
ここを参考として紹介されたが、Azureに詳しい人なのか、記事の時期のせいなのか何かしらの違いを感じた。
[【爆速】Azure Communication Services を早速試してみた！](https://qiita.com/komiyasa/items/bb74b4e4178ceb99199d)

# 2.2. アカウント作成
Microsoftアカウント、Azureアカウントは作成できているものとする。Microsoftアカウントを既にもっていたので、メールアドレスとかを入れるだけで済んでしまい、一からの手順で困る点は不明。

# Azureにログインと確認
Azureにログインする
https://portal.azure.com/#home

こんな画面のはず。新規アカウントだと何もない。
1, 2年前のブログ等だと表示が英語のものがある。ブラウザで翻訳していないが。日本語なので情報源との一致がとりにくい。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/f84a550c-46c4-bffc-d9b7-b5ec4599ef03.png)

# 3. リソースの確保
自分が立ち上げたいサービスのためのリソースを確保しなければならない。今回使うのは、「Azure Communication Services」となる。
検索窓に「Azure Communication Services」で検索して出てくる Communication Services
での「リソースの作成」を行う。
他の情報源では、検索してもうまく見つからないケースがあったようだ。あと、通信サービスと翻訳されて表示されていたりもした。(ブラウザの翻訳機能によるものではない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/4b35fd27-3b4e-d511-ca49-a3499f4a0c13.png)

リソースグループをどうすべきかよく分からないが、とりあえず新規作成して名前を付けた。
そうすると、「リソース グループの位置情報」が出てきたので、「Japan East」とした。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/39e8da53-22a2-78e5-cd61-6d00281243d9.png)

米国に～と注意みたいのが出ているが、今回はとりあえずの動作が目的なのでほっておく。

作ったばかりのアカウントなので、リソースの作成の開始でエラーは出ないと思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/289910c9-89a8-b355-085c-8c114fc3d58f.png)

デプロイは多分1,2分で終わる。デプロイの完了の後に「リソースに移動」をクリックして、リソースに移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/3c7d0821-ae69-0b0f-2444-31a2e08f5251.png)

設定->キーに移動する。
「エンドポイント」、主キーの「キー」と「接続文字列」をメモしておく。
※資料によっては、KeyとConnection stringになっている。そのままなのだが、検索すると引っかからない。

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/4da9ed5f-9e75-6237-deb3-afc88b9942ba.png)

# 4. サンプルコードを試してみる。
[ここ](https://docs.microsoft.com/ja-jp/azure/communication-services/Samples/calling-hero-sample?pivots=platform-web)の公式サンプルを使う。
iOSですぐに試すと何が起きるか予想できないので、まずは「Web版」

## 4.1. Web版
### 4.1.1 デプロイする
Webを選んでいる状態（デフォルト）で、「Deploy to Azure」をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/37e9b08f-0090-1ff5-d848-34db07bb6d0c.png)

「リソース グループ」は新規作成で作った名前。
「App Name」は自分でつけるサービス名。とりあえずならなんでもよいはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/ba70502e-4903-0f46-8c66-be1698641969.png)

画面下側の「確認と作成」に進み、検証が終わったら「作成」する。
こちらは最初のデプロイより長いがせいぜい5分までで終わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/49f2ecbe-12e6-fdda-b1a8-3a7236471f24.png)

### 4.1.2 使ってみる。
デプロイ完了後、「リソースに移動」してみる。が、動いているサービスがどれか分からない。。。

色々探してみて、リソースグループの「App Name」でつけたリソースに移動するとサービスのURLらしき
情報を見つけたので、クリックしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/79ebb272-67c8-4fbd-b00c-32fde1ca246a.png)

とりあえずサービスは起動できているようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/0016c113-404f-bead-131e-ebaac7e7b9e4.png)

## 4.2 iOS版
使用機器: MacBook Air (M1, 2020), macOS Monterey 12.5.1
Xcode 13.3
以下のソースコードを取得。

https://github.com/Azure-Samples/communication-services-ios-calling-hero

指示通り、pod installをソースのトップディレクトリで行ってからAzureCalling.xcworkspaceをXcodeで開き、ビルドしたところ、エラーが出た。
ソースコードの変更が必要だとしても現段階ではやりたくない。あくまでiPhoneなどで動作確認をしたいだけである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/0cddba01-2cf7-f1dc-7a38-d6bd29e38557.png)

どうやらシミュレータを選択しているのが良くなかった。このビルド環境ではソースコードからシミュレータ用をビルドできないようだ。デバイスを「Any iOS Device (arm64)」に変更したところ、ビルドエラーがなくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/663df1c2-3783-5eb8-be19-67e1a2ec8fba.png)

AzureCallingのSigning&CapabilitiesにあるBundle Identifierの値が原因でエラーとなることがある。ネット上の情報に従い、日付などを付けると回避できるが、今回は後述の箇所でサーバー側エラー要因となったので注意したい。
例) com.azure.samples.communication.calling -> com.azure.samples.communication.calling0924

### 4.2.1. アプリがハングアップする
iOSアプリをiPhoneで動作させるまではいけるが、その後のCall操作でアプリがハングアップした。
AzureCalling/External/Calling/TokenService.swift内の「JSON Parsing of the token response failed.～」の箇所である。設定値として記載されているcommunicationTokenFetchUrlに使えそうな値を色々いれてみたが、結果は変わらずエラーであった。つまりよく分からない。

そこで、「(Optional) Securing an authentication endpoint」の項目、日本語約だと「(省略可) 認証エンドポイントのセキュリティを確保する」となっている項目を試すことにした。とりあえずテストする分には不要だろうと判断していた作業である。

#### 4.2.1.1. アプリを Azure Active Directory に登録する (iOS または macOS プラットフォームの設定を使用)
「アプリケーションの登録」の登録のところだけ行った。
バンドルIDは、上述の通り「com.azure.samples.communication.calling」とする。MacOSでビルドの際の変更していてもサンプルコードの最初のままとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/ce1fcd79-0f42-fc03-e1bf-4f3573f04241.png)


#### 4.2.1.2. Azure AD ログインを使用するように App Service または Azure Functions アプリを構成する
以下の公式の手順にしたがって設定する。

https://learn.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad

自分は以下の箇所から入った。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/4c50c207-c2be-1325-55aa-3f38f203be1b.png)

アプリのURL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/b923456e-e153-46fd-54d1-98e3d9418a4d.png)

なぜ2つ出来てしまったのかよく分からないが、2つ出来た。接続に使用したのは上の方。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/eb37cf65-07a3-4312-f7a8-07ffc8defecd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/dc68651a-89ea-d2dc-eaf9-cff32f1aceaa.png)

シングルテナントだとエラーが出てしまったので、ここは後から**マルチテナント**に変更した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/09afbc44-1df9-9d85-ea6b-74cbb9dd609a.png)

「App Service アプリで Azure Active Directory を有効にする」の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/e2f8f511-4d9f-48e2-df3a-c7344666e2d0.png)

#### 4.2.1.3. ユーザー追加
実験用のユーザーを追加する。これはぱっと見で公式資料に書いてないような？
ホーム>Azure Active Directoryに移動し、左側のユーザーから管理画面に入る。

結果は以下のようになるはず。尚、パスワード設定をしたが、最初の使用(サインイン)時に変更を求められた。関係する設定があるのかは確かめていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/5f3e95ef-031a-c623-1ae0-b70504ff9267.png)

#### 4.2.1.3. AppSettings.xcconfig

動作したときのAppSettings.xcconfig は以下になった。URLにはMacOSでビルドする際のバンドルIDの日付が入った状態。いずれの値もアプリ(この記事内だとcomm-sample1)の概要から確認できる値。
communicationTokenFetchUrlは未だによく分からない。

```
communicationTokenFetchUrl = msauthcom.azure.samples.communication.calling0924
aadClientId = e9d3bd6f-8b18-4ee8-9406-d～略～
aadTenantId = 6dba2d58-595d-474d-9c14-e～略～
```
リビルドして問題なければ動作するはず。

:::note info
communicationTokenFetchUrlについて分かったので別記事参照（2024/05/28追記）
:::
https://qiita.com/tetsuoMikami/items/52f73575758c9a74d0e4



# 5. 予定
* iOS版を動かす。(2022/09/11 ビルドまで)
* Azureについてもうちょっと勉強して初心者が躓きやすい点について補足する。