iOS向けのライブラリを作りたいなと思っていて、Frameworkの作り方を調べていました。
ここでいうFrameworkというのは、Foundation.frameworkとかUIKit.frameworkとかのような、あれです。
iOS用Frameworkの作り方
Xcode4.5.1でiOS用のframeworkを作成する
- Static Libraryプロジェクトつくる
- Aggregateターゲット入れる
- フレームワーク用のInfo.plistつくる
- Run Scriptにビルドスクリプトを書く
- ビルドする
Framework用のテンプレートはないということで、自分で作るとかなり大変な模様・・・。
テンプレートプロジェクトiOS-Universal-Framework
もう少し調べてみると、この面倒な手順をまとめたプロジェクトテンプレートがGitHubで公開されていました。
iOS-Universal-Framework
試しにGitリポジトリからクローンしてみます。
$ git clone git://github.com/kstenerud/iOS-Universal-Framework.git
Cloning into 'iOS-Universal-Framework'...
remote: Counting objects: 651, done.
remote: Compressing objects: 100% (312/312), done.
remote: Total 651 (delta 314), reused 600 (delta 269)
Receiving objects: 100% (651/651), 587.46 KiB | 216 KiB/s, done.
Resolving deltas: 100% (314/314), done.
インストーラでテンプレートを導入
install.shスクリプトを起動すると、対話でパスなどを指定してインストールが実行されます。
$ cd ./iOS-Universal-Framework/Real\ Framework/
$ ./install.sh
iOS Real Static Framework Installer
===================================
# ...(略)...
Where is Xcode installed? (CTRL-C to abort) [ /Applications/Xcode.app/Contents/Developer ]:
# ...(略)...
The templates will be installed in /Users/kataoka/Library/Developer/Xcode/Templates/Framework & Library
continue [y/N]: y
# ...(略)...
[ Installation complete. Please restart Xcode. ]
完了したら、Xcodeを再起動します。
新たにテンプレートが追加されました!
これだけでFrameworkのためのプロジェクトが作成できます。
実際にフレームワークを作る
あとはこのプロジェクトの中にフレームワークにまとめたいソースコードを投げ込んで、ビルドすれば良いです。
Products内に、SirokUtils.frameworkが作成されました。これをFinderなどで開いて、導入先のプロジェクトに投入すれば実際に使うことができます。
ヘッダーファイルを可視にする必要がある。
ただこのままだと正しく動かなかったりするので、2点注意が必要です。
ビルド設定でヘッダーファイルを見えるようにしておかないと、Frameworkの使い手側がインタフェースを知ることができず、実際に使うことができません。Build PhaseのCopy Headersの設定で、Frameworkの使い手に見せたいヘッダーファイルをすべてpublicにしておきます。
Releaseビルドする必要がある。
もうひとつの注意点は、他のプロジェクトに導入させるために、Releaseビルドをする必要があるということです。
ld: warning: ignoring file /Users/kataoka/workspace/SirokUtils/SirokUtils.framework/SirokUtils, file was built for archive which is not the architecture being linked (i386): /Users/kataoka/workspace/SirokUtils/SirokUtils.framework/SirokUtils
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_ArrayUtils", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
最初このようなリンクエラーが出ましたが、FrameworkプロジェクトのEdit Schemeから、ビルドをReleaseビルドに変えることで無事に動かすことができました。
コメント
[…] http://blog.katty.in/3003 […]
[…] iOSのFrameworkを簡単に作れるiOS-Universal-Framework […]