Skip to content

Xcode6 で Framework を作成する[iPhone]

  • tips

📅 December 03, 2014

⏱️6 min read

本記事は参考元サイト様を敬愛し、参考元サイト様を参照していただくことをベースに作成しています。
自身の備忘録である意味合いが強いため、説明不足な点や誤りがあるかもしれないこと、 文章のみの説明となりますこと、ご留意ください。


[追記 14/12/9] 本記事では、私が試したXcode6でのFramework作成方法を紹介していますが、以下のサイト様を参考にした方が問題なくFrameworkを作成できると思います。 むしろ私の記事を参考にすると、つまずく可能性大ですorz

MoonMt.Lab IT開発技術 調査報告書 - iOSアプリ開発においてFrameworkを自作する方法

もし、↑のサイト様でできない!って方は、恐らく 「ヘッダーファイルを可視にする必要がある」 「Releaseビルドする必要がある」 あたりでつまずいてるのではないでしょうか? その際は、こちらをご覧ください。


はじめに

  • 汎用性の高い機能を切り出したい
  • Frameworkとして配布したいけど、実装部分は見られたくない
なんてときにライブラリ化、Framework化したくなります。 今回はそのやり方に苦戦したので備忘録がてら記事にします。

調べてみてアレコレ

deployment target がiOS8以上の場合 → 公式テンプレ「Cocoa Touch Framework」でFramework作成をする

deployment target がiOS8未満の場合 →「Cocoa Touch Static Library」を使って自作でFrameworkを作成する

  XCODE5以前のFramework作成は、公式テンプレもなく 「Cocoa Touch Static Library」であれこれ面倒な設定をしないといけなかったようです。

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 )各回のポイントや補足を以下に記載しますので、 私のこの記事を参考にされている方は、上記ページと私のポイントを参考にしてください。

第1回 プロジェクトを作る

ここで作成する「Headers」「Classes」にFramework化したい機能の ***.h ***.m をFinder上でコピーします。 次にXCODE上の「Headers」「Classes」グループで二本指タッチしてAdd File to ***を選択して***.h ***.m を追加します。

第2回 Property Listを作る

作成する Info.plist を編集します。 上記サイトでは、CFBundleNameなどに例として「LWPdfKit」を設定しています。 この「LWPdfKit」を作成するFramework名に修正します。 CFBundleIdentifierやCopyrightも自身のものに修正しましょう。

第3回 Command Line Tools

すでにインストールされている方は不要です。 Command Line Toolsは、第4回で使用するスクリプトの動作に必要になるのかと思います。 ※私はすでにインストールしていたので本当にそうなのかわかりません

第4回 Targetを作る

サイトの説明でも注意書きがありますが、スクリプト上部にある
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に公開されてる) がありますが、私の環境では動作しませんでした。 原因はテンプレが古いのか、私のミスなのかなーと思います。  

以上です。  

← PrevNext →