appcelerator titaniumでsocket.io (1.x)
TRANSCRIPT
Titanium と Socket.IO
• Socket.IO ~0.9.x よくある Websocket• 対応モジュール多数
• Socket.IO 1.0~ 独自のプトロコルを採用• Swift で書かれたクライアントライブラリしか用意されていない• 対応モジュール無し• https://github.com/socketio/socket.io/issues/1590
• じゃあ作ろう
最初の試み: Hyperloop
• Hyperloop は Swift を扱うことができる• Swift クライアントをビルドした結果… エラー
• build directory の設定ができない• use of undeclared type ~
• 完全敗北
次の試み: Framework + Obj-C モジュール• Swift で書かれた部分を Framwork として Obj-C アプリに転用
• Swift では Static ライブラリが作成できないので Framework に• Framework は Obj-C で書いたモジュールから呼び出す
次の試み: Framework + Obj-C モジュール• Swift で書かれた部分を Framwork として Obj-C アプリに転用
• Swift では Static ライブラリが作成できないので Framework に• Framework は Obj-C で書いたモジュールから呼び出す
• 結果: Carthoge で Framework を作成、モジュールからの呼び出し OK
次の試み: Framework + Obj-C モジュール• Swift で書かれた部分を Framwork として Obj-C アプリに転用
• Swift では Static ライブラリが作成できないので Framework に• Framework は Obj-C で書いたモジュールから呼び出す
• 結果: Carthoge で Framework を作成、モジュールからの呼び出し OK• ただし: Xcode からでないとビルドできない
考えた• Swift のコードはそのままでは使えない
• Framework にすると使える• Framework は動作する
• モジュールも作った• Embedded Binary として Xcode で手動で設定しないといけない
• ビルドの度に Xcode を開くなんて負け犬のやることだ
突破口はいつもだいたいマニュアルから• なぜか modules/android/hyperloop/1.2.0/documentation/ にある
Adding a third-party frameworkIf you'd like to add a third-party framework which isn't distributed with source code or available in CocoaPods, you can use this example configuration:javascript module.exports = { hyperloop: { ios: { xcodebuild: { flags: { FRAMEWORK_SEARCH_PATHS: '/path/to/framework' }, frameworks: [ 'FrameworkName' ] } } } };In the above example, /path/to/framework should point the the location of the .framework file and FrameworkName should be the name of the Framework.
最終兵器 appc.js
• xcodebuild のオプションを設定できる xcodebuild: { flags: { LD_RUNPATH_SEARCH_PATHS: "$(inherited) @executable_path/../" } }
備考• デフォルトでは Swift が有効にならない
• appc.js に適当な Swift の設定を仕込んでおく• 使わない Swift のコードを置いておく
• 今回は Obj-C でモジュールを書いたが逆にここを Swift にする手もある• Framework の wrapper クラスだけ Swift で書いて JS から呼び出す