図書館?静的?動的?またはフレームワーク?別のプロジェクト内のプロジェクト


151

既存のiOSアプリがあり、テストを簡単にするために、別のプロジェクトとして開発している大量のコードを追加したいと考えています。新しいチャンクは基本的に画像をさまざまな共有サービスなどに保存することを扱います。その共有コードは多くのテストと将来の更新を必要とするため、既存のアプリにそのコードチャンクを組み込むための最良の方法を考えていました。

それが静的ライブラリ、動的ライブラリ、フレームワークのどれであるかはわかりませんし、正直なところ、違いが何なのか、どうやってそれをXcodeで設定するべきかはよくわかりません。

私が知っているのは、共有コード用に個別のテストおよび更新アプリを保持し、メインアプリでそれを使用する必要がある/欲しいということだけです。


あなたは、「フレームワーク内部のフレームワーク」のようなものであるアンブレラフレームワークを作成することができますstackoverflow.com/a/27638841/1582217
モハイフテックハーQurashi

回答:


204

まず、いくつかの一般的な定義(iOSに固有):

静的ライブラリ -コンパイル時にリンクされるコードの単位。変更されません。

ただし、iOS静的ライブラリに画像/アセット(コードのみ)を含めることはできません。ただし、メディアバンドルを使用すると、この課題を回避できます。

より良い、より正式な定義は、ウィキペディアのこちらにあります

動的ライブラリ - 変更される可能性がある実行時にリンクされたコードおよび/またはアセットのユニット。

ただし、iOSのダイナミックライブラリを作成できるのはAppleのみです。アプリを拒否するため、これらを作成することはできません。(確認とそのような理由については、この別のSO投稿を参照してください)。

ソフトウェアフレームワーク -タスクを実行するコンパイルされたコードのセット...したがって、実際には静的フレームワークまたは動的フレームワークを使用できます。これらは通常、上記のコンパイルされたバージョンにすぎません。

詳細については、Wiki on Software Frameworkを参照してください。

したがって、iOSでは、基本的に唯一の選択肢は静的ライブラリまたは静的フレームワークを使用することです(主な違いは、静的フレームワークがコンパイル済み.aファイルとして最も頻繁に配布されるのに対し、静的ライブラリはサブプロジェクトとして単純に含まれる可能性があることです。すべてのコード-最初にコンパイルされ、その結果.aファイルがプロジェクトによって依存関係として使用されます)。

これらの条件が明確になったので、静的ライブラリの設定とiOSのサポートメディアバンドルの設定はそれほど難しくなく、その方法に関するチュートリアルは数多くあります。私は個人的にこれをお勧めします:

https://github.com/jverkoey/iOS-Framework

これはかなり簡単なガイドであり、「偽の静的ライブラリ」を扱うという欠点はありません...詳細については、こちらをチェックしてください...

静的ライブラリを作成したら、さまざまなプロジェクトで使用するために、Git内にサブモジュールとして含めるだけで簡単です。

幸運を。

編集

私の知る限り、プロジェクト内のサブプロジェクトに関して、これを正しく機能/コンパイルさせるには、基本的に、最初にサブプロジェクトがコンパイルされるコンパイルチェーンを設定する必要があります。これにより、静的フレームワークが作成されます。.a、依存関係として使用されるファイルがされます。プロジェクトによって。

これについて説明する別の便利なチュートリアルを次に示します。

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

編集2

iOS 8以降、Appleは開発者が動的なフレームワークを作成することを許可しています!(注:動的フレームワークを含めるには、アプリにiOS 8の最小ターゲットが必要です...バックポーティングは許可されていません。)

これは、新しいプロジェクトテンプレートとして追加されました。Xcode 6.1では、これは次の場所にあります。

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework

これまでのところ、サブプロジェクトは私が欲しいものであり、その記事は完璧でした。私は奇妙な副作用に気づきました:メインプロジェクト内にドラッグしたサブプロジェクトにもテストコード(viewcontrollerとnib、appdelegateなど)があり、私が使用したいクラスだけがメインプロジェクトは、静的ライブラリで使用するためにチェックされます。しかし、何らかの理由で、メインプロジェクトのnibファイルに添付ファイルを作成すると、サブプロジェクトのアウトレットとアクションも表示されました。これは間違いなくいくつかの混乱につながる可能性があります。それらを取り除くためのヒントはありますか?ありがとう!
ピザフィルム2013年

動的プロジェクトを静的プロジェクトにドラッグアンドドロップして、静的プロジェクトにすることはできますか?私は本当に混乱しています、いくつかの説明は本当に素晴らしいでしょう!前もって感謝します:-)
Ravindranath Akila 2013

1
:動的なフレームワークを移植JRG-開発バックは、あなたには、いくつかのルールに従うならば許される@ developer.apple.com/library/prerelease/ios/documentation/...
klefevre

より低い最小ターゲットを設定し、ライブラリをオプションにすることは可能ですか?
kukudas 2015年

1.静的ライブラリ、動的ライブラリ、フレームワークのよく知られた例を含めることができますか?2.そのようなことを行う必要がある場所の例を挙げられますか?3.ポッドとスタティックライブラリの違いは何ですか?
Honey

29

Mach-Oファイル形式(Mach Object- .o

iOSの世界では、すべてのソースファイルがオブジェクトファイルに変換されます-ABI [About] Mach-Oファイル[About]は、最終的な実行可能バンドル(例:アプリケーション、フレームワーク...)、ファイル(例:ライブラリ...)にパッケージ化されます。その動作は[About]によって決定されMach-O typeます

Packageそれ自体がファイルとして振る舞うディレクトリです- opaque file。これは、予期しないプログラムの動作を引き起こす可能性がある内部構造への変更を複雑にするユーザーエクスペリエンスのために作成されます。パッケージはで、Document Packageまたはとともに使用されBundleます。Show Package ContentsFinderで使用できます

Bundleバイナリ(実行可能コード)とそのコードのリソース(画像、nibsなど)を整理するための特定の構造を持つディレクトリです。バンドルにはInfo.plist[About]ファイルが含まれています。バンドルは、開発者向けに作成されました。パッケージ化も可能です。バンドルにはいくつかのタイプがあります。

  • application bundle - Application target
  • framework bundleそしてversioned bundleサブタイプとして-Framework Target
  • loadable bundle(別名plug-in bundle)- Bundle target(UIテストバンドル、ユニットテストバンドル)
  • その他(dSYM同梱について】同梱)

Application- .ipa.app[概要] - packaged application bundle-起動可能プログラム。

Tests- packaged loadable bundleバイナリのテストに使用されます。プラグインアーキテクチャにより、新しい機能(テストケース)を別個のモジュールとして既存のバイナリに追加できます。

ライブラリとフレームワーク

InversionOfControlに関するMartin Fowler

ライブラリは基本的に、呼び出すことができる関数のセットであり、最近では通常、クラスに編成されています。各呼び出しはいくつかの作業を行い、クライアントに制御を返します。

フレームワークはいくつかの抽象的なデザインを具体化し、より多くの動作が組み込まれています。それを使用するには、サブクラス化するか、独自のクラスをプラグインすることにより、フレームワークのさまざまな場所に動作を挿入する必要があります。フレームワークのコードは、これらのポイントでコードを呼び出します。プログラムのメインコントロールが逆になり、フレームワークに移動します。(制御の反転)

iOSのライブラリとフレームワーク

Library1つ以上のアーキテクチャ用にコンパイルされたMach-Oオブジェクトファイルのコレクションです[静的または動的をチェック]

Static library- .a(別名静的アーカイブライブラリ、静的にリンクされたライブラリの共有[ドキュメント]) -あなたがあなたのアプリケーションにそれを追加し、静的なリンカーを中にコンパイル時ライブラリからオブジェクトファイルをマージして1つの実行可能ファイルにアプリケーション・オブジェクト・ファイルと一緒にそれらをパッケージ化しますファイル。欠点は、出力ファイルが大きいことです。

Xcode 9.0以降、Swift静的ライブラリがサポートされています。

Dynamic library- .dylib(別名動的共有ライブラリ、共有オブジェクト、動的リンクライブラリ[doc])は、ロード時または実行時にアプリの実行可能ファイルに動的にリンクされますが、コピーされません。実際には、アプリのパッケージには、.dylibファイルを含むFrameworksフォルダーが含まれます。すべてのiOSおよびmacOS システムライブラリはdynamicです。すべての動的ライブラリをコピーしてリンクする必要があるため、短所は起動時間が遅いことです。

[静的リンクと動的リンク]

Text-based stub library- .tbd[概要]dynamic libraryは、ターゲットデバイスにあるテキストスタブです。その結果、動的ライブラリをバンドルにパッケージ化しないでください。サイズ効果があります。

Framework別名binary framework- .frameworkは、not packaged framework bundle(開発者がヘッダーとリソースを簡単に確認できるようにするための)で、コンパイルされたstatic or dynamicライブラリ、ヘッダーファイル、リソースが含まれています。

Static frameworkstatic libraryリソースとともにパッケージ化されたものが含まれています。

Dynamic frameworkdynamic libraryおよびリソースが含まれています。それに加えて、動的フレームワークには、同じ動的ライブラリの異なるバージョンを1つのバンドルに含めることができます(versioned bundle

[静的vs動的フレームワーク]

Embedded frameworkあるdynamic frameworkアプリのサンドボックスに住んでいます。このタイプはまず、共通のコードとリソースを共有するための拡張用に作成されました。展開ターゲットがiOS 8以降の場合に使用できます。

Umbrella framework [集計対象]は、他のフレームワークを含むフレームワークです。iOSでは正式にサポートされていないため、開発者が作成することはお勧めません[公式ドキュメント]。実際には、サブフレームワーク(またはネストされたフレームワーク)のセットです。依存関係のあるフレームワークを作成すると、コンシューマー(アプリなど)がこの依存関係をフレームワークと共にプロジェクトに追加する必要があります。開発者として、この義務を消費者からあなたの義務に移す方法を見つけるのは自然なことです。その結果、あなたはそれUmbrella frameworkが救いだと思っていますが、通常、バージョンの管理とそれを作成してサポートする複雑さの深刻な問題につながります。

Fake Framework-は、として動作する拡張機能static library付きのバンドルを作成するためのでの特定の操作の結果です。このテクニックは、フレームワークテンプレートがないためにXcodeがフレームワークの作成をサポートしていないときに使用されました。架空のフレームワークの実現の一つ。Xcode 6では、AppleはiOSフレームワークのサポートを追加しました。.frameworkdynamic framework

Modular Framework[概要] -@importそれが含まれているフレームワークであり.modulemap、ファイル内部を。モジュールにはサブモジュールを含めることができます。主な利点は、を使用してビルド時間を節約できることですModular Framework

Universal Library or Framework(別名Fat)[lipo] [Aggregate target]には複数のアーキテクチャが含まれています。たとえば、リリースビルドは、[ONLY_ACTIVE_ARCH]を介して規制できるいくつかのアーチをサポートする必要がありますBuild Active Architecture Only

Dependency[概要]サードパーティのコードをターゲットの一部として使用できます。別のプロジェクト、同じワークスペース内のプロジェクト、別のターゲット、ライブラリ、フレームワークなど、多くのソースからのコードを再利用できます。

静的ライブラリを構築して使用する方法:

動的フレームワークを構築して使用する方法[静的に変更]

[Xcodeビルドシステム]
[Xcodeコンポーネント]
[ダイナミックリンカー]


1
多くのSwiftチュートリアルで、Objective Cは動的ライブラリをサポートしていないと言及されていますが、swiftは[ altexsoft.com/blog/engineering/… ]をサポートしていますが、i、OS8以降はObjctive Cが動的ライブラリをサポートしています。あなたはこれを明確にすることができますか?
プラティマ

@ pratima、Objective-C for iOSで動的フレームワークを作成できます
yoAlex5

1
「静的フレームワークには、そのリソースとともにパッケージ化された静的ライブラリが含まれています。」この定義はどこから来たのですか?AFAK、静的フレームワークの「バンドルリソースのコピー」ビルドフェーズは、静的ライブラリと同様に機能しません。静的フレームワークと静的ライブラリの違いは何ですか?
toshi0383

@ toshi0383静的ライブラリ(.a)とそのリソース(.bundle)を、コンシューマに配布できる単一のフレームワークにマージする方法を見つけましたか?
user121095

2

CocoaPodsの.podspecファイル(http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo)を作成して、他のポッドと同じように使用することもできます。唯一の違いは、それがプライベートポッドであり、外の世界からは見えないことです(ポッドがCoreDataモデルを作成する場合に何が起こるかわかりませんが、そうではありません)。

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