2016-01-19 11 views
11

私はSwiftにフレームワークを構築しました。フレームワークはCocoapodsを使用していますが、ポッドの1つはObjective Cで書かれています。Swift fat framework for Objective-C Cocoapod

カスタムスクリプトを使用して、フレームワークを太いフレームワークにして32/64ビットシステムをサポートします。 (これは、プロジェクトに別のターゲットで実行され、それはそれとは何かを持っている場合、私は思ったんだけど?)

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

if [ "true" == ${ALREADYINVOKED:-false} ] 
then 
echo "RECURSION: Detected, stopping" 
else 
export ALREADYINVOKED="true" 

// Step 1. Build Device and Simulator versions 
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 

//Step 2. Copy the framework structure (from iphoneos build) to the universal folder 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" 

// Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" 

// Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory 
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

// Step 5. Convenience step to copy the framework to the project's directory 
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" 

// Step 6. Convenience step to open the project's directory in Finder 
open "${PROJECT_DIR}" 

fi 

を、私はこの脂肪フレームワークを作成するときに、私が使用したいプロジェクトにそれを置きますそれはコンパイラ上で常にb/cに失敗し、プロジェクトは目的のCのココアポッドモジュールを見ることができません。

clang: error: linker command failed with exit code 1 (use -v to see invocation) 
ld: framework not found Pusher for architecture x86_64 

ビルドプラットフォームを変更しても、アーキテクチャには該当しません。

別のXcodeプロジェクト(すべてのiOSまたはOS X用)で使用できるフレームワークを作成できるソリューションはすばらしいでしょう。

答えて

0

明らかに、Simulatorの64ビットアーキテクチャが欠落しています。

ターゲットをXcodeからビルドする場合、選択したシミュレータの種類に応じて、生成されたライブラリには、選択した32ビットまたは64ビットバージョンのシミュレータのそれぞれi386またはx86_64が含まれます。

私はcliビルドがi386バージョンのみを生産していると思います。

あなたはスクリプトでのアーキテクチャを設定しようとすることができます。そして、あなたが64ビットシミュレータ(iPhone 5S +)を用いて手で構築しようとすることができる別の方法として

xcodebuild -target "${PROJECT_NAME}" ARCHS="i386 x86_64" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

、その後行方不明アーキテクチャを抽出し、 lipoコマンドを使用して最終ライブラリに挿入します。

+0

私はそれがONLY_ACTIVE_ARCH = NOの引数によって処理されたと考えています。それとは別に、Objective-Cのココアポッドがない場合でも動作します。 –

3

xcodebuild-targetで実行すると、CocoaPodを使用できません。 -targetを使用すると、Xcodeはアクティブなプロジェクトのみを考慮し、Xcodeでプロジェクトファイルを開いてビルドした場合と同様に、Podの依存関係を取得できません。

xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" ...を実行する必要があります.CocoaPodsがワークスペースを生成し、Xcodeがターゲット名を使用してスキームを生成したと仮定します。これを別のデバイスで実行している場合は、スキームが共有としてマークされていることを確認する必要もあります。

フレームワークを構築したら、とそれに依存するフレームワークを含める必要があります。使用するアプリケーションでを使用します。あなたのフレームワークでは、一般>埋め込みバイナリと一般>リンクされたフレームワークとライブラリにそれを含めることを意味します。あなたが依存しているフレームワーク(AlamoFireなど)では、ユーザにPodfileに組み込むように指示したり、パッケージ化してフレームワークとともに出荷したりすることができます。

+0

私は何か他に何が必要なのでしょうか?モジュールを見つけることができないというコンパイラエラーは出ませんが、何かを実行しようとすると次のようになります。〜/ Library/Developer/CoreSimulator/Devices/74636985-3538-4693-B131-983106003055/data/Containers/Bundle /アプリケーション/ FBC92D11-240D-45BB-9F21-C4372DE509B4/TestMyKit.app/TestMyKit 理由:画像が見つかりません (lldb) –

+0

これは完全なエラーですか?どの画像に読み込めないの?両方のライブラリに.frameworkがリンクされており、そのアプリケーションに埋め込むバイナリはありますか? –

+0

これは完全なエラーです:dyld:ライブラリがロードされていません:@ rpath/Alamofire.framework/Alamofire 〜/ Library/Developer/CoreSimulator/Devices/74636985-3538-4693-B131-983106003055/data/Containers/Bundle /Application/FFC6E8DA-4877-4142-A97B-73A3B7712319/TestMyKit.app/Frameworks/DICAPIKit.framework/DICAPIKit 理由:画像が見つかりません (lldb) - はいフレームワークはリンクされており、埋め込まれています。 –