Rollout.io導入アプリがリジェクトされた話題は、3月7日にHackerNewsで盛大に盛り上がりました。
Hot Code Pushというのは、App Storeのレビューを通さずにアプリの挙動を変更できる仕組みのこと。
Rollout.ioはこの仕組みを利用してバグ修正が迅速に行えるサービスを提供していました。
上記Hacker Newsのコメ欄にRolloutのCEOのErezが出てきたりして、顔面蒼白ぶりがひしひしと感じられますねぇ。
これだからプラットフォーム依存は怖い!
ネイティブの動きを変えられるようにするのはダメ
何がダメかっていうと、以下のAPIを使って動的に挙動を変えられるようにすることです:
dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations()
いくら安全にこれを取り扱ったとしても、ハイジャックされてMITMアタックとかが起こりえるからダメというのがAppleの判断。
これ別に昔っからあるライセンス条項だったと思うんですけど、どうやら最近になって急に厳しく取り締まり始めたのが騒動の発端らしい。
React NativeのCode Pushはどうなの
このニュースを見て個人的に気になったのがReact Nativeアプリへの影響です。
React NativeにもCode Pushというライブラリがありますが、これもダメなんでしょうか?
調べてみると、React NativeのGitHub issueで既に結論が出ていました:
Problem: Apps with the lib Rollout.io, JSPatch and similars are being rejected because they can dynamically change Swift / Objective-C code without passing through Apple Review process.
Libraries like Code Push only updates JavaScript code and were not affected, at least not yet.
React Native has nothing to do with this problem, don’t worry about it.
次にライセンスを確認してみます。
Apple Developer Program License Agreement
Except as set forth in the next paragraph, 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 exceptions to the foregoing are 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.
強調は筆者による。
大丈夫そう
上記の通りライセンスでは、WebKitとJavascriptCoreで実行されるコードに関しては例外としています。
また、React NativeとCode Pushでは先述の禁止されたAPIをExposeしていません。
Code PushはあくまでReact Nativeのbundleコードしか変更しません。
よって、この組み合わせは大丈夫!!!!
審査通ったよっていう報告も見つけました。
JSPatchとRolloutは使うな
要はネイティブの挙動は変えちゃダメよって話です。
JSPatchやRolloutはこれをしています。
同じような機能を提供しているライブラリも軒並みアウトでしょう。
気をつけてください。