Zoom App Marketplaceの審査に通るまで

7 min read読了の目安(約6400字

ZoomのApp Marketplaceにアプリの公開申請をおこない、20日間の試行錯誤の末に無事アプリを公開することができました。今回は審査に通るまでの大枠の流れと、その中での注意点をまとめようと思います。

Zoom App Marketplaceにアプリを公開するに至った理由

まずASKCHATとは、ユーザーがちょっとした隙間時間に、有料のパーソナルオンラインセッションを販売することが出来るサービスです。15分や30分などといった時間に、日頃の動画配信や、ライブ配信ではカバーできない「ひとりひとりの細い悩み」に対するアドバイスを行うことができます。

https://www.youtube.com/watch?v=AtavXDJ4xXk

オンラインセッションはZoomを介して行われるため、セッション作成時に専用のZoomリンクを発行しています。配信者と参加者が、セッションの開始時間にASKCHATから共通のZoomルームへ参加することによって、パーソナルなビデオ通話環境を提供します。Zoomリンクを搭載したセッションを作成するためには、あらかじめASKCHATアカウントと、当人のZoomアカウントを連携しておく必要があります。

以上のように、我々はZoom APIを利用して我々は以下の2点を実現する必要がありました。

  • ASKCHATアカウントと、Zoomアカウントの連携
  • 作成されたセッションごとに、Zoom Meeting URLを発行する

しかし、上記の用途でZoom APIを利用する場合、Zoom App Marketplaceにアプリを公開することが求められます。それが我々がZoom App Marketplaceにアプリを公開するに至った理由です。今回はZoom App MarketplaceにASKCHATを公開するまでに行ったこととポイントをまとめてご紹介します。

詳しい内容は Zoom Developer Platformにも記載されていますので、こちらもあわせてご確認ください。

https://marketplace.zoom.us/docs/guides

審査の申請まで

Zoom App Marketplaceでアプリを作成

Zoom App MarketplaceにZoomアカウントでログインしたら、ダッシュボード上でアプリを作成します。

https://marketplace.zoom.us/

今回選択するべきは Oauthです。また、さまざまな配信者がZoom Meeting URLを発行するため、 User-managed app を選択します。Zoom App Marketplaceに公開するか否かを問われていますが、上記の要件を実現するためには必須なのでONにしてしておきます。

躓いたポイント

提出に必要な情報の入力や、提出方法に関する注意事項などをここより下にまとめてあります。ひととおり一読してから審査に提出することをおすすめします。

いよいよ審査

提出が完了したら、いよいよ審査です。Zoom審査は大きく二段階に分かれています。

  • 1段階目: Functional and usability testing
  • 2段階目: Security and compliance review (セキュリティと規約を守っているかの確認)

1段階目では、アプリのユーザービリティや、各機能(主にZoomが絡む部分)が正常に作動するかどうか、2段階目ではアプリがZoomが容器有するセキュリティ基準を満たしているかどうかを確認されます。すべての項目をチェックした上で修正箇所を指摘されるのではなく、上から順にチェック項目を確認され、1つでもひっかかった場合はリジェクトされる、というシビアなものになっています。

1段階目 - Functional and usability testing

このフェーズにおいて、慎重に確認されたのは以下の4点です。

  1. Authorization
  2. Prod Client ID Used
  3. Use-Cases Tested / Working
  4. Documentation Complete

1. Authorization

ZoomとのOAuth認証が正常に動作するかどうかをチェックされます。アプリ内で、「アプリのアカウントとZoomアカウントを連携すること」が無事に実行できるのはもちろんのこと、Zoom Marketplaceの「Install」ボタンからZoomとの連携が出来るようにしておく必要があるということに気をつけてください。

ちなみに、アプリのインストール方法は「Visit Site to Install」と、「Install」という2つのオプションが用意されています。前者を選択した場合はユーザーが直接Zoom連携へ進むことができる、Zoom連携専用のランディングページを用意しなければなりません。

This is our requirement for the Landing Page resource:
  * Landing Page URL which routes logged in users to a apge where they can authrize, and it must redirect unauthenticated users to a sign in page.

2. Prod Client ID Used

認証用のリダイレクトURLは、かならず DevelopmentProductionで必ず異なるURLを提供する必要があります。新規事業などでまだ開発環境がない場合でも、無理に用意する必要があります。審査へはProduction用の情報を使用しましょう。

3. Use-Cases Tested/Working

ここではZoomの審査担当者が、実際にアプリケーションを利用して問題がないか、きちんと動作するかの確認が実施されます。審査担当者のために「使いかた」を英語でまとめたものを提出しました。しかし、担当者からこのようなメッセージが返ってきてしまいました。

使いかたは英語で書いてくれたけど、インターフェイスが日本語だからわからないよ~💦

具体的な指示は記載されていませんでしたが、担当者の茶目っ気のある態度に、インターフェイスのローカライズを決意しました。この際ローカライズを瞬時に可能にした Flutter Intlについては後日また改めて書こうと思います。

英語のドキュメントを用意し、インターフェイスも英語に対応させることで、無事審査担当者の方に一通り機能を触ってもらうことに成功しました。

4. Documentation Complete

Information内の入力項目をすべて英語で記入する必要があります。プライバシーポリシーと利用規約のURLを書き込む欄があるのですが、それぞれのドキュメントを英語で用意する必要はありません。ただ、これらのドキュメントを日本語で提出する場合は、 Long Descriptionの1行目に必ず以下の文章を"ふと文字で"書く必要があります。

Any support including terms-of-use and privacy-policy is available only in Japanese.

利用規約やプライバシーポリシーなどのサポートは日本語にしか対応していませんよ、という注意文です。また、AppstoreやGoogle Play同様、imageを用意する必要があるのですが、image内の文章は英語で書かれていなければなりませんのでこちらにも注意してください。

2段階目 - Security and compliance review

1段階目を全てクリアすることで、ようやくセキュリティ審査を開始してもらえます。ここで担当者も別の方に変更になったようでした。Zoomから送られてくる Technical Design Document の項目にすべて回答し、提出します。https://docs.google.com/document/d/1rYb0fVJsAX_lNvZ04VZuy6wGDXszMlOZ69DEYZ9t8n8/edit

TLS 1.2未満をサポートしているかどうか、ユーザーの機密情報をどのように保管しているかといった質問に回答ます。さらに、アプリで使用している外部サービスや、ライブラリ等をリストアップし、設計構造やZoom APIの使用フローなどを作図して添付しなければなりません。

1.3. Architecture Diagram

[Provide an architectural diagram with additional flow diagrams where possible. This includes any service that interacts with Zoom, including databases, servers and third party applications that are required for your application to function.]

設計構造を図解したものを、可能であれば遷移図とともに提出してね。Zoom、データベース、サーバーと利用している外部のサービスなど、あなたのアプリで使用されている全てを含んでね。

作図はmiroやxxxなどを使用すると、かんたんに作成できます。

注意点

Informationに、EndpointURLという項目が合ったと思います。ユーザーがZoom Marketplace上からアプリを「Uninstall」した場合、こちらのEndpointURLにwebhookが送信されます。

https://marketplace.zoom.us/docs/api-reference/webhook-reference/app-events/app-deauthorized

ここでもし、 WebhookPayloaduser_data_retention:falseで会った場合、アプリ側では、そのユーザーのZoomアカウントデータを削除した上で、 Data Compliance APIを呼ぶ必要があります。

もし、WebhookのPayloadが user_data_retention: false であった場合、

( POST/oauth/data/compliance )https://marketplace.zoom.us/docs/api-reference/data-compliance/data-compliance/compliance

user_data_retention boolean

Specifies whether a user has authorized you to store their data even after they uninstall your app. if the value is false, you must delete the user's data and call the Data Compliance API within ten days of receiving the deauthorization webhook. If the value is true, no further action is required on your end.

user_data_retentionによって、ユーザーがあなたのアプリをアンインストールした後もデータを保持してほしいかどうかを判断してね。もしfalseだった場合、そのユーザーのデータを削除して、Data Compliance APIを10日以内に呼ばなければいけないよ。でももしtrueだったら何もしなくてだいじょうぶ。

まとめ

AppstoreやGoogle Playなどと違い、Zoomの審査に関する情報が世に殆ど出ていなかったため見通しが立てにくく、スケジュールを引くことが非常に困難でした。我々の場合はアプリを提出した3月5日から20日後の3月26日に審査に通りました。この記事でまとめてあることに十分注意して審査を行えば、もう少し短期間で通過することもできると思います。

今回のASKCHATのように、チャレンジングなプロダクトを日々制作しています。開発はFlutter中心ですが、都度最適な技術にトライすることももちろん可能です。興味がある、一緒にやってみたい、少しでもそう感じたら、ぜひ気軽に声をかけてください。

Twitterアカウントはこちらです。