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

CodePushとReact Nativeで緊急OTAリリース!了解!🚑

CodePushとReact Nativeで緊急OTAリリース!了解!🚑

iOSDC 2018前夜祭での発表内容です。
デモプロジェクト: https://github.com/miyabi/iosdc18example

Masayuki Iwai

August 30, 2018
Tweet

More Decks by Masayuki Iwai

Other Decks in Technology

Transcript

  1. Unite Tokyo 2018での出来事 • 毎年開催しているUnity公式のカンファレンス • 今年は5月に3日間開催、2000人以上参加 • このイベントに合わせてチャット機能を実装 •

    海外チームが開発しているAPIを利用する必要があり、
 連携を依頼していたがギリギリになってしまった • 前バージョンでパフォーマンスが悪かったのでリファクタリング
  2. What is CodePush? • Microsoft製のクラウドサービス • React NativeやCordovaのJSコードをホットパッチング可能 • ウェブ、SDK、CLIが提供されている

    • 以前は独立したサービス
 →現在はVisual Studio App Centerに統合 https://github.com/Microsoft/code-push
  3. What is CodePush? UIKitなど React Native Library JavaScriptCore React JS

    アプリケーションコード React Native JS Library jsbundle ここの部分 を配信
  4. Visual Studio App Center • CodePushの他にも
 CI、テスト、Analytics、 Push通知など多機能 • 無料から利用可能


    (ビルド回数や時間に制限有) • CodePushは無料で無制限に 利用可能 https://appcenter.ms
  5. Visual Studio App Center • CodePushの他にも
 CI、テスト、Analytics、 Push通知など多機能 • 無料から利用可能


    (ビルド回数や時間に制限有) • CodePushは無料で無制限に 利用可能 https://appcenter.ms
  6. Appleのガイドラインを振り返る 2.7 Apps that download code in any way or

    form will be rejected 2.8 Apps that install or launch other executable code will be rejected App Store Review Guidelines (2015)
  7. Appleのガイドラインを振り返る 2.7 Apps that download code in any way or

    form will be rejected 2.8 Apps that install or launch other executable code will be rejected App Store Review Guidelines (2015)
  8. Appleのガイドラインを振り返る 2.5.2 Apps should be self-contained in their bundles, and

    may not read or write data outside the designated container area, nor may they download, install, or execute code which introduces or changes features or functionality of the app, including other apps. (抜粋) App Store Review Guidelines (2016)
  9. Appleのガイドラインを振り返る 2.5.2 Apps should be self-contained in their bundles, and

    may not read or write data outside the designated container area, nor may they download, install, or execute code which introduces or changes features or functionality of the app, including other apps. (抜粋) App Store Review Guidelines (2016)
  10. Appleのガイドラインを振り返る 3.3.2 An Application may not download or install executable

    code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exception to the foregoing is scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store. Apple Developer Program License Agreement (2016)
  11. Appleのガイドラインを振り返る 3.3.2 An Application may not download or install executable

    code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exception to the foregoing is scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store. Apple Developer Program License Agreement (2016)
  12. Appleのガイドラインを振り返る 3.3.2 An Application may not download or install executable

    code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exception to the foregoing is scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store. Apple Developer Program License Agreement (2016)
  13. Appleのガイドラインを振り返る 3.3.2 An Application may not download or install executable

    code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exception to the foregoing is scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store. Apple Developer Program License Agreement (2016)
  14. 現在のAppleのガイドライン 3.3.2 Except as set forth in the next paragraph,

    an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS. Apple Developer Program License Agreement (Current)
  15. 現在のAppleのガイドライン 3.3.2 Except as set forth in the next paragraph,

    an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS. Apple Developer Program License Agreement (Current)
  16. 現在のAppleのガイドライン 3.3.2 Except as set forth in the next paragraph,

    an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS. Apple Developer Program License Agreement (Current)
  17. 現在のAppleのガイドライン 3.3.2 Except as set forth in the next paragraph,

    an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS. Apple Developer Program License Agreement (Current)
  18. 現在のAppleのガイドライン 3.3.2 Except as set forth in the next paragraph,

    an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS. Apple Developer Program License Agreement (Current)
  19. 同様のサービスは? “This includes any code which passes arbitrary parameters to

    dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.” https://forums.developer.apple.com/thread/73640
  20. 同様のサービスは? “This includes any code which passes arbitrary parameters to

    dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.” https://forums.developer.apple.com/thread/73640
  21. 同様のサービスは? “This includes any code which passes arbitrary parameters to

    dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.” https://forums.developer.apple.com/thread/73640
  22. CodePushを使ってみよう 1. App Centerでアプリを登録する 2. App Center CLIをインストール 3. React

    Native Client SDKをインストール 4. アプリケーションコードの修正
  23. 2. App Center CLIをインストール $ appcenter login 
 Opening your

    browser...
 ? Visit https://appcenter.ms/cli-login?hostname=xxx.local and enter the code:
 ? Access code from browser: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Logged in as xxxxxxxx
  24. 2. App Center CLIをインストール $ appcenter codepush deployment list -a

    <ORG>/<APP> 
 !""""""""""""#"""""""""""""""""""""""""""""""""""""""$
 % Name % Key %
 &""""""""""""'"""""""""""""""""""""""""""""""""""""""(
 % Staging % xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %
 &""""""""""""'"""""""""""""""""""""""""""""""""""""""(
 % Production % xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %
 )""""""""""""*"""""""""""""""""""""""""""""""""""""""+
  25. 3. React Native Client SDKをインストール $ react-native link react-native-code-push ...

    ? What is your CodePush deployment key for Android (hit <ENTER> to ignore) ... ? What is your CodePush deployment key for iOS (hit <ENTER> to ignore)
  26. 4. アプリケーションコードの修正 App.js import codePush from ‘react-native-code-push’ class App extends

    React.Component<Props, State> { // ... } App = codePush(App) export default App
  27. 4. アプリケーションコードの修正 App.js import codePush from ‘react-native-code-push’ class App extends

    React.Component<Props, State> { // ... } App = codePush({ checkFrequency: codePush.CheckFrequency.ON_APP_RESUME, installMode: codePush.InstallMode.ON_NEXT_RESUME, )(App) export default App