Mac OS X用Framework作成手順

Pocket

こんにちわ。今回はMac OS X用のFrameworkを作成する最初の手順を説明しようと思います。

スクリーンショット 2013-06-18 16.53.21
最初に、Frameworkプロジェクトを作成します。新規プロジェクトの作成で「OS X>Framework & Library」から「Cocoa Framework」を選択してください。

スクリーンショット_2013-06-18_18.27.50
今回は「Utils」という名前でFrameworkを作成します。

デフォルトでUtils.h, Utils.mが作成されているので、ここにテスト用メソッドを追加します。

このUtilsクラスをFrameworkとして公開したいので、ヘッダファイルが外部参照可能になるよう設定を変更します。

スクリーンショット_2013-06-18_18.32.47
Utils.hを表示した状態で、横のインスペクタの「Target Membership」欄のチェックボックスをONにします。

スクリーンショット_2013-06-18_18.35.21
ONにすると横の公開範囲が変更可能になるので、そのまま「Project」を「Public」に変更します
スクリーンショット_2013-06-18_18.35.27

Frameworkでどのヘッダが公開設定になっているかは、各TARGETの「Build Phases > Copy Header」で確認できます。

次に、Frameworkが利用される時にアプリケーションから正しくファイル位置を参照されるための設定をします。

スクリーンショット_2013-06-18_18.37.47
TARGETS>Build SettingsのDeployment>Installation Directoryを変更します。

スクリーンショット_2013-06-18_18.38.12
元々は「/Library/Frameworks(開くと$(LOCAL_LIBRARY_DIR)/Frameworks)」になってるのを「@executable_path/../Frameworks」に変更します。
@executable_pathは、アプリケーション実行時に実行パスに自動的に置き換えるための宣言です。

スクリーンショット_2013-06-18_18.38.44

この状態でFrameworkを1度buildしてみます。
エラーが出なければそのままテストアプリの作成に入ります。
(おっと、Framework側のプロジェクトはまだ閉じないでください!)

スクリーンショット 2013-06-18 18.40.30

Framework側のプロジェクトは開いたまま、新規にCocoaアプリケーションプロジェクトを作成します。
スクリーンショット_2013-06-18_18.40.40
今回はTestAppという名前にしました。

スクリーンショット_2013-06-18_18.43.16
Framework側プロジェクトのProductsのUtils.frameworkをTesetAppプロジェクトへDrag & Dropして、プロジェクトの参照関係を設定します。

スクリーンショット_2013-06-18_18.43.23
ドロップ時に出てくるシートでは、このように参照モードで追加するよう設定します。

この段階でTestAppプロジェクトでFramework側のヘッダを参照出来るようになっているので、AppDelegate.mにUtilsを呼び出すコードを記述してみます。

スクリーンショット_2013-06-18_18.50.11-2
……おや

エラーメッセージを読んでみましょう。

dyld: Library not loaded: @executable_path/../Frameworks/Utils.framework/Versions/A/Utils
  Referenced from: /Users/foo/bar/TestApp/DerivedData/TestApp/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp
  Reason: image not found

要約するとApp内に対象のFrameworkが見つからない、という事になります。
なので、AppのBuild時にFrameworkもコピーするよう設定します。

スクリーンショット_2013-06-18_18.53.30-2
「TARGETS>Build Phases」にてAdd Build Phaseを押し、

スクリーンショット_2013-06-18_18.54.00
「Add Copy Files」を選択します。

スクリーンショット_2013-06-18_18.54.53-2
Build Phasesの最下段に「Copy Files」欄が追加されます。

スクリーンショット_2013-06-18_18.55.34
Copy Filesを展開するとこのようになります。

スクリーンショット_2013-06-18_18.55.47
今回はFrameworkをCopyしたいので、Destinationを「Resources」から「Frameworks」に切り替えます。

スクリーンショット_2013-06-18_18.56.00
空のリストエリアへUtils.frameworkをD&Dして追加します。

これで先ほどの不具合の対応が出来たので、もう一度してみます

スクリーンショット_2013-06-18_18.59.35
無事ログ出力を確認出来ました。

スクリーンショット_2013-06-18_19.54.46

この時、TestApp.appパッケージ内はこのような構成になっています。
Contentsフォルダの下に追加されているFrameworks以下が埋め込みFrameworkとしてアプリケーションから参照されることになります。
実行ファイルである「Contents > MacOS > TestApp」から見てUtils.Frameworksが../Frameworksに配置されている事が確認できます。
これは前述のInstallation Directoryの設定通りです。

以上で説明を終わります。
最初の出力ディレクトリ指定さえ間違えなければ、あまり戸惑う箇所も無いかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です