Hatena::ブログ(Diary)

Ni chicha, ni limona -平均から抜けられない僕- このページをアンテナに追加

2009年02月19日

[Mac][iPhone][develop] iPhone OS用のほぼFrameworkの作り方

ココとかココ、それにココなど、世界で待ち望まれているけれど殆どの人が失敗しているっぽい「iPhone OS用のFrameworkファイル」の作り方について、ほぼ成功した方のブログを見つけました。

概要を先に書いておくと、どうもFrameworkではなくて「複数アーキテクチャに対応したStatic Library(.a)」を作成することで、同じような利便性を得ているようです。

(それが《ほぼFramework》と表現した理由です。ボク的には今後これを『ほぼフレ』と呼びます)

 『How to (almost) create your own iPhone OS framework

  - Written by Peter Bakhyryev / Tuesday, 25 November 2008 03:52

ここに書かれた手順を試してみたところ予想以上にうまくいったので、以下に記録を残します。みなさんもぜひ再利用を簡単にするこの仕組みを利用してみてください。

■ほぼフレ作成の流れ

1.プロジェクト作成と余計なファイルの削除

Xcodeを起動し、"Window-Based Application"で新規プロジェクトを作成します。そして以下のファイル以外はいったん全て削除してください。

  • Foundation.framework
  • UIKit.framework
  • <プロジェクト名>_Prefix.pch

ただしこのとき.pchファイルだけは残すように注意してください。画面では以下のような状況です。

   f:id:paella:20090219160534p:image

2.ほぼフレ用ターゲットの作成

次にStatic Libraryとして新規ターゲットを2つ作成します。iPhone Simulator用とデバイス用の2種類のためです。「プロジェクト」-「新規ターゲット...」から“Cocoa touch”にある“Static Library”を選んでください。

   f:id:paella:20090219162228p:image

ここでは元記事に倣って名前を「<ほぼフレ名> - sim」と「<ほぼフレ名> - dev」と付けました。そしてターゲットの情報で「ベースSDK」という項目でそれぞれSimulatorとDeviceに設定しておきます。

   f:id:paella:20090219162640p:image

このときの状況はこんな感じです。

   f:id:paella:20090219162819p:image

そうそう、元からあるアプリケーション用ターゲットは削除しておくのを忘れないようにしてください。

3.ソースコードの追加とビルド

ソースコードを追加します。ここは普通に書いたコードで良いのですが、1点だけ注意事項があります。NSObjectなどを使う場合はCocoa/Cocoa.hをインポートせず、Foundation/Foundation.hかUIKit/UIKit.hをインポートしてください

最初ボクはこれにはまってしまい、しばらく時間を浪費してしまいました。Cocoa-touchのObjective-CクラスファイルならデフォルトでFoundation/Foundation.hがインポートされているので大丈夫ですが・・・。

そしてビルドします。ソースに問題がなければ無事に.aファイルが出来ていると思います。

   f:id:paella:20090219165752p:image

この段階でも使えるようになっているので、まずは一段落。

4.ライブラリのマージ、ほぼフレの完成

そしてここがメインイベントです。

ファイルをユニバーサルバイナリ化するlipoコマンドを使って、全ターゲット&ビルド構成をマージします。もちろん、ここでもターゲットを活用してビルド作業を簡単にしますよ。

まずは「Shell Script Target」で新規ターゲットを作ります。

   f:id:paella:20090219171610p:image

そして他のターゲット(.aファイルでなく、ターゲットそのものなので注意)を作成したターゲットにDrag&Dropします。

   f:id:paella:20090219171611p:image

そうしたらターゲットの「スクリプトを実行するフェーズ」の情報にある「一般」タブで、以下のスクリプトをコピペしてください。

# 注意:以下で「PseudoFramework XXX」となっている部分は適宜書き換えてください。

# remove existing product lib file, just in case
rm -rf build/${BUILD_STYLE}-iphoneos/libPseudoFramework-${BUILD_STYLE}.a

# combine lib files for various platforms into one
lipo -create "build/${BUILD_STYLE}-iphoneos/libPseudoFramework - dev.a" \
  "build/${BUILD_STYLE}-iphonesimulator/libPseudoFramework - sim.a" \
  -output "build/${BUILD_STYLE}-iphoneos/libPseudoFramework-${BUILD_STYLE}.a"

以下の画面のようにコピペ、です。

   f:id:paella:20090219181000p:image

これでDebug,Release双方でビルドすれば、build/{Debug,Release}-iphoneosフォルダ下にlibPseudoFramework-{Debug,Release}.aというフォルダの出来上がりです。

さあ、この.aファイル、じゃなくてほぼフレファイルとヘッダファイル(群)を他のプロジェクトに持ってくれば、普通のFrameworkのように使えるようになります。いかがですか?

5.(Optional)ライブラリファイルの参照を追加して使いやすくする。

上の4でほぼフレは完成しているのですが、他のプロジェクトからも使いやすくするために、このプロジェクトからDrag&Dropが出来るようにしましょう。

プロジェクト上で新規グループを作成し、その中に「追加」-「既存のファイル...」で出来上がったほぼフレを置いておきましょう。

こうしておけば他のプロジェクトでいちいちFinderからファイルを引っ張ってくる必要もなくなりますね。

最後に、この状態まで辿り着いたときのプロジェクトのツリーを以下に貼っておきます。

   f:id:paella:20090219184555p:image

■まとめ

以上の作業によって、自分たちで苦労してソースからビルドすることなくAPI等を使えるようになりました。

  • 誰かこれでBox2Dとかをほぼフレ化してくれる方を希望。;-)
  • というか、iPhoneアプリデベロッパーがほぼフレを共有しあえるような環境を誰か作ってくれませんか?

使ってみると感じるのですが、このほぼフレは本当に便利です。既存のフレームワークと変わりなく使えている感じです。

だから個人の利益だけではなく、iPhoneアプリ全体のレベルの底上げにも良い案だと思いますので、強く希望します!←他力本願

■補足

  • Build All時に"No architecture to compile for ..."と出た場合は、ライブラリのDebug/ReleaseでのSDKがきちんと指定できていない可能性があります。Simulator環境ではSimulator用SDKを、Device環境ではDevice用SDKを使用するように、ターゲットの設定をきちんと行っておいてください。
  • 元の記事では、さらに各バージョンのSDK用ライブラリを作る方法まで載っています。私は最新バージョンだけしか作りませんでしたが、興味のある方は「Step 4 (optional): Build libraries with different versions of the SDK.」を参照してください。

・・・あのぉ、ほぼフレって名前、違和感あります?(不安)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証