web-dev-qa-db-ja.com

iOSとOS X間で単一の共有フレームワークを作成する方法

IOSとOS Xで実行されるアプリの共通エンティティクラスを保持するフレームワークを作成しようとしています。現在、各ターゲットにファイルを含めるだけですが、現在のターゲットからクラスを取得するようにデータモデルを変更する必要があります(Swiftであるため、モデルファイルでクラスを持つモジュールを指定する必要があります。)これは、もちろん忘れてしまい、機能しないことを意味します。

明白な解決策は、エンティティモデルを保持する共有フレームワークを作成して、データモデルが常に同じ場所を指すようにすることです。

問題は、両方のプラットフォームで構築するフレームワークを作成する方法がないように見えることです。

両方のプラットフォームで機能する単一のフレームワークまたはライブラリを作成する方法を見つけた人はいますか?

39
theMikeSwan

単一の動的フレームワークバイナリを作成する場合は、次の手順に従ってください( で概説されています)。http://colemancda.github.io/2015/02/11/universal-ios -osx-framework ):

1.プロジェクトの有効なアーキテクチャとサポートされているプラ​​ットフォームを変更します。

これにより、フレームワークとテストユニットの有効なアーキテクチャとサポートされるプラットフォームも変更されます。そうでない場合は、プロジェクトのビルド設定から継承するように手動で変更します。

Step One

  • ベースSDK:OS Xをお勧めしますが、iOSでも動作します。 iOSをベースSDKとする場合、「My Mac」ターゲットは3つの異なるターゲットに分離されることに注意してください。

  • サポートされているプラ​​ットフォーム:_macosx iphoneos iphonesimulator_

  • 有効なアーキテクチャ:_arm64 armv7 armv7s i386 x86_64_

2.単体テストバンドルの検索パスを変更する

Step Two

  • ランパス検索パス:$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks

  • フレームワーク検索パス:$(SDKROOT) $(inherited)

2つの個別のターゲットを持つよりも優れたソリューションです。

54
ColemanCDA

答えは非常に単純ですが、それほど明白ではありません。少なくとも、この質問を投稿して別の作業を行った後はそうです。

実行する必要があるのは、各プラットフォームのフレームワークターゲットを作成することですが、製品名を同じに設定します。これはSwiftのモジュール名でもあるので、Core Dataモデルのclassフィールドを1つの値に設定して、両方のプラットフォームで機能させることができます。

私が使用している設定は、両方のフレームワークにモデルファイルを含めることですが、モデル自体を各アプリターゲットに直接含めることです。

また、両方のアプリを同じ製品名に設定してすべてを機能させることもできるはずですが、私はそれをテストしていません。フレームワークでは、必要に応じてMyAppMyAppMobileを使用できます。

8
theMikeSwan