1. ホーム
  2. ios

[解決済み] ファットなCocoa Touchフレームワーク(シミュレータとデバイス用)をエクスポートする方法とは?

2022-11-25 14:04:24

質問

とは Xcode 6 では、独自のダイナミックな Cocoa Frameworks .

<イグ

なぜなら

  • シミュレータはまだ 32-bit ライブラリ

  • 2015 年 6 月 1 日以降、App Store に提出されるアプリのアップデートは、64 ビット サポートを含み、iOS 8 SDK でビルドされなければなりません ( デベロッパー.apple.com )

デバイスやシミュレータ上でプロジェクトを実行するために、ファットライブラリを作成する必要があります。

しかし、私はどのようなマニュアルも見つけられませんでした。 エクスポート ユニバーサルファットフレームワークを他のプロジェクトと統合する(そして、このライブラリを誰かと共有する)ために。

以下は再現のための手順です。

  1. 設定 ONLY_ACTIVE_ARCH=NO の中に Build Settings

    <イグ

  2. サポートの追加 armv7 armv7s arm64 i386 x86_64Architectures (確かに)

  1. Frameworkをビルドし、Finderで開く。

  1. このフレームワークを別のプロジェクトに追加する

実際の結果です。

しかし、結局のところ、このフレームワークを使ったプロジェクトをデバイスとシミュレータで同時に実行することにはまだ問題があります。

  • からフレームワークを取ると Debug-iphoneos フォルダにあるフレームワークを使用すると、デバイス上では動作しますが で動作し、シミュレータではエラーになります。 ld: symbol(s) not found for architecture i386

      xcrun lipo -info CoreActionSheetPicker
    
    

    ファットファイルのアーキテクチャ CoreActionSheetPickerは: armv7 armv7s arm64です。

  • からフレームワークを取ると Debug-iphonesimulator フォルダからフレームワークを取り出した場合、シミュレータでは動作しますが、デバイスではエラーが発生します。 ld: symbol(s) not found for architecture arm64

      xcrun lipo -info CoreActionSheetPicker
    
    

    ファットファイルのアーキテクチャ CoreActionSheetPicker は次のとおりです: i386 x86_64

では、デバイスやシミュレータ上で動作する動的なフレームワークを作るにはどうすればよいのでしょうか。

この回答は Xcode 6 iOS Cocoa Touchのフレームワークを作成する - アーキテクチャの問題 とありますが、重複していません。


更新しました。

このケースに対するダーティハックを見つけました。私の の回答を参照してください。 . もし、もっと便利な方法を知っている人がいたら、ぜひ教えてください。

どのように解決するのですか?

この回答の実態は 2015年7月に 変更になる可能性が高いです。

TLDRです。

現在、Xcodeにはユニバーサルファットフレームワークを自動的にエクスポートするツールがないため、開発者は手動で lipo ツールを使用する必要があります。また このレーダー を AppStore に提出する前に、フレームワークの消費者であるデベロッパーも lipo を使ってフレームワークからシミュレータスライスを削除する必要があります。

長い回答が続きます


トピック(回答下部のリンク)でも同様の調査をしました。

の配布に関する公式のドキュメントを見つけられなかったので、私の研究は、Apple Developer Forums、Carthage、Realm プロジェクトの調査、および私自身の実験に基づいていました。 xcodebuild , lipo , codesign のツールを使用します。

Apple Developer Forums のスレッドからの長い引用です (私が少しマークアップしています)。 フレームワークを組み込んだアプリをエクスポートする :

フレームワークプロジェクトからフレームワークをエクスポートする適切な方法は何ですか?

現在、唯一の方法は、あなたが行ったこととまったく同じです。

  • シミュレータと iOS デバイスの両方に対してターゲットをビルドします。
  • そのプロジェクトの Xcode の DerivedData フォルダに移動し、2つのバイナリを1つのフレームワークにまとめてリポします。しかし、Xcode でフレームワーク ターゲットを構築するとき、ターゲット設定 'Build Active Architecture Only' を 'NO' に調整することを確認してください。これにより、Xcodeは複数のバイナリタイプ(arm64、armv7など)用にターゲットをビルドすることができます。 これは、Xcode からは動作するが、スタンドアロン バイナリとしては動作しない理由となります。

  • また、スキームがリリースビルドに設定されていることを確認し、フレームワークターゲットをリリースに対してビルドしたいと思うことでしょう。 それでもライブラリがロードされないというエラーが発生する場合は、フレームワークのコードスライスを確認してください。

  • 使用方法 lipo -info MyFramworkBinary を使って、その結果を調べてみてください。

lipo -info MyFrameworkBinary

結果は i386 x86_64 armv7 arm64

  • 最近のユニバーサル フレームワークは 4 つのスライスを含みますが、もっと多く含むことも可能です。 i386 x86_64 armv7 arm64 少なくともこの 4 つが表示されない場合は、Build Active Architecture の設定に起因している可能性があります。

これは、@skywinder が彼の回答で行ったのとほぼ同じプロセスを記述しています。

これは カルタゴはリポを使う レームがリポを使用 .


重要事項

レーダーがあります。 Xcode 6.1.1 & 6.2: シミュレータスライスを含む iOS フレームワークは App Store に提出できない。 で、この件に関する長い議論が Realm#1163 カルタゴ#188 で、特別な回避策で終了しました。

AppStore に提出する前に、iOS フレームワークのバイナリをシミュレータのスライスから削除する必要があります。

iOS

Carthage は特別なコードを持っています。 コピーフレームワークス という特別なコードがあり、それに対応した文書があります。

このスクリプトは App Store への投稿に関するバグ を回避します。

レルムは特殊なスクリプトを持っています。 strip-frameworks.sh という特別なスクリプトがあり、それに対応したドキュメントがあります。

このステップは App Store への投稿に関するバグ を回避するために必要です。

また、良い記事もあります。 Xcode のダイナミック ライブラリから不要なアーキテクチャを削除する .

私自身は、Realmの strip-frameworks.sh を使いました。もちろん、誰でも自由にゼロから書くことができますが、私には何の修正もなく完璧に機能しました。


私のトピックへのリンクは、この質問に関する別の側面を含んでいるので、読むことをお勧めします。 iOS/OSX フレームワークの作成: 他の開発者に配布する前にコード化する必要がありますか?