エンジニアリングにはほど遠い

iPhoneアプリとかサイトとかをつくっていくブログです。

Google Data APIs Objective-C Client Library をXcode4で使う為の準備をした

これから作る4作目にあたって、とりあえず"TestYoutube.xcodeproj"という名前でプロジェクト作りました。
Xcodeのバージョンは4.2です。

Youtube APIを使う為にはGoogleのライブラリを使うのがいいっぽいです。
僕はObjective-Cしかほとんど見た事もないんですが、Objective-Cのクライアントライブラリがあるとのことで嬉しかったです。(まあそういうのあるはず?なんかな?)

基本的にここを参考させてもらって作業を行いました。

Google Data API Objective-C Client Libraryの使い方
Xcodeでのincludeパスの設定方法
iPhone で Picasa クライアントを作成する準備
gdata-objectivec-clientを静的ライブラリとして組み込むには

ライブラリのダウンロード

まずコマンドラインでライブラリ群をダウンロードしました。(Subversionがインストールされている必要あり)

svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/ gdata-objectivec-client-read-only

(実は最初、Google codeのページからObjective-Cクライアントライブラリのダウンロードページに行きました。そこでgdata-objectivec-client-1.12.0.zipをダウンロードしました。でもこれはなんか後でバグったんでzipでダウンロードしない方がいいです。
また、ダウンロードしたファイルの中のプロジェクトファイル(GData.xcodeproj)を、使いたいプロジェクトの中に入れてクロスプロジェクトリファレンスを作成し、APIを使うという方法があったんですが、なんかうまくいかずにやめました)

libGDataTouchStaticLib.aとHeaders生成

GData.xcodeprojをダブルクリックしてプロジェクトを開き、ツールバーのSchemeでActive Targetを"GDataTouchStaticLib"にしてiOS DeviceとiPhone5.0シミュレータでReleaseビルドしました。このままだとエラーになります。(Debugだと通る)

これはCフラグの中の"DGDATA_INCLUDE_nameServiceHere_SERVICE=1"を自分の使いたいAPIに応じて変えなきゃいけない為です。僕は"DGDATA_INCLUDE_YOUTUBE_SERVICE=1"としました。

で、こうすると"libGDataTouchStaticLib.a"が生成される・・との事だったんですが見つからず。。

そこでファイルの出力先を見る為にXcodeのpreference>LocationsのDerived Dataを見ました。
Dafault設定だったんですが、
それだと/Users/********(自分の名前)/Library/Developer/Xcode/DerivedDataが出力先で、そのディレクトリの中にさっき生成されたディレクトリ"GData-...."がありました。
そこから、GData-...>Build>Products>Release-iPhoneos>libGDataTouchStaticLib.a にたどり着けました。このファイルと同じ位置に"Headers"というライブラリのヘッダファイル群もできていました。

ここで、一つ上の位置でコマンド実行してライブラリを統合しました。

lipo -create Release-iphoneos/libGDataTouchStaticLib.a Release-iphonesimulator/libGDataTouchStaticLib.a -output libGDataTouchStaticLib.a

(統合されたものは一つ上のディレクトリに新たに生成されるので注意)

さっき統合したlibGDataTouchStaticLib.aをTestYoutube.xcodeprojにドラッグ&ドロップで追加しました。

プロジェクトに組み込み

TARGETSのBuild Settingsの設定

  • Other Linker Flagに、フラグを追加しました。
-ObjC -lxml2
  • Header Search Pathに、次のパスを追加しました。
/usr/include/libxml2(Recursive:再起的に検索 にチェック)
$(SRCROOT)/gdata-client/Source/build/Release-$(PLATFORM_NAME)/Headers

(2つ目を入力する時は+を押します。
$(...)のところはそのまま入力するとXcodeが然るべき値に変換してくれます)

これで、適当なファイルに #import "GData.h" を追加して、ビルドが通ればOK、とのことだったんですが、通らない!
'libxml/tree.h' file not found というエラーが起きてしまいました。

このページを参考にして、Xcodeでのincludeパスの設定方法

PROJECTのBuild Settingsの"Other C Flags"に"$(OTHER_CFLAGS)-I/usr/include/libxml2"と入れました。
すると今度は構造体の中にNSStringがあるという風に怒られてエラーになる現象発生。

"Automatic Reference Counting issue"との事で、PROJECTのBuild SettingsのObjective-C
"Automatic Reference Counting"をYesからNoにしました。

これで、ようやくビルドが通りました・・・。
Automatic Reference Counting(ARS)(ARC)はなんか自動参照カウンタらしく、切っちゃっていいのかよくわかんないですし、これで設定がうまく行ったのか謎です。でもこれで引き続き行こうと思います。

いや〜、結構大変でした。ニコ生リスナーさんの方々のおかげです。ありがとうございます。