Bundle
概要
Bundle とは?
Bundle とは、広義には一定のルールに従ったディレクトリ構造、あるいはそれにアクセスするための API のこと。特に、iOS/macOS 上でソフトウェア及びそのリソースを持ち運ぶために利用される。そのため、Bundle は実行可能なアプリケーションそのものであったり、他のアプリケーションから利用される Library であったりする。 特別な拡張子を持っているかどうか
.app, .bundle, .framework, .plugin, .kext, ...
他のアプリケーションによって「パッケージである」と定義された拡張を持っているかどうか
package bit フラグが立っているかどうか
Bundle の種類
拡張子は .framework
他の Bundle と異なり、Finder 上では通常閲覧できない Bundle へのアクセス
アクセスの目的
必要なリソースのロード/配置のために Bundle オブジェクトのメソッドを利用する リソースとやり取りするために他のシステム API を利用する
現在実行中のコードを保持する Bundle アプリケーションコードを含んだ Bundle を表現するのは Bundle.main。アプリケーションの場合であれば、デプロイされたアプリケーションのリソースにこれ経由でアクセスできる。注意点として、Unit test 内などから Bundle.main を参照しても、Unit test bundle ではなくテスト対象の application bundle が参照されてしまう点 がある。 code:swift
let mainBundle = Bundle.main
アプリケーションが、自身とは別の Plug-Ins, Framework や他のバンドル化されたコンテンツにアクセスしたい場合がある。これを実現するためのコンストラクタがいくつか用意されている。 init(for:)
init(idenifier:)
読み出す対象の Bundle がすでにメモリ上に読み出されている、キャッシュされている場合には init(for:) よりも効率が良いが、そうでなければ効率が悪いため、init(path:)やinit(url:)を利用するのが良い init(url:)
init(path:)
絶対パスで指定された場所にある Bundle ディレクトリからインスタンスを生成する code:swift
// 特定のクラスを含んだ Bundle を取得する
let myBundle = Bundle(for: NSClassFromString("MyPrivateClass")!)
// 自身が所属する Bundle を取得する
let bundle = Bundle(for: type(of: self))
参考