iOSのモジュールを64bit対応する方法


みなさんこんにちは!
この記事は Appcelerator Titanium Advent Calendar 2015
の20日目です。

岩手でTitaniumを推進しているチイキットの伊藤です。20日に記事が間に合わず。。。
やばいな〜と思っていたら、Titaniumの巨人から催促がきましたw

来年は遅れずに書くようにします!!
「どんどんどん、パフパフ」は何か元ネタがあるのかな〜?と思いました。

みなさんこのエラー見たことありませんか?

はい!モジュールが64bit対応されていない時のエラーです。
このエラーだと「bencoding.network」のモジュールが64bitに対応できてないぞ!と言っています。
今回はモジュールの64bit対応の方法を書きたいと思います。すごく簡単なのですが、以外とちゃんと書いている日本語の記事は少ないと思ったので書きます。

今回は「bencoding.network」のモジュールがまだ対応されていないので、こちらでやっていきます。
bencoding.network」はネットワークの情報を取得するためのモジュールです。

64bit対応する手順

まずは「bencoding.network」をクローンするところからやります。

$ git clone https://github.com/benbahrenburg/TiNetworkHelpers.git

$ ls
README.md   iOSNetwork

$ cd iOSNetwork
$ ls
BencodingNetwork_Prefix.pch hooks
Classes             iosnetwork.xcodeproj
LICENSE             manifest
README.md           module.xcconfig
assets              platform
build.py            timodule.xml
dist                titanium.xcconfig
example

ビルドしてみる

$ ./build.py 
Build settings from command line:
    SDKROOT = iphoneos9.1

=== BUILD TARGET iosnetwork OF PROJECT iosnetwork WITH CONFIGURATION Release ===

Check dependencies

*
*
*

** BUILD SUCCEEDED **

最後にBUILD SUCCEEDEDが表示されればOKです。
カレントディレクトリにbencoding.network-iphone-1.0.1.zipが作成されているかと思います。

モジュールを試してみる

プロジェクトを作成し、プロジェクトフォルダの直下にモジュールを配置します。

$ appc ti create
Appcelerator Command-Line Interface, version 5.0.4
Copyright (c) 2014-2015, Appcelerator, Inc.  All Rights Reserved.

? project type:  app
? project name:  64bitModuleTest
? project id:  com.module.test

$ cd 64bitModuleTest
$ cp ../iOSNetwork/bencoding.network-iphone-1.0.1.zip .

tiapp.xmlのmodulesにbencoding.networkを追加し、
ビルドします。

$ vim tiapp.xml

<modules>
  <module platform="commonjs">ti.cloud</module>
  <module platform="iphone" version="1.0.1">bencoding.network</module>
</modules>

コントローラにモジュールを呼び出す記述をします。

$ vim app/controller/index.js

var network = require('bencoding.network');
Ti.API.info("module is => " + network);

Ti.API.info("Create a new Carrier Info Object");
var carrier = network.createCarrier();
Ti.API.info("Call the findInfo method to return the carrier details");
var carrierInfo = carrier.findInfo();
Ti.API.info("Are we on the simulator? => " + carrierInfo.isSimulator);
Ti.API.info("Get carrier name => " + carrierInfo.carrierName);
Ti.API.info("Get mobile country code => " + carrierInfo.mobileCountryCode);
Ti.API.info("Get mobile network code => " + carrierInfo.mobileNetworkCode);
Ti.API.info("Get ISO country code for cellular service provider => " + carrierInfo.isoCountryCode);
Ti.API.info("Mobile service provider supports VOIP => " + carrierInfo.allowsVOIP);

ビルドしてみます。

$ appc ti build -p ios
Appcelerator Command-Line Interface, version 5.0.4
Copyright (c) 2014-2015, Appcelerator, Inc.  All Rights Reserved.

エラーになります。今後バージョンアップされるとこのエラーは見えなくなるので、試したい方は以下の日付までのコミットに戻して貰えるとできるかと思います。
※2015/12/23時点
※最新コミットID:fc310a3c11af0662a59e2eb569011e26b5cb8efa

モジュールを修正する

64bit に対応させるため修正していきます。

xcodeからGUIでも操作できますが、
ファイル自体を編集していきます。
project.pbxprojを2箇所アーキテクチャを設定する部分があるので、Xcodeのデフォルトのアーキテクチャを設定します。7.1.1以上であればデフォルトの設定が64bit化されたものになります。

vim iOSNetwork/iosnetwork.xcodeproj/project.pbxproj


                        buildSettings = {
-                               "ARCHS[sdk=iphoneos*]" = (
-                                       armv6,
-                                       armv7,
-                               );
-                               "ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)";
+                               ARCHS = "$(ARCHS_STANDARD)";
+                               "ARCHS[sdk=iphoneos*]" = "$(ARCHS_STANDARD)";
+                               "ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)";



                        buildSettings = {
                                ALWAYS_SEARCH_USER_PATHS = NO;
-                               "ARCHS[sdk=iphoneos*]" = (
-                                       armv6,
-                                       armv7,
-                               );
-                               "ARCHS[sdk=iphonesimulator*]" = i386;
+                               ARCHS = "$(ARCHS_STANDARD)";
+                               "ARCHS[sdk=iphoneos*]" = "$(ARCHS_STANDARD)";
+                               "ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)";

あとは、moduleのバージョンを修正します。

vim iOSNetwork/manifest

-version: 1.0.1
+version: 1.0.2

再度ビルドしプロジェクト直下に配置します。

$ ./build.py 
$ cp bencoding.network-iphone-1.0.2.zip ../64bitModuleTest/

修正したモジュールでビルドしてみる

tiapp.xmlのモジュールバージョンを修正します。

$ vim tiapp.xml

-    <module platform="iphone" version="1.0.1">bencoding.network</module>
+    <module platform="iphone" version="1.0.2">bencoding.network</module>

いよいよ準備は整ったので、
ビルドします。

$ appc ti build -p ios
Appcelerator Command-Line Interface, version 5.0.4
Copyright (c) 2014-2015, Appcelerator, Inc.  All Rights Reserved.

はい!みなさん成功です。
エラー画面がなくなりました。
64bit対応できました。

以下のログはモジュールの機能を使ったログになります。
こちらが見えていれば正常にモジュールも動いたことになります。

-- Start simulator log -------------------------------------------------------
[INFO]  Application started
[INFO]  64bitModuleTest/1.0 (5.0.2.92c2265)
[INFO]  module is => [object bencoding.network]
[INFO]  Create a new Carrier Info Object
[INFO]  Call the findInfo method to return the carrier details
[INFO]  Are we on the simulator? => true
[INFO]  Get carrier name => simulator
[INFO]  Get mobile country code => unknown
[INFO]  Get mobile network code => unknown
[INFO]  Get ISO country code for cellular service provider => unknown
[INFO]  Mobile service provider supports VOIP => false

64bit対応は以外と簡単でした!
実はプルリクで同じような対応がきているので、すぐこちらのモジュールは64bit対応はされるかと思います。

しかし!!iOSの話しでネットワークのフレームワークが動かなくなったりしているので、今回のモジュールは実はWifiのSSIDを取得するために使用したいと思ったのですが、、
実は今のままでは使えません。。

Titaniumでできることを増やすためにもiOSについてもっと勉強しないとな〜と考えさせられました。

さいごに

yagi-sanこれでクリスマス開催できますね!!
Titanium新年会やりたいです!
そして、コミュニティが盛り上がることをサンタに祈ってます。