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


みなさんこんにちは！
この記事は [Appcelerator Titanium Advent Calendar  2015](http://qiita.com/advent-calendar/2015/appc-titanium)
の20日目です。

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

![スクリーンショット 2015-12-23 11.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/19316/0ce92153-1d5a-bd19-6ccf-8b9c0fdf06a7.png "スクリーンショット 2015-12-23 11.04.24.png")

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


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


![スクリーンショット 2015-12-23 11.10.16.png](https://qiita-image-store.s3.amazonaws.com/0/19316/6896a5d4-fbff-d909-3d4e-ff32b845ce6f.png "スクリーンショット 2015-12-23 11.10.16.png")

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

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


# 64bit対応する手順


まずは「[bencoding.network](https://github.com/benbahrenburg/TiNetworkHelpers)」をクローンするところからやります。

```
$ 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

![スクリーンショット 2015-12-23 11.10.16.png](https://qiita-image-store.s3.amazonaws.com/0/19316/8693e026-1137-e46d-9440-ffe682ce6001.png "スクリーンショット 2015-12-23 11.10.16.png")


## モジュールを修正する
64bit に対応させるため修正していきます。

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


``` diff
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のバージョンを修正します。

``` diff
vim iOSNetwork/manifest

-version: 1.0.1
+version: 1.0.2

```

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

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

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

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

``` diff 
$ 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対応できました。

![スクリーンショット 2015-12-23 12.01.35.png](https://qiita-image-store.s3.amazonaws.com/0/19316/309c7008-2750-7225-151c-bf7449590734.png "スクリーンショット 2015-12-23 12.01.35.png")


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

```
-- 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新年会やりたいです！
そして、コミュニティが盛り上がることをサンタに祈ってます。