Titanium の小ネタ / Titanium Advent Calendar 1日目 #TitaniumJP

こんにちは。最近あまり Titanium 活動 (タイカツ) ができていない @ryugoo です。この記事は [Titanium Advent Calendar 2014](http://qiita.com/advent-calendar/2014/titanium) のスタート記事として提供いたします。これまでは自分のサイトに書いてましたけど、最近は Qiita 推しなのでこちらに書きたいと思います。

初日なので、小ネタをいくつか書いていきましょう。

## iOS 編

### Titanium 3.4.x と iOS のバージョン

まずは冷静になって、ドキュメントの中にある [Titanium Compatibility Matrix の iOS SDK / Target iOS Platform の節](http://docs.appcelerator.com/titanium/latest/#!/guide/Titanium_Compatibility_Matrix-section-29004837_TitaniumCompatibilityMatrix-iOSSDK%2FTargetiOSPlatform)を読んでみましょう。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/5036/f1d7feab-b57a-13cf-d42e-d043723b6590.png)

3.4.0 - latest の Minimum target iOS version は 7.1.x を指していますが、これは **大嘘** です。 Store にリリースするための Distribution Build を行うと、 iOS 6 でも動作するバイナリが出力されます。

この記事を書くためにあらためて Titanium 3.4.0.GA の Release Notes を読んでみたら、 **[6.x は Device Only](http://docs.appcelerator.com/titanium/release-notes/?version=3.4.0.GA#ios)** になっていました。ちなみに、 [Titanium 3.4.0.RC の Release Notes](http://docs.appcelerator.com/titanium/release-notes/?version=3.4.0.RC#ios) を読んだら **No** になっています。何を信じたら良いのでしょうか。

Titanium Compatibility Matrix と RC 時点の Release Notes を信じた私は、痛い目に遭わされました。皆さんも今後、 iOS 向けアプリを Titanium で書かれている場合、 SDK バージョンアップの際は対応を想定している iOS のバージョンには気をつけましょう。

### Titanium と iOS 64bit 対応

2015.02.01 から Apple にアプリを提出する際には 64bit バイナリを同梱させることが必須になりました。これはつまり、アプリのバージョンアップを行う際には Titanium SDK を必ず最新のものにしなくてはならないということです。

ということは、先に書いた iOS バージョン問題がのし掛かってくるわけです。この記事を書いている時点の GA 版 SDK はまだ 64bit 対応していませんが、先日 [Appcelerator の Developer Blog](http://www.appcelerator.com/blog/2014/11/alpha-version-of-titanium-sdk-64-bit-support-now-available/) で Alpha 版として [64bit 対応版の SDK](http://builds.appcelerator.com/#3.5.0) が公開されました。

64bit 対応版の SDK が GA になる際はバージョンが 3.6.0.GA になる予定ですが、 64bit 対応を行う際に注意が必要な点は以下の通りです。

* Titanium SDK を 3.6.0.GA にしなければならない
* 使用している **ネイティブモジュールも全て 64bit 対応** を行わなければならない

忘れがちなのがモジュールです。もしも [Open Mobile Marketplace](https://marketplace.appcelerator.com/home) などでモジュールのバイナリを購入している場合、モジュールが 64bit 対応アップデートされない限りは、 Apple に提出できなくなってしまいます。 GitHub などで公開されているモジュールの場合は、 Xcode でモジュールプロジェクトを開いて、 Architecture を変更した上で再ビルドすれば対応ができるかもしれません。

また、モジュールの中でサードパーティのフレームワークやライブラリを使っている場合、これも 64bit 対応が必要になります。これらが 64bit 対応していなかったとして、対応版が登場した際に ARC 想定になっている場合は、[モジュールも ARC を有効にして使えるように改修する](http://ryugoo.hateblo.jp/entry/2013/12/24/011728)必要があります。今からでも調査・検証を開始した方が良いでしょう。

## Android 編

### NFD と NFC

Mac でファイルを作って、保存したファイルを Windows に持って行ったらファイル名が妙なことになったことはありませんか？または、 Android で何かしらの Web API を呼び出して JSON を取得したとき、取得した文字列の "濁点" や "半濁点" が妙なことになったことはありませんか？

![002.png](https://qiita-image-store.s3.amazonaws.com/0/5036/f9056b74-3517-8bb9-a9fe-c3b7a2eee5a3.png)

これは、 Android が [NFD](http://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96) に対応していないことによる問題です。 Titanium の問題ではありません。文字と濁点が分離していて、合成された状態 = NFC にならないのです。 Java によるネイティブ開発であれば、

```java
// 例
final String normalized = Normalizer.normalize("カ゛オカ゛イカ゛ー", Normalizer.Form.NFC);
```

のように、 `Normalizer` という API を使ってあげれば合成した文字列を取得することができます。しかし、 Titanium では `Normalizer` にブリッジされた API が提供されていません。

というわけで、**[モジュールを作りました](https://github.com/ryugoo/TiTextNormalizer)**。モジュールを使うと、

![003.png](https://qiita-image-store.s3.amazonaws.com/0/5036/6bffcc66-8f3a-4821-554b-7899f88ba802.png)

こんな風に合成された文字列を取得することができます。

### TiTextNormalizer の紹介

作ったモジュールは GitHub 上で公開しています。

> TiTextNormalizer : [https://github.com/ryugoo/TiTextNormalizer](https://github.com/ryugoo/TiTextNormalizer)

Java に用意されている `Normalizer` API をそのままラップしただけのモジュールなので、できることもそのままです。ビルドしなくていいように [GitHub Releases にビルド済みバイナリが置いてあります](https://github.com/ryugoo/TiTextNormalizer/releases)。

```javascript
var module = require('net.imthinker.ti.textnormalizer');
var text = 'ガオガイガー';

// normalize
var nfc = module.normalize(text, module.NFC);
var nfd = module.normalize(text, module.NFD);
var nfkc = module.normalize(text, module.NFKC);
var nfkd = module.normalize(text, module.NFKD);

// isNormalized
module.isNormalized(text, module.NFC); // true
module.isNormalized(text, module.NFD); // false
module.isNormalized(text, module.NFKC); // true
module.isNormalized(text, module.NFKD); // false
```

Web API から取得した文字列の濁点・半濁点が分離して表示されていることがあったら、是非ともご利用ください。 Apache License, Version 2.0 なので、自由にご利用いただけますが、組み込んだアプリを公開することがあったらライセンスは記述してくださいね。

## おわりに

これで Titanium Advent Calendar 2014 1日目 の記事はおしまいです。2日目は @isseium さんです。よろしくお願いしますヽ(´ー｀)ノ