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


115

iOS 8のリリースでは、iOSの動的フレームワークと静的フレームワークについて少し混乱しています。

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

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

そして、これはこの情報に関する私の質問です:

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

1
「iOS 7はダイナミックリンクをサポートしていないため、.frameworkライブラリをサポートしていません」このステートメントは正しくありません。
Midhun MP、2015年

1
そうですか。正しい文章を教えてもらえますか?iOS 7が動的リンクをサポートしているため、またはiOS 7が.frameworkライブラリをサポートしているため、それは誤りですか?または両方?
csotiriou 2015年

1
Remeber AVFoundationとCoreGraphicsはすべて.frameworkです。おそらくこれは、すべての質問に対する答えを見つけるのに役立ちます:raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

文章を直した。質問を投稿する前に、リンクを既に読みました。このリンクは私の質問については何も説明していません。静的ライブラリから開始し、それを.frameworkファイルに手動でラップします。Xcode 6のCocoa Touch Frameworkターゲットについて話し、タイプを静的ライブラリに変更します。コード
サイニング

1
CocoaPodsを使用して、独自のフレームワーク(Parseなど)を配布できます
Ric Santos

回答:


69

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

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

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

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

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

迅速に使用する場合は、動的フレームワークを使用する必要があります。理論的には、動的フレームワークはiOS7で動作します。ただし、アプリがiOS7を対象としていて動的フレームワークを使用している場合は、iTunes Connectが拒否すると思います:-)。

お役に立てれば


16

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


素晴らしいヒント。この回答が役に立ったので、なぜこの回答が減点されたのかわからない。\ Target'Build Settings \ Mach-O-Typeをクリックし、静的フレームワークを選択します。
rustyMagnet 2017

3
Abi互換性は
Swift

7

staticまたはdynamic名前で通常はLinking[About]タイプを指します

フレームワークはstaticdynamic[静的または動的をチェック]または

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

この設定に応じて、さまざまなタイプのバイナリが生成されます

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

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

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

[単語]


6

Swiftは静的libでは機能しません。動的フレームワークを使用する必要がある場合 AppStore が動的フレームワークで iOS 7を拒否するため、最小iOSを8.0に設定する必要があります。


静的ライブラリを
Swift

5

私はすべての答えを持っているわけではありませんが、ここであなたの質問のいくつかに対処しようとします。

  • iOS 7でこれらのフレームワークを使用すると警告が表示されますが、それだけです。この回答を参照してください。

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

  • iOS用の動的ライブラリをコード署名する必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.