ReactNativeのライセンス、Hot Code Pushについて

# はじめに
ReactNativeについて、2017年にゴタゴタがあり2018年は落ち着いてきた感じがあるので、現状をまとめておきます。

内容は以下になります。

- ReactNativeのライセンス変更
- iOSアプリのHot Code Push

# ReactNativeのライセンス変更
## 問題
ReactNativeのラインセンスは、30 Jan 2015の最初のコミットの時点では、「無保証だけど自己責任で使ってね」というものでした（[リンク](https://github.com/facebook/react-native/commit/a15603d8f1ecdd673d80be318293cee53eb4475d#diff-9879d6db96fd29134fc802214163b95a)）。

ところが、Mar 24, 2015のコミット（[リンク](https://github.com/facebook/react-native/commit/6938f4524676e2f22bacb7d0776f64c7fe393265#diff-9879d6db96fd29134fc802214163b95a)）でFacebookとその子会社、関連会社に対する特許非係争条項が付与されたライセンスに変更されてしまいました。

ちなみに、Reactは同時期に、Apache License 2.0からFacebookライセンスへの変更がなされています。

特許非係争条項が記載されているOSSライセンスは[Apache License 2.0](https://ja.osdn.net/projects/opensource/wiki/licenses%2FApache_License_2.0)が有名ですが、特許非係争の範囲は、利用するOSSソフトウェアの特許に限定されています。
一方、Facebookのライセンスは、Facebookとその子会社、関連会社に対して、いかなる特許訴訟もNGとなっていて、その範囲が広いのが特徴です。

Apache License 2.0のように、利用するソフトウェアで使われている特許について訴訟を起こす場合は、そのソフトウェアの利用に関するライセンスが終了するという、弱い報復措置であれば受け入れられるという企業は多いと思います。
ところが、Facebookのライセンスは、特許の範囲が利用しているソフトウェアを超えて無制限ですし、子会社や関連会社といった範囲まで影響が及ぶため、ある意味、自社の全ての特許ポートフォリオをFacebook、その子会社、関連会社に差し出すことになってしまっているのです。

自社がFacebookを相手に特許訴訟をするような企業なのかどうかはさておき、大企業の法務部門、知的財産部門は、自社の知的財産が損なわれる恐れのある、このようなライセンスを嫌います。

そして、大企業に買収されてエグジットを狙うスタートアップのCEO達にとっても避けるべきライセンスという認識が広まっていきました（[リンク](https://www.kaitoy.xyz/2017/08/25/if-youre-a-startup-you-should-not-use-react-reflecting-on-the-bsd-patents-license/)）。

Apache Software FoundationはFacebookのライセンスを問題視し、2017/7に「Category-X」リストにこのライセンスを追加し、Facebook社製のOSSに依存しているプロダクトのリリースは2017/8/31以降できなくなってしまいました。Apache Software FoundationのCordova, Superset, TrafficControl, Ambari, Allura, Whimsy, Spot, Myriad, CouchDB, Lens, SensSoft, Slingといったプロジェクトは、Facebook社製のOSSに依存していたために大混乱におちいりました（[リンク１](https://mag.osdn.jp/17/08/25/224000)、[リンク２](https://note.mu/konpyu/n/nc0d2f49676ba)）。

## 改善
結局、Facebookが折れ、Reactは、25 Sep 2017にMITライセンスへの変更が[GitHubにコミット](https://github.com/facebook/react/commit/b765fb25ebc6e53bb8de2496d2828d9d01c2774b)されました。

ところが、この時点ではReactNativeに関してのライセンス変更はありませんでした。

ReactはOKになったがReactNativeはNGという状況が続く中、ついに、17 Feb 2018にReactNativeもMITライセンスへの変更が[GitHubにコミット](https://github.com/facebook/react-native/commit/26684cf3adf4094eb6c405d345a75bf8c7c0bf88#diff-9879d6db96fd29134fc802214163b95a)されました。

これで、ReactNativeも、MITライセンスのOSS利用について社内規定がある企業場合、その社内規定に則りスムーズに利用できるようになりました。

# iOSアプリのHot Code Push
## Hot Code Push
セキュリティー対策やバグフィックス、ゲームの新規イベントの各種パラメータ変更など、App Storeの審査を待つ時間がないようなケースは多々あると思います。こんな時、Webページのように動的にアプリの変更ができれば便利です。
このような要望を満たすべく、JavaScriptをアプリに配信してアプリの動作を変更するサービスが登場し、Yahooやスマホゲームなど、多くのアプリで利用されてきました。

## 問題の始まり
2017/3/７にRollout.io、jsPatchを組み込んでいる審査済みアプリがApp Storeから警告メールを受け取り始めました（[リンク１](https://forums.developer.apple.com/thread/73640)、[リンク２](https://forums.developer.apple.com/message/215665)、[リンク３](https://news.ycombinator.com/item?id=13817557)）。そして2017/6以降、これらのライブラリを使ったiOSアプリは審査で拒否されるようになっています。

## 争点
[App Store審査ガイドライン](https://developer.apple.com/jp/app-store/review/guidelines/)には以下の規約があります。

> 4.7 HTML5ゲームやBotなど
**バイナリに埋め込まれていないコード（HTML5ベースのゲームやBotなど）をアプリケーションに組み込んだり実行したりすること**は、コードの配信がアプリケーションの主要な目的ではなく、そのコードがストアやストア同様のインターフェイスで提供されておらず、かつそのソフトウェアが**以下の条件を満たす場合に限り許可されます。**（1）無料またはApp内課金で購入された。（2）**標準のWebKitビューで利用可能な機能のみを使用している（アプリケーションではWebKitおよびJavaScript Coreを使用して他社製ソフトウェアを実行する必要があり、プラットフォームのネイティブAPIを他社製ソフトウェアに対して拡張したり、利用可能にしたりすることはできません）。**（3）Apple Developer Programに参加しており、Apple Developer Program License Agreementに署名しているデベロッパによって提供されている。（4）この「App Reviewガイドライン」の規約に準拠している（例：不適切なコンテンツが含まれない）。リクエストに応じて、アプリケーションで利用できるソフトウェアやメタデータの目録を提出していただく必要があります。


Apple Developer Forumsに掲載されたApp StoreレビューアのjsPatchを使ったアプリの拒絶理由（[リンク](https://forums.developer.apple.com/message/215665)）は以下のようなものでした。

> dlopen（）、dlsym（）、respondsToSelector(), performSelector(), method_exchangeImplementations（）、リモートスクリプトの実行など、動的なメソッドに任意のパラメータを渡して、アプリケーションの動作を変更したり、SPIを呼び出すためのコードが含まれます。ダウンロードしたスクリプト リモートリソースが故意に悪意を持っていなくても、Man In The Middle（MiTM）攻撃によって容易にハイジャックされる可能性があり、これはアプリケーションのユーザーに重大なセキュリティ上の脆弱性をもたらす可能性があります。

結局、これらのAPIを利用してJavaScriptコードをインジェクションしてネイティブコードの挙動を変更したり、ネイティブAPIを他社製ソフトウェアに対して公開したりすることが厳格に禁止になったということになります。
Rollout.io、jsPatchは、これらの技術を使い、Hot Code Pushでネイティブコードの挙動を変更していたため、Apple Storeの審査で拒否されるようになりました。

## ReactNativeとAppCenterの状況
SafariにWebサーバからダウンロードしたHTMLとJavaScriptを読み込み、Webアプリを動作させることは、『標準のWebKitビューで利用可能な機能のみを使用している』のガイドラインが許容する範疇に入り問題ありません。

では、ReactNativeとMicrosoft AppCenterの組み合わせで、ReactNativeアプリを更新することについてはどうでしょうか？
Rollout.io、jsPatchが問題になり始めた2017/3/8から１年以上経ちますが、ReactNativeやMicrosoft AppCenterのReactNastive用ライブラリを利用したという理由でApp Storeの審査で却下されたという事例は発生していません（[リンク](https://github.com/facebook/react-native/issues/12778)）。
Microsoft AppCenterのReactNastive用ライブラリは、ネイティブコードの挙動を変更するといったことはせずに、JavaScript Coreの範囲内で動作しています（dlopen()、dlsym()、respondsToSelector(), performSelector(), method_exchangeImplementations()　未使用）。
これがApp Storeの審査を通っている理由だと解釈されていています。

以上から、ReactNativeは、Rollout.io、jsPatchが拒否された理由においては、拒否されることはないと判断をしても良さそうな状況です。

ただし、アプリの機能が変わってしまう場合は、Apple Storeの審査を通す必要があるのはガイドラインから明らかで、その点はReactNativeとMicrosoft AppCenterを利用する際に注意が必要になります。

# 結論
+ ReactNativeのライセンスはMITになった
+ ReactNativeアプリのHot Code PushはAppStoreの審査を通っている


# 免責事項
今後、ReactNativeのライセンスをFacebookが変更するかもしれませんし、AppleのAppStoreの審査方針に変更があるかもしれません。
また、何か私の見落としや誤解があるかもしれません。
最終的には、最新情報の収集、企業が取れるリスクの判断をしたうえで、各自の責任でご利用ください。

# 参考
+ [React NativeがMITライセンスに！！今までの経緯と詳細](https://bagelee.com/programming/react-native/react-native-license/)