Zoom Video SDK を使ってみる①


この記事は[フラー株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fuller-inc)の 21日目の記事です。

オンライン会議がどの業界でも一般的になってきた中で、オンラインミーティングアプリの開発需要もあると思います。
そんな中で、Zoomがオンラインミーティング用のSDKを提供しているので、試してみました。
Zoom社には[Zoom Meeting SDK](https://marketplace.zoom.us/docs/sdk/native-sdks/introduction)と[Zoom Video SDK](https://marketplace.zoom.us/docs/sdk/video/introduction/)がありますが、今回はVideo SDKを使用しています。
（前はMeeting SDKの方はClient SDKって名前だった気がするけど、まあ細かいことは置いときます。）

##1.Video SDKとは？

そもそもSDKが２つかるということですが、違いはなんなのか気になります。公式サイトに[比較表](https://marketplace.zoom.us/docs/sdk/overview/compare)があったので見てみます。

機能としてみると、VideoSDKは
1.従来のミーティングとの互換性なし
2.ユーザのログイン機能もなし（従来のZoomアカウントを使い回せない）
3.Rawビデオ/オーディオデータを利用可能
という特徴があるようです。
ユーザにZoomを意識させずに使わせられるよという意図がありそうですね。

|  | Video SDKs  |  Meeting SDKs |
| ---- | ---- | ---- |
| ZoomMeetingsとの互換性 |  なし  |  あり |
| ユーザログイン |  なし  |  Email login, SSO login, Zoom Access Token (ZAK)  |
| Raw ビデオ/オーディオデータ |  Android、iOS、Windows、macOSで利用可能  |  なし  |
| エンドツーエンド暗号化（E2EE） |  なし  |  Android、iOS、Windows、macOSで利用できます。Webでは利用できません。  |

ちなみにVideo SDKを利用するには、[Video SDK Plan](https://marketplace.zoom.us/docs/sdk/video/developer-accounts)に加入が必要です。
クレジットカードの登録は必要ですが、月10,000分まで無料の従量課金プランがあるので、ちょっと試してみたい場合はそちらがオススメです。

アカウントを作成したら、Zoom Developerのページの[Create App]からアプリで使用するSDKの資格情報が入手できます。ちなみに１アカウントで１つまでしか作れず、作成済みの場合は↓のように表示されます。
![スクリーンショット 2021-12-25 20.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329127/c05aa854-30df-06db-6a3a-8d26635bb8ee.png)

また、アプリでZoomのセッションを作成するには、SDKの資格情報（key & secret）からJWTTokenを作成する必要がありますが、Tokenの有効期限は最大2日となっていますので、まずは触ってみたいレベルであれば、公式リファレンスでもレコメンドされてる[JWT.io libraries](https://jwt.io/#libraries-io )からぽちぽち温かみのある手作業で生成で良いと思います。

##2.Video SDKを組み込む

SDKを利用するために、SDKの初期化を行い、`ZoomVideoSDKInitParams`オブジェクトを作成した後、SDKで初期化関数を呼び出し、正しく初期化されたことを確認します。

```swift
import UIKit
import ZoomInstantSDK

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // zoom SDK
        initZoomSDK()
        return true
    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication,
                     configurationForConnecting connectingSceneSession: UISceneSession,
                     options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {}

    func initZoomSDK() {　　　　　
        // SDKの初期化
        let initParams = ZoomInstantSDKInitParams()
        initParams.domain = "zoom.us"
        initParams.enableLog = true

        let sdkInitReturnStatus = ZoomInstantSDK.shareInstance()?.initialize(initParams)

        switch sdkInitReturnStatus {
        case .Errors_Success:
            print("SDK initialized successfully")
        default:
            if let error = sdkInitReturnStatus {
                print("SDK failed to initialize: \(error)")
            }
        }
    }

}

```
次に、ViewController側で`ZoomVideoSDKDelegate`のインスタンスを作成し、クラスを`ZoomVideoSDKDelegate`プロトコルに準拠させます。
その後、`sessionContext.token`に先ほど作成したJWTTokenを入力し、`sessionName`などのsessionContextの情報を入力し、`ZoomVideoSDK.shareInstance()?.joinSession() `でミーティングセッションに参加します。

sessionContextのプロパティ

| プロパティ名 | 役割 |
| ---- | ---- |
| sessionName | セッションの名前と一意の識別子。JWTTokenを生成時に設定したセッション名を使います。 |
| userName | セッションに表示されているユーザーの名前。長さに制約はありませんが、実運用では文字数制限してあげた方がいい気がします。 |
| token |  資格情報から生成したJWT TOkenを入力  |
| sessionPassword |  セッションのパスワード。設定されている場合、セッションはプライベートになり、ユーザーが有効なパスワードを提供した場合にのみ参加できます。設定されていない場合、セッションは公開され、セッション名を持つすべての人がセッションに参加できます。このフィールドの最大長は10文字に制限されています。 |

```swift
import UIKit
import ZoomInstantSDK

class ZoomScreenViewController: UIViewController {

 
    override func viewDidLoad() {
        super.viewDidLoad()
        setupZoomSettings()
    }
    func setupZoomSettings() {
        ZoomInstantSDK.shareInstance()?.delegate = self
        let sessionContext = ZoomInstantSDKSessionContext()
        sessionContext.token = "YOUR_TOKEN"
        sessionContext.sessionName = "your Session Name"
        sessionContext.userName = "Your User Name"
        sessionContext.sessionPassword = "Your Password"
        if let session = ZoomVideoSDK.shareInstance()?.joinSession(sessionContext) {
        // Session joined successfully.
        }
    }

```


#終わりに
ZoomさんSwiftのサンプル置いてくれてないし、公式ドキュメントが読みづらくて遅々としか進まなくてツラみがあります。。。ここまででセッションの開始まではできましたが、ユーザの取得、ユーザのビデオ表示などはまた次回書きます。