iOSのFrameworkを簡単に作れるiOS-Universal-Framework

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ビルドに変えることで無事に動かすことができました。

コメント

  1. […] iOSのFrameworkを簡単に作れるiOS-Universal-Framework […]

タイトルとURLをコピーしました