jarinosuke blog

about software engineering, mostly about iOS

Framework Bundle について

framework ファイルってナニモノ?

iOS 開発をするうえで、プロジェクト作成時点で Foundation.framework や UIKit.framework などの

Apple から提供されている framework が既に追加されているかと思います。

普段あまり疑問に思わずこれらの framework を使わせてもらっていますが、

いざこれを作ろうと思うと、そもそも .framework ファイルとはナニモノで、

どうやって作れば良いのか分からなかったので、この記事を書きました。

上記で .framework ファイルと呼んでいたものは正式には Framework Bundle と言います。

指定されたディレクトリ階層にリソースファイルや Static Library やドキュメントなど、

色々なものをパッケージングしてカプセル化して提供しているディレクトリを Framework Bundle と呼ばれています。

Framework Bundle で提供するメリット

前回の記事でも紹介した Static Library で提供するよりも、

Framework Bundle の方が以下のようなメリットがあります。

  • インストールが手軽

Static Library はヘッダやライブラリなど複数ファイルを追加しないといけないですが、

Framework Bundle は、それ自身を追加するだけ済みます。

  • 様々なリソースが追加可能

画像やドキュメントなども追加できます。

  • 複数バージョンを含む事が可能

同じ Framework Bundle 内に、 複数のバージョンを持つ事ができるので

この Framework を使用するプロジェクトの古いプログラムに対しての下位互換を可能にします。

このように Framework Bundle は良い事ずくめです。

しかし Framework Bundle で提供する際のデメリットもあります。

Xcode には iOS 向けの Framework 用のプロジェクトテンプレートが存在しないので、

自身で Framework Bundle を生成しないといけない点です。

Mac には Cocoa Framework テンプレートがあるのですが、iOS にはありません。

しかし、その部分は実績のある OSS が代替してくれるので心配は不要です。

以下からは Framework Bundle の構造を読み解き、どのような方針でそれを作成すれば良いかをみていきます。

ではまず、Framework Bundle がどんなデータ構造を取っているのかを見てみましょう。

Framework Bundle のファイル構造

ファイル構造といってもそこまで難しい事は何もありません。

早速みてみましょう。

MyFramework.framework/
    MyFramework  -> Versions/Current/MyFramework
    Resources    -> Versions/Current/Resources
    Versions/
        A/
            MyFramework
            Resources/
                English.lproj/
                    InfoPlist.strings
                Info.plist
        B/
            MyFramework
            Resources/
                English.lproj/
                    InfoPlist.strings
                Info.plist
        Current  -> B 

階層毎に見ていきます。

MyFramework.framework 配下には実体のあるディレクトリは Versions のみです。

ではその Versions には何が入っているかというと、

Version 毎に分かれた A, B というディレクトリ、そして現在の Current を示すシンボリックリンクです。

この Current を通して、一番上の階層にあった MyFramework と Resources は参照している訳です。

これはほんの一例です。詳細は以下のリンクを読んでみてください。

Anatomy of Framework Bundles

Framework Bundle の作り方

では実際に Framework Bundle をどう作るのか、という一番大事なところに触れましょう。

自分でスクリプトを作成し、 Framework Bundle を生成する事も出来ますが、

以下の OSS を用いる事で簡単に出来ます。

iOS-Universal-Framework

上記の OSS を用いて、iOS 用のプロジェクトテンプレートを作成するだけです。

長くなってしまうので、 iOS-Universal-Framework

実際の使い方などは別の記事に回したいと思います。

参考

Framework Programming Guide

Xcode 4におけるiOS Frameworkの作成方法

Xcode Build Settings Reference

xcodebuild man page

iOS-Universal-Framework