App Storeの審査プロセスを経由せずに,ネイティブのObjective-Cアプリをライブアップデート可能にするソリューションを開発するRolloutが,Swiftのサポートを発表した。Swiftアプリのライブアップデートあは,同社が擬似Method Swizzling(メソッド入れ替え)と呼ぶテクニックを通じて実行する。
Objective-Cアプリの場合,Rolloutがアプリのパッチを実現したメカニズムは,Method Swizzlingとして知られている動的プログラミングテクニックである。これは開発者が,Objective-Cランタイムがクラス内の関数とメソッドシグネチャを関連付ける方法を変更することによって,既存メソッドの実装変更を可能にするものだ。入れ替えられたメソッドは,Rolloutクラウドからダウンロードされた新しい実装によって完全に置き換えることも,単にラップすることもできる。Rolloutでは,開発者が置き換えメソッドをJavaScriptで定義することができる。WebKitあるいはJavaScript Coreによって実行されるコードのみダウンロードを許可しているAppleのガイドラインに準拠する上で,これは重要なメカニズムになる。また,メソッド呼び出しのトレースログの追加やメソッドの無効化など,特定の目的を達成するように事前定義されたテンプレートも使用可能だ。
Method Swizzlingは,実行時プログラミング機能を持たないSwiftでは本質的に使用できないので,RolloutのCTOであるEval Keren氏が説明するように,Swift用に同等なものを開発する必要があった。簡単に言うとRolloutが行なったのは,次の例ように,各メソッドにプレフィックスを追加することによって,アプリをSwiftの中間言語(SIL)レベルで操作する方法だ。
func add(a:Int, b:Int) -> Int {
if Rollout_shouldPatch(ROLLOUT_a79ee6d5a41da8daaa2fef82124dcf74) {
let resultRollout : Int =
Rollout_invokeReturn(Rollout_tweakData!,
target:self,
arguments:[a,
b,
origClosure: { args in return self.add(a:args[0],b:args[1]);});
return resultRollout;
上のコードではRollout_invokeReturn
が,RolloutクラウドからダウンロードされたJavaScript関数の実行を担当する。この関数は,必要ならば元のメソッドをコールバックすることもできる。
さまざまなコンテキストで利用可能なRollout for Objective-Cと比較すると,Rolloutが改善に取り組んでいるとは言え,Swiftのサポートはまだ初期段階に過ぎない。特に:
- Swiftのパッチから,パッチメソッド自体か
@objc
メソッド以外のネイティブなSwiftメソッドの呼び出し,あるいはネイティブなSwiftオブジェクトの生成はできない。 - 戻り値をオーバーライド可能なのは,
String
,Number
,Optional
およびObjective-C互換クロスなど,特定数の型に限られている。 - Swiftのネイティブな例外をキャッチすることはできない。
- 静的クラスメソッドやオーバーロードされたインスタンスメソッド,
構造体メソッド
など,多くのSwift機能がまだサポートされていない。
Rolloutによると,上記の制限のいくつかについてはすでに実装されていて,現在はベータテスト中である。
Rolloutによると,同社のライブアップデートソリューションはすでに数千のモバイルアプリによって使用されており,Appleのガイドラインに完全準拠している。
この記事を評価
- 編集者評
- 編集長アクション