最初に前置き
現在、仕事で開発してるアプリで、位置情報と連携するものを開発してるのですが、ユーザさんがどこで、どのような機能を使ってるのかを後々把握できるような仕組みが必要になりました。
Google Analyticsのネイティブモジュールは古いのしか見つからない
こういうのを実現するためのおそらく最適な手段は、Google Analytics for iOSだと思われ、実際にGoogle Analytics - Titanium Appcelerator Moduleというものがだいぶ昔からあります。
ただ、
NOTE: This module is no longer actively being developed. You are welcome to use/update the code but there is the possibility that it will not work any more.
と書かれててすでに2年以上もメンテされていません。
Google Analytics以外の選択肢
自分のブログですが、アプリの解析にNewRelicのモジュールを利用する
というエントリでTitanium用のNew Relicモジュールについて触れたことが有るのですが、割りと使い勝手が良いので気に入ってます。
ただし、自分が調べる限りでは、FreeプランではGoogle Analyticsのようなユーザさんがどこで、どのような機能を使ってるのか把握するには、出来ないように見えます。
こんな状況なので、勉強ついでにモジュール開発にチャレンジしてみようと重い腰を上げてみたら、最低限の機能ですが思っていたよりも簡単に実装できたので、どういう情報を参考にして開発を進めていったのかまとめておこうと思います。
作り方に興味が無いっていう人もいると思うので、作ったモジュールはGitHubにアップしてありますが2014年10月24日時点で、一部処理がうまく動作しないのでその点注意して、自己責任でご利用くださいm(__)m
想定読者&開発環境
以下のような方を想定して、情報まとめてます
- 想定読者
- TitaniumでのiOS向けアプリ開発経験はあり、参考書籍などを見ながら動くものを作ったことがある
- ネイティブモジュールの言葉は聞いたことがある
- 他人が作ったモジュールを組み込んで動作させたことはある
- XcodeでObjectiveCでの開発にチャレンジしたことはあるけど何となく性に合わず挫折したことがある
- 開発環境
- OS X 10.8.5
- Titanium SDK 3.2.2.GA
- XCode 5.1.1
モジュールのプロジェクトを作成する
まずは、モジュールのプロジェクトを作成します。iOS 向けの Titanium™ 用モジュールを作ってみよう!などを見てて、Titanium Studioからやるのがなんとなく無難な気がするので、この作業はStudioから行いました。
この段階でビルド出来るか念のため確認します。
TitaniumのサポートサイトでSDK3でmoduleの作りかたについてのdocumentをさがしていますという質問に対する回答でモジュールをビルドして、example/app.js が立ち上がってモジュールのテストを行うための方法が書かれていたのでそれを参考にしてターミナル上で以下のようにします。
~/Library/Application\ Support/Titanium/mobilesdk/osx/3.2.2.GA/titanium.py run
上記実行するとビルドされて、最後の方に以下のような画面が表示されるかと思います。
[INFO] [object InfoH5y1m141TiGoogleAnalyticsModule] loaded
[DEBUG] Loading: /Users/hoyamada/Library/Application Support/iPhone Simulator/7.1/Applications/CBC00DC4-A76A-4D93-85AD-B049CD004DE2/TiGoogleAnalytics.app/info.h5y1m141.TiGoogleAnalytics.js, Resource: info_h5y1m141_TiGoogleAnalytics_js
[INFO] module is => [object InfoH5y1m141TiGoogleAnalyticsModule]
[INFO] module exampleProp is => hello world
[DEBUG] Application booted in 97.626030 ms
Titanium用のGoogle Analytics for iOSモジュールの作り方
ここから実際にどうやってモジュールを開発していったのか解説していきます。
まずはXcode上でGoogle Analytics SDK for iOSの使い方を理解する
想定読者をXcodeでObjectiveCでの開発にチャレンジしたことはあるけど何となく性に合わず挫折したことがあると書きましたが、これ、実は自分のことで、モジュール開発をするとなると当然のことながら、ネイティブでの開発についての知識がそれなりに問われてきます。
ネイティブでも普通に開発したことがあれば、それほど難しいことは無いのかと思うのですが、Titaniumでの開発経験しかないと、引数を渡した内容を確認したいんだけどTitaniumのTi.API.info()ってネイティブの場合にどう対応するんだろという凄い些細なこともわからず苦労します。
そのため自分が取ったアプローチとしては
- まずはTitaniumの世界から離れiOSアプリをGoogle Analyticsでアクセス解析する方法という情報を参考にGoogle Analytics for iOSなアプリをXcode上で開発する
- Xcode上でネイティブの開発をして動作するものが作れたらそれを参考にして、Titaniumのmoduleの方に移植
という形で行いました。上記のiOSアプリをGoogle Analyticsでアクセス解析する方法というサイトのコードを写経して実際にXcode上でビルドして動作確認したことでGoogle Analytics SDKをどのように使うのかだいぶイメージが出来ました。
Google Analytics SDKの必要なライブラリをコピーする
ライブラリをアプリケーションで利用するための初期設定を行う
必要なライブラリをコピーするだけでは、利用することが出来ないみたいで、利用するための設定を行います。
具体的にはTitanium Studioでモジュールのプロジェクトを作成した時に、プロジェクトのフォルダ直下に、xxxxx.xcodeprojというファイルが自動生成されるのでそれをダブルクリックします。
すると、Xcodeが起動します。Xcodeは機能が豊富で慣れてないとどの項目をどのように編集していいのかわからないと思うので画面キャプチャ付けて解説します
おそらくこのような画面が表示されるかと思います
左側のメニューの一番上を選択するとプロジェクト情報が表示されるので以下を選択していきます
- Build Phasesの項目を選択
- Link Binary With Librariesを選択
- プラス(+)ボタンを選択
プラス(+)ボタンを選択するとこのような画面が表示されます。
Google Analytics SDK for iOSを利用する際には
- libGoogleAnalyticsServices.a
- CoreData.framework
- SystemConfiguration.framework
- libz.dylib
が必要になります。ライブラリをコピーした時に、libGoogleAnalyticsServices.aはなぜか設定が完了していたので、残りのライブラリ&フレームワークを読み込みます。
読み込みたいライブラリ&フレームワークの名前を途中まで入力すると絞り込み検索されるので、順番に検索して追加していきます
Link Binary With Librariesの項目が最終的にこのようになればOKです
設定ファイルを編集する
この辺りが最初よくわからずにハマったのですが、上記のライブラリのリンクをしただけでは、ビルド時にライブラリのリンクをしてくれないようで、module.xcconfigを以下のように編集する必要があります
module.xcconfig
OTHER_LDFLAGS=$(inherited) /usr/lib/libz.dylib -framework CoreData -framework SystemConfiguration
moduleを作るために一部ファイルを編集する
上記のiOSアプリをGoogle Analyticsでアクセス解析する方法のトラッキング開始の所の
#import "GAI.h"
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// Initialize tracker.
[[GAI sharedInstance] trackerWithTrackingId:@"UA-48******-1"];
return YES;
}
という部分が、初期化処理をされてるように見えましたが、Titaniumのモジュールを開発する時にこういう初期化処理っぽいものは、以下のようにstartupの所に記載することで実施されるようです(この辺り理解が甘いので、間違いあったらご指摘ください)
#pragma mark Lifecycle
-(void)startup
{
// this method is called when the module is first loaded
// you *must* call the superclass
[super startup];
[[GAI sharedInstance]trackerWithTrackingId:@"UA-XXXXXXX-1"];
id tracker = [[GAI sharedInstance]defaultTracker];
[tracker set:kGAIScreenName value:@"TiGoogleAnalyticsSend!"];
[tracker send:[[GAIDictionaryBuilder createAppView] build]];
NSLog(@"[INFO] %@ loaded",self);
}
ひとまずこれでモジュールをビルドしてて動作確認したら、GoogleAnalytics上で動作確認が出来ました。
まとめ
最後の方は説明がちょっと投げやりになってしまいましたが、
- まずはTitaniumの世界から離れなるべくシンプルなアプリ開発の情報を見つける
- その情報を参考にして、Xcode上でネイティブの開発をして動作するものが作れたらそれを参考にして、Titaniumのmoduleの方に移植
という感じで作業することで、想像してるよりもモジュール開発が行えるかと思うので、モジュール開発に興味あるけどどこから手を付けていいのかわからないという人のお役に少しでも立てればと思います