Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NAVITIME自治体アプリ高速リリースの舞台裏 - インバウンド事業でのReact Nati...

NAVITIME自治体アプリ高速リリースの舞台裏 - インバウンド事業でのReact Nativeの導入について -

3/27(水)に開催されたDevLOVE様主催のイベント『ナビタイムの現場 第2経路 -ナビタイムを支える技術-』にて発表した資料です。

NAVITIME JAPAN

March 27, 2019
Tweet

More Decks by NAVITIME JAPAN

Other Decks in Technology

Transcript

  1. ©NAVITIME JAPAN 自己紹介 5 櫻井 友了(サクライ トモアキ) 2012年、株式会社ナビタイムジャパンに新卒として入社。 データ開発・運用チームに配属となり、Oracle、MySQL DB設計やPythonでWebサ

    イトクローラーを開発するなど、主にバックエンドを3年間担当。 その後異動し、複数のプロジェクトでWeb開発担当となる。NAVITIME Travelサイ トの開発ではReact.jsを導入、インバウンド事業部へ移った後は社内で初めて ReactNativeを導入した他、PWAやNext.jsの導入など、Web界隈を中心に先進的な Web技術導入を行う。 ベースと猫が好き。 スピーカー
  2. ©NAVITIME JAPAN ReactNativeとは 16 React Nativeは、Facebook社が中心になって開発が進められている オープンソースのクロスプラットフォーム開発ツール。 ▪ JSエンジンからネイティブコードを実行して、ネイティブUIを構築する ▪

    Webエンジニアでもネイティブアプリ開発ができる。 ▪ iOSとAndroidでViewコードを共通化。 ▪ 急な仕様変更でも、サーバーに置いてあるJSを差し替えて、ネイティブ側で 読み込むだけでコンテンツの変更/修正ができる。(AppCenterの章でお話しま す。)
  3. ©NAVITIME JAPAN ReactNativeとは 19 ・Build native mobile apps using JavaScript

    and React JavascriptとReactを使って、ネイティブモバイルアプリを作ります。 ・A React Native app is a real mobile app ReactNativeアプリはリアルなモバイルアプリです。 ・Don't waste time recompiling リコンパイルにかかる時間を無駄にしません。 ・Use native code when you need to 必要であればネイティブコードを使ってください。 https://facebook.github.io/react-native/ (より抜粋)
  4. ©NAVITIME JAPAN 導入の背景 32 官公庁の案件にはリジェクトは大きなリスク - 実証実験期間の厳守 - 年度末の納品 →

    このようなリスクを避けたい。 サーバーから実行コードを配信することで審査を回避する (MS AppCenterの機能。後ほど説明します。) AppStoreリジェクト回避
  5. ©NAVITIME JAPAN 実装方法(初期設定) 46 用意するもの • Node スケーラブルなネットワークアプリケーションを構築するために設計された 非同期型のイベント駆動の JavaScript

    環境 • Watchman ファイル監視システム。ファイルの変更を検知し、再ビルドなどを 発火させることが可能になります。 • React Native comand line interface • Xcode • Android Studio + JDK • VSCode
  6. ©NAVITIME JAPAN 実装方法(初期設定) 47 導入手順 1. Node, Watchman のインストール 2.

    React Native comand line interface のインストール 3. Xcode, Android Studio + JDK のインストール 4. アプリを新規作成 brew install node brew install watchman npm install -g react-native-cli react-native init AwesomeProject
  7. ©NAVITIME JAPAN 実装方法(イベント呼び出し) 50 import { NativeModules } from 'react-native'

    const { DeviceAction } = NativeModules export class Device { public static phoneCall = (tel: string) => { DeviceAction.phoneCall(tel) } } モジュール名 :”DeviceAction” 関数名 :”phoneCall” 引数 : 電話番号(テキスト) イベントの呼び出し MIT License Copyright (c) Facebook, Inc. and its affiliates.
  8. ©NAVITIME JAPAN 実装方法(イベント呼び出し) 51 public class DeviceActionModule extends ReactContextBaseJavaModule {

    public DeviceActionModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "DeviceAction"; } @ReactMethod public void phoneCall(String number) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + number)); if (intent.resolveActivity(getReactApplicationContext().getPackageManager()) != null) { getCurrentActivity().startActivity(intent); } } } Android モジュール名、関数名がJS側と 一致している必要がある
  9. ©NAVITIME JAPAN 実装方法(イベント呼び出し) 52 @objc(DeviceAction) final class DeviceAction: NSObject {

    @objc(phoneCall:) func phoneCall(_ number: NSString) -> Void { DispatchQueue.main.async { guard let phoneNum = URL(string: "tel://" + String(number)) else { return } UIApplication.shared.open(phoneNum) } } @objc static func requiresMainQueueSetup() -> Bool { return true } } iOS モジュール名、関数名がJS側と 一致している必要がある
  10. ©NAVITIME JAPAN 開発の苦労 55 結果・・・ Webエンジニアだけだと辛い • 最初ReactNativeのエンジニア(もう一度言いますが、Webのエンジニア)私1人。(ネイテ ィブエンジニアいっぱいいる) •

    滋賀ビワイチサイクリングアプリは、事業の開発方針が決まり、ReactNative導入の初期 段階で、本当にネイティブ+RNアプリがうまくいくか実験的な意味もあり、ドキュメ ントを参照しながら実装を進める日々…
  11. ©NAVITIME JAPAN 63 ・ReactNativeでNavigationを行うサードパーティ製ライブラリがいくつかある。 ・react-navigation ☆15,080 (FB公式ページに載っている) ・react-native-navigation ☆9,922 ・native-navigation

    ☆3,098(Airbnb製) $ yarn install ライブラリ名 全ての画面をReactNativeで作る場合はいいかもしれないが、、 Navigationの問題 開発の苦労 - Navigation -
  12. ©NAVITIME JAPAN 65 画面の管理はネイティブのナビゲーションスタックに統一して対応。 • 従来の画面遷移が可能になった • ネイティブアプリと同じアニメーションで画 面遷移が可能になった •

    ReactNative側でナビゲーションバーの考慮を しなくて済むようになった →ノッチの考慮などをネイティブ側だけで解決 Navigationの実装 開発の苦労 - Navigation -
  13. ©NAVITIME JAPAN 69 ・チーム内勉強会 & モブプロ会開催。 ・画面の構造の勉強 ・コンポーネントの作り方 ・レイアウトの書き方 ・2h

    ✕ 3回くらい ・まずは実装をやってみて分からないところは適宜聞く。 RNエンジニア1人問題 開発の苦労 - 開発リソース -
  14. ©NAVITIME JAPAN AppCenterについて 78 Microsoft Azure AppCenterを導入 クラウド上でコンテンツをビルド/リリースして配布できるMicrosoft Azureのサービス(図1) ・官公庁アプリのリジェクトリスクを回避したい。

    → 実証実験期間の厳守、年度末の納品 ・AppCenterのCodePush機能 → 実行コードをここから配信することで審査を回避。 (審査ガイドライン 2017年12月号 「4.7 HTML5 Games, Bots, etc」参照) ・当該画面のJSファイルを差し替えることで、 リアルタイムにコンテンツの更新が可能。(図2) ⇒ ストアを通さない。 ⇒ リジェクトを回避可 課題 解決法 図1. コンソール画面
  15. ©NAVITIME JAPAN AppCenterについて 79 ・React Native Projectをビルドして、App Centerに配置。(①) ・アプリからReact Native

    のページが呼ばれたらJSを読み込む。(②) ・読み込んだファイルはアプリ内部でキャッシュ(差分があれば差し替え) (③) なのでオフラインでもページの表示は可能。 ・コンテンツに更新があれば再ビルドして、JSを差し替えればコンテンツの更新が可能。 (④) build ネイティブアプリ ① ② ③ ④
  16. ©NAVITIME JAPAN UI View共通化の効果 84 パーツA パーツA’ パーツA’’ 少量の修正を加えて流用できる 🔻

    一度の修正で2つのプラットフォーム分Viewが作れる Viewの共通化
  17. ©NAVITIME JAPAN リジェクト回避効果 87 アプリリジェクト 該当機能口閉じ + 再申請 WEBページ修正依頼 審査通過

    WEBページ修正(自治体側) 該当機能の口開け版 JSファイルを用意 WEBページの改修確認+AppCenterのJSファイル更新 アプリ公開 口閉じ版 口開け版 公開までの流れ
  18. ©NAVITIME JAPAN 89 実装期間 iOS検証期間 Android検証期間 公開 ・・・ ・・・ Android検証完了

    iOS審査提出 iOS公開 Android公開 集中!ツライ! まだバグないから のんびり〜 従来の パターン 開発期間の各フェーズでリソースを効率化 それぞれ 専任 開発リソース 開発リソースへの効果
  19. ©NAVITIME JAPAN 90 実装期間 iOS検証期間 Android検証期間 公開 ・・・ ・・・ Android検証完了

    iOS審査提出 iOS公開 Android公開 あれ?暇だな… 集中!ツライ! バグめっちゃ 挙がるやんけ… 集中!ツライ! まだバグないから のんびり〜 従来の パターン それぞれ 専任 開発リソース 開発リソースへの効果 開発期間の各フェーズでリソースを効率化
  20. ©NAVITIME JAPAN 91 実装期間 iOS検証期間 Android検証期間 公開 ・・・ ・・・ ・・・

    Android検証完了 iOS審査提出 JS更新 iOS公開 Android公開 iOSに集中! JSに集中! Viewをやるぜ! RN 導入後 時々ヘルプ! new comer Androidエンジニア も開発に参戦 適宜対応 new comer 開発リソース 開発リソースへの効果 開発期間の各フェーズでリソースを効率化
  21. ©NAVITIME JAPAN 92 実装期間 iOS検証期間 Android検証期間 公開 ・・・ ・・・ ・・・

    Android検証完了 iOS審査提出 JS更新 iOS公開 Android公開 Androidに集中! RN 導入後 またまた時々ヘルプ! JSに集中! iOSエンジニアも 開発に参戦 開発リソース 開発リソースへの効果 開発期間の各フェーズでリソースを効率化
  22. ©NAVITIME JAPAN その他のGood Point 93 • シンプルなUIの場合Android/iOSでほぼOS差分なく実装できる • iOSの場合UIの修正がビルド無しで更新できる •

    UIコンポーネントのコードだけデザイナーが作るなどの分業が可能 • エンジニアのリソースを柔軟に使えチームの強みになる → JSでできるのでWEBエンジニアがアプリ開発にジョインできる → アプリエンジニアもWEB開発への参加ハードルが下がる(React Nativeか らReact)
  23. ©NAVITIME JAPAN それでもつらかった点…その他 95 https://medium.com/airbnb-engineering/react-native-at-airbnb-the-technology-dafd0b43838 (より抜粋) AirbnbがReactNativeでの開発をやめた、、 訳) ReactNativeの未熟さ ReactNativeはAndroidやiOSより未熟である。新しく、とても野心的で、急速に発展しています。一方で、ReactNativeは多

    くの状況下で動きますが、その未熟さが現れ、ネイティブでの些細なことが非常に難しくなる例がある。不運にもこれら の実例を予見することは難しく、対処することに数時間から多くの日にちがかかってしまう。
  24. ©NAVITIME JAPAN こういうときに活かせる 100 • シンプルなUIのアプリの場合 シンプルなUIの場合OS差分が少なく実装が楽。 • デザインなどのアプリ更新が頻繁なアプリの場合 ReactNative部分はサーバ配信で更新できるため、アプリ審査なく市場アプリが更

    新できる。(ただし、ネイティブ部分の改修には審査が必要) • 開発メンバーが少数の場合 OSに関係なくアプリの開発ができるため、ネイティブ部分の開発以外で柔軟に リソースの調整が可能。