Slide 1

Slide 1 text

お部屋探しアプリ「Canary」に Twilio API を使って アプリ内通話機能を実装した話 MagicPodでE2Eテストを実装した話

Slide 2

Slide 2 text

自己紹介 ● 中野 辰典 (Tatsunori Nakano) ● 札幌在住 ● 2021年12月 株式会社BluAge 入社 ● ソフトウェアエンジニア ● 最近ゴルフをはじめました

Slide 3

Slide 3 text

お部屋探しアプリ「Canary」にTwilio APIを使って アプリ内通話機能を実装した話

Slide 4

Slide 4 text

賃貸物件検索 カナリー(Canary)物件探しアプリ ★4.7とカテゴリ内で 最高評価!

Slide 5

Slide 5 text

改めてCanaryとは ● お部屋探しアプリ ● ユーザーはお問い合わせをする

Slide 6

Slide 6 text

お問い合わせ方法 もっとすぐに確認したい! というユーザーの声があった ● 名前やメールアドレスを入力して送信 ● 仲介会社からの連絡を待つ

Slide 7

Slide 7 text

電話問い合わせの機能を作りたい!

Slide 8

Slide 8 text

こういう機能を作りたい 物件画面の「電話でお問い合わせ」ボタンから不動産会社に直接電話で問い合わせできる

Slide 9

Slide 9 text

機能要件 ● アプリ内から直接電話できるアプリ内通話であること ● ユーザーの電話番号は仲介会社に知られないこと ○ 個人情報の観点から ○ 安心して問い合わせできるように ● ユーザーに通話料金が発生しないこと

Slide 10

Slide 10 text

どうやって実現するか

Slide 11

Slide 11 text

実現できそうなサービス ● AdSiP ● CallTracker ● Twilio ● Vonage Twilio に決定 選定理由: コスト面が断トツによかった

Slide 12

Slide 12 text

Twilio 詳細 ● 電話・SMS・ビデオ通信・チャットなどのさま ざまなコミュニケーションチャネルを APIとし て提供する CPaaS ● Twilioのコード(≒API)を組み合わせてシス テムに組み込むことで、最小限のコードで開 発可能 ● iOS, Android, Web それぞれ対応 ● 初期費用なし ● 従量課金制

Slide 13

Slide 13 text

Programmable Voice ● 音声通話を行うためのサービス ● 電話の発着信、自動音声応答など電話に関 するあらゆる機能をプログラムでコントロー ルできる ● 通話料は従量課金

Slide 14

Slide 14 text

Programmable Voice の利用料金 ● 電話番号の維持費は1ヶ月110円 ● 固定電話への発信: 5.5円/1分

Slide 15

Slide 15 text

実装

Slide 16

Slide 16 text

全体像 ユーザー 仲介会社 Canary サーバー 電話問い合わせ ※BluAge側で購入した電話番号に発信される 指示をリクエスト TwiML: 指定の番号に発信するよう命令 仲介会社に発信 ※BluAge側で購入した電話番号から発信される

Slide 17

Slide 17 text

TwiML とは リクエスト先の URLを指定 ● TwiML ( Twilio Markup Language ) は電話(またはSMS)を受信したときに何をすべきかを Twilio に指示するために使用 できる命令のセットです。 ● Twilio によって定義された特別なタグを含むXMLドキュメントです。 ● 誰かが Twilio 番号の 1 つに電話をかけると、Twilio はその電話番号に関連付けられた URL にリクエストします。そして返 されたTwiML 命令を読み取り、指定の番号に発信、録音、メッセージを再生、などを判断します。 ※レスポンス例 XMLで命令が返される

Slide 18

Slide 18 text

アプリ側で必要な実装 ユーザー 電話問い合わせ ※BluAge側で購入した電話番号に発信される ● 発信する ● 電話を切る ● ミュートにする ● スピーカーに切り替える ● 「プルル・・」という発信音を出す ● 「お繋ぎします」というアナウンスを出す ● 相手が通話中の場合にアナウンスを流す etc…

Slide 19

Slide 19 text

React Native でどう実装するか

Slide 20

Slide 20 text

公式のSDK React Native用のSDKはない🥺

Slide 21

Slide 21 text

公式以外で検討したライブラリ: React Native Twilio Phone 有志が作っているライブラリ👀 https://www.npmjs.com/package/react-native-twilio-phone

Slide 22

Slide 22 text

公式が用意しているiOS, Android用のSDKを使ってネイティブモジュールで実装する (そしてまずiOSを先行してリリースすることに📱) 方針決定

Slide 23

Slide 23 text

voice-quickstart-ios / ObjcVoiceQuickstart Swift用がメインで用意されているが、Obj-Cの方が書き慣れているので ObjcVoiceQuickstart を参考に進めることに󰞵

Slide 24

Slide 24 text

ViewController をベースにネイティブモジュールの作成 ViewController に電話操作に関するメソッドが詰まっている ViewController を RCTTwilioModule としてネイティブモジュールにする

Slide 25

Slide 25 text

ViewController.m RCTTwilioModule.m 発信用の メソッド builder.params でリクエスト時に含めるパラメータを設定できる ここに仲介業者を特定できる情報を渡すことで、サーバー側で電話番号を指定した TwiMLを返せる ほぼそのまま使える

Slide 26

Slide 26 text

ユーザー 仲介会社 Canary サーバー builder.params で仲介会社情報を渡す params が渡される 発信用のTwiMLが返される 仲介会社に発信 ※BluAge側で購入した電話番号から発信される A不動産だな 番号は03-xxxx-yyyyだ A不動産に電話しよ 発信の流れ

Slide 27

Slide 27 text

ViewController.m RCTTwilioModule.m ミュート 電話を切る スピーカー

Slide 28

Slide 28 text

作成したネイティブモジュールを使う 完成したネイティブモジュールを発信、通話中のコンポーネント内で使う

Slide 29

Slide 29 text

ViewController.m RCTTwilioModule.m 通話中を取得 通話中の場合に返される “Busy Here” をキャッチしたら ”sendEventWithName” でイベントを送る ※参考: https://www.twilio.com/docs/api/errors/31486

Slide 30

Slide 30 text

NativeEventEmitter でイベントを拾う sendEventWithNameで送られたイベントはNativeEventEmitterで拾い、 「通話中」などのステータスを扱えるようにする

Slide 31

Slide 31 text

実際に動かしてみる

Slide 32

Slide 32 text

補足: Podfile Podfile に左の一文を追加する必要があります

Slide 33

Slide 33 text

補足: 暗号化されたアクセストークンの復号化用のネイティブモジュール Twilioに接続するにはアクセストークンが必要。 バックエンド側で生成し、セキュリティの観点から AES-CTRで暗号化してからアプリ側に返している。 アプリ側での複号化が必要になるが、JSでおこなうのはパ フォーマンス面に影響が出そうだったためネイティブモ ジュールを作成。 ※https://github.com/ywzqhl/imToken/blob/7d9ae8069ebc605f92d87b b81194d67a3772d7bd/imToken/ETHAES128.m を参考に作成 ※https://github.com/tectiv3/react-native-aes というOSSがあったがCTR モードに非対応だったためお見送り

Slide 34

Slide 34 text

まとめ

Slide 35

Slide 35 text

まとめ ● Twilioを使えばアプリ内通話機能を簡単に実装できる ● 数ある電話サービスの中でもTwilioはコスパがいい ● TwilioにはReact Native用のSDKは無いが、 iOS, Android用のSDKをネイティブモジュールとして扱う ことで実装できる

Slide 36

Slide 36 text

MagicPodでE2Eテストを実装した話

Slide 37

Slide 37 text

MagicPod とは ● ノーコードE2Eテスト自動化サービス ● モバイルアプリテスト、ブラウザ(ウェブア プリ)テストの両方に対応 ● 低コスト(¥39,800円/月〜) ● テスト実行回数 無制限

Slide 38

Slide 38 text

React NativeにおけるE2Eテストの選択肢と選定理由 ● React Native公式ドキュメント ○ Detox ○ Appium https://reactnative.dev/docs/testing-overview#end-to-end-tests ● メンテコストを抑えたい ● 今後エンジニア以外でも触れるようにしたい → ノーコード    コストの比較 → MagicPod に決定 ● ノーコード ○ Autify ○ MagicPod

Slide 39

Slide 39 text

テスト戦略

Slide 40

Slide 40 text

テスト戦略 ここのテストを頑張っていることが前提 💪 E2Eテストはクリティカルな箇所のみ、必要最低限にしてメンテコストを抑える 「検索」や「問い合わせ」など根幹となる機能のみをテスト

Slide 41

Slide 41 text

テスト作成

Slide 42

Slide 42 text

テスト作成手順: EAS Build EAS Build でビルドしたファイルをダウンロードする

Slide 43

Slide 43 text

テスト作成手順: MagicPodにアップロード MagicPod上で起動する

Slide 44

Slide 44 text

テスト作成手順: 検出した要素からシナリオを作成 要素をドラッグ&ドロップで簡単にシナリオを作成 要素を検出

Slide 45

Slide 45 text

テスト作成手順: さまざまな操作 画面操作 条件分岐 待機 変数 要素の確認 画面入力 etc…

Slide 46

Slide 46 text

テスト作成手順: 共有ステップ 「共有ステップ」を作成することで複数のシナリオで使いまわせる

Slide 47

Slide 47 text

テスト実行: すべてのシナリオを一括実行 複数のシナリオを一括実行。結果はメールでも届く

Slide 48

Slide 48 text

テスト実行: AIによる自動修正 予期せぬことで落ちそうになっても、AIによる自動修正が入ってくれる場合がある

Slide 49

Slide 49 text

実際に動かしてみる

Slide 50

Slide 50 text

まとめ

Slide 51

Slide 51 text

まとめ なによりE2Eテストを入れるだけで心理的にかなり楽になりますので、 工数がネックで導入に踏み切れていない場合、 ノーコードでコスパ最強のMagicPodはおすすめです ● ブラウザ上でポチポチするだけでテスト作成で きるのは楽 ● エンジニア以外でもメンテナンスできそう ● コスパがいい

Slide 52

Slide 52 text

さいごに

Slide 53

Slide 53 text

エンジニア積極採用中!! 不動産DX業界で急成長中のスタートアップ BluAgeで一緒に働きませんか?

Slide 54

Slide 54 text

エンジニア積極採用中!! YAMADA HLDGS.との総額約10億円の資本業務提携を締結 これまでにない新しいお部屋探しを作り上げていく仲間を募集中です! 出資 カナリーPFにおけるシナジー創出 出資 DX支援

Slide 55

Slide 55 text

エンジニア積極採用中!! Meetyでカジュアルにお話ししませんか?

Slide 56

Slide 56 text

エンジニア積極採用中!! Meetyでカジュアルにお話ししませんか?

Slide 57

Slide 57 text

ご清聴ありがとうございました