Xcode6 で Framework を作成する[iPhone]
📅 December 03, 2014
•⏱️6 min read
本記事は参考元サイト様を敬愛し、参考元サイト様を参照していただくことをベースに作成しています。
自身の備忘録である意味合いが強いため、説明不足な点や誤りがあるかもしれないこと、
文章のみの説明となりますこと、ご留意ください。
[追記 14/12/9] 本記事では、私が試したXcode6でのFramework作成方法を紹介していますが、以下のサイト様を参考にした方が問題なくFrameworkを作成できると思います。
MoonMt.Lab IT開発技術 調査報告書 - iOSアプリ開発においてFrameworkを自作する方法
もし、↑のサイト様でできない!って方は、恐らく 「ヘッダーファイルを可視にする必要がある」 「Releaseビルドする必要がある」 あたりでつまずいてるのではないでしょうか? その際は、こちらをご覧ください。
はじめに
- 汎用性の高い機能を切り出したい
- Frameworkとして配布したいけど、実装部分は見られたくない
調べてみてアレコレ
deployment target がiOS8未満の場合 →「Cocoa Touch Static Library」を使って自作でFrameworkを作成する
XCODE6では、公式に「Cocoa Touch Framework」というテンプレが用意され、 簡単にFrameworkを作成できるようです。
「Cocoa Touch Framework」での作成については、 第58回 Cocoa勉強会関西でXcode6のFramework Templateについて話した が大変参考になります。
しかし、deployment target がiOS8以上でないと使えないらしいとのご意見がありました。 https://twitter.com/climbappdev/status/502224614836039680
実際に私も公式テンプレの方法でチャレンジしたところ、手元のデバッグ用iPhoneがiOS7.1だったために使えませんでした。Framework自体は作成できますが、作成したFrameworkを使ったプロジェクトのアプリをデバッグ用iPhoneで起動できません。build suceeded のあとにデバック画面になり、以下のエラーが発生してしまいます。
dyld_sim`dyld_fatal_error:
このエラーは、例えばiOS8以降にしか対応していないframeworkなどを使用して iOS8より前のバージョンをターゲットにしていることで起きることがあるようです。 要はバージョン適応外のときにでるみたい。(下記 参考記事)
http://stackoverflow.com/questions/10325529/which-is-the-cause-for-dylddyld-fatal-error-a-incompatible-api-on-ios http://omegapoint.cocolog-nifty.com/blog/2012/09/xcode-441---iph.html
iOS8以上でないと使えないとのご意見があることから私のエラーはまさにこれかと思われます。 今回、作成するFrameworkは、私的な都合でiOS8以前でも使用したかったことから 手元のiPhoneをiOS8へバージョンアップという選択肢は却下しました。
というわけで、公式テンプレを使わずに、「Cocoa Touch Static Library」で あれこれ面倒な設定をしてFrameworkを作成する方法を採用しました。 もし、deployment target がiOS8以上でも問題ないという方は、公式テンプレを使うと良いと思います。 もし、公式テンプレでもiOS8以前で動く方法がありましたら教えてくださいm(_ _)m
「Cocoa Touch Static Library」を使って自作でFrameworkを作成しよう
ここまでが前置きでした。長くてすみません。「Cocoa Touch Static Library」を使った方法は、こちらを参考にさせていただきました。 [iPhoneアプリ開発]自作Frameworkをつくる
XCODE4.6向けに作成された記事ですが、XCODE6でも問題なくFrameworkを作成できました。 それに必要な手順が漏れなく記載されている(←ここ大事です)記事であると思いました。
私は、上記ページの第1回〜第4回を参考にしました。 参考にした中で、私が思う(ハマったw )各回のポイントや補足を以下に記載しますので、 私のこの記事を参考にされている方は、上記ページと私のポイントを参考にしてください。
ここで作成する「Headers」「Classes」にFramework化したい機能の ***.h ***.m をFinder上でコピーします。 次にXCODE上の「Headers」「Classes」グループで二本指タッチしてAdd File to ***を選択して***.h ***.m を追加します。 作成する Info.plist を編集します。 上記サイトでは、CFBundleNameなどに例として「LWPdfKit」を設定しています。 この「LWPdfKit」を作成するFramework名に修正します。 CFBundleIdentifierやCopyrightも自身のものに修正しましょう。 すでにインストールされている方は不要です。 Command Line Toolsは、第4回で使用するスクリプトの動作に必要になるのかと思います。 ※私はすでにインストールしていたので本当にそうなのかわかりません サイトの説明でも注意書きがありますが、スクリプト上部にあるINFOPLIST=“info.plistのパス”
のパスを要確認です。 スクリプト?よくわからない、とりあえずそのままコピペだー! という方は、ここを見落としてスクリプトでエラーとなります。
さらにビルドする前にもうひとつポイントがあります。 以下のサイト様に記載があります。
iOSのFrameworkを簡単に作れるiOS-Universal-Framework
記事後半の「ヘッダーファイルを可視にする必要がある」「Releaseビルドする必要がある」の手順をご確認ください。
この手順忘れるとFrameworkを使用する側のビルドで
Apple Mach-O Linker Error "_OBJC_CLASS_$_**********", referenced from:
のようなビルドエラーに悩まされます。
ここまで進んだところで、ビルドします。 ビルドが成功すれば、プロジェクトフォルダ内に「framework」フォルダが作成され、 その中に ***.framework が作成されます。
作成したframeworkを使用する
Targetの設定で、General または、Build Phase の Link Binary With Libraries で 作成したframeworkを追加します。Frameworkの機能を使用したいファイルにて
#import <フレームワーク名/***.h>
のようにインポートするだけで使うことができます!
あとがき
参考元サイト様を行き来することになり、多少見づらい構成の記事となり ご迷惑おかけしたと思いますが、少しでも参考になればと思います。ちなみにさきほど紹介した iOSのFrameworkを簡単に作れるiOS-Universal-Framework に 簡単にframeworkを作成できるテンプレート(GitHubに公開されてる) がありますが、私の環境では動作しませんでした。 原因はテンプレが古いのか、私のミスなのかなーと思います。
以上です。