web-dev-qa-db-ja.com

iOSの静的フレームワークと動的フレームワークの説明

IOS 8のリリースでは、iOSの動的および静的フレームワークについて少し混乱していることを認めざるを得ません。

作成したライブラリを配布する方法を探していますが、iOS 7以降をサポートする必要があります。 (注:これは独自のフレームワークになります。ココアポッドは使用できず、ソースも配布できません)。私がすでに知っていることは次のとおりです。

  • iOS 8はiOS用の「組み込みフレームワーク」を導入しましたが、私が理解しているように、iOS 7以上では動作しません。
  • ライブラリを静的ライブラリ(.aファイル)として配布し、ヘッダーも配布するオプションがあります。私はこれが状況に対処する一般的な方法であることを知っていますが、それよりも簡単なものを見つけたいと思います(そして可能であれば、それにいくつかのリソースをバンドルします)。
  • また、iOS 7は動的リンクをサポートしていないため、動的.frameworkライブラリ(静的のみ)をサポートしていないこともわかりました。しかし、iOS 8は静的リンクと同様にサポートしています。

そして、この情報に関する私の質問は次のとおりです。

  • Mach-Oタイプを「静的ライブラリ」に変更することで、.frameworkターゲットを作成し、静的にすることができることがわかりました。問題なくiOS 7をサポートし、ライブラリを.framework bundle?もしそうなら、なぜiOS 8の「組み込みフレームワーク」は、インターネット上の多くのリソースが示唆しているように、それほど大きな取引なのでしょうか?
  • 作成する他のアプリケーションと同じように、.frameworkにコード署名する必要がありますか?
  • .frameworkファイルに他のリソース(Core DataやImagesなど)を含める必要がある場合はどうなりますか?そのために別の.bundleファイルを作成する必要がありますか?
106
csotiriou

IOS8より前のXcodeでは、iOS用の静的ライブラリを作成するオプションのみが許可されていました。それに関する一般的な問題は、バイナリとヘッダーを別々に出荷する必要があったことです。

その後、一部の開発者は「静的フレームワーク」を作成するというアイデアを思いつきました。 [.frameworkは、libおよびヘッダーへのシンボリックリンクを持つ単なるフォルダーです]。そのような例の1つは https://github.com/jverkoey/iOS-Framework

このオプションは、iOS 7またはiOS 8以前で機能します。なぜなら、それらはヘッダーファイルをバンドルする便利さを備えた単なる静的ライブラリだからです。

リソースに関する質問については、「。bundle」にバンドルする必要があります。それらを出荷するために、.frameworkフォルダーにそれらを含めることができるかどうかはわかりません。静的フレームワークとバンドル...

ただし、Swiftを使用している場合、上記のオプションは機能しません。 Xcodeは、Swiftコードを含む静的ライブラリの構築をサポートしていません。

Swiftを使用する場合は、ダイナミックフレームワークを使用する必要があります。理論的には、動的フレームワークはiOS7で機能します。しかし、アプリがiOS7を対象としており、動的フレームワークを使用している場合、iTunes Connectは拒否すると思います:-)。

お役に立てれば

66
Subbu

Xcode 9以降では、Swiftの静的フレームワークも作成できます。これは、ABIソースの互換性により可能です。フレームワークターゲットのビルド設定でMach-O typeを変更するだけです。この手法は、ハイブリッドフレームワーク(SwiftおよびObjective-Cコードを使用したフレームワーク)にも適用できます。

15
Avijeet Dutta

Swiftは静的ライブラリでは機能しません。ダイナミックフレームワークを使用する必要がある場合は、最小iOSを8.0に設定する必要がありますbecause AppStore reject ios 7 with dynamic framework

6
AliasCocoa

すべての答えはありませんが、ここでいくつかの質問に答えようとします。

  • IOS 7でこれらのフレームワークを使用すると警告が表示されますが、それだけです。こちらをご覧ください answer

  • CoreDataのような他のリソースを含めることができますが、コードで手動で作成する必要があります。 チュートリアル は、コアデータモデルの作成方法を示しています。

  • IOS用の動的ライブラリのコード署名が必要です。

  • フレームワークを配布する予定がある場合は、フレームワークがシミュレータとデバイスの両方のアーキテクチャをサポートしていることを確認する必要があります。

5
Beau Nouvelle

フレームワークはstaticまたはdynamiclibrariesがいくつかの追加アセット、バージョン管理のためのメタ記述などのバンドルにパックされています。

Framework target -> Build Settings -> Mach-O Typeを変更することにより、Linkerに影響を与えるライブラリの形式を変更できます。[約] to Static LibraryまたはDynamic Library。デフォルトでは、XcodeにはDynamic Library値があります。

この設定に応じて、異なるタイプのバイナリが生成されます [静的または動的を確認]

コンシューマを正常に構成した後 [リンクと埋め込み]

Static Linker: ld atcompile時は、static libraryのすべてのコードを実行可能オブジェクトファイルに含めます。

Dynamic Linker: dyldは、ロード/実行時に@rpathを使用して埋め込みフレームワークを見つけようとします[約] とリンク

0
yoAlex5