2016-01-19 30 views
11

我在Swift中構建了一個框架。該框架使用Cocoapods,其中一個豆莢是用Objective C編寫的。Swift fat framework with 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 cocoa pod模塊。

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

顯然你錯過了模擬器的64位體系結構。

當您從Xcode構建目標時,取決於您選擇了哪種模擬器 - 生成的庫將分別包含選定的32位或64位版本模擬器的i386或x86_64。

我想,cli版本只生產i386版本。

你可以嘗試設置架構的腳本:

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

作爲替代方案,您可以嘗試使用64位模擬器(iPhone 5S +)手工打造,然後提取丟失的架構,然後使用lipo命令將其放入最終庫。

+0

我相信這是由ONLY_ACTIVE_ARCH = NO參數照顧的。除此之外,它也適用於沒有Objective-C可可豆莢的情況。 –

3

使用CocoaPods時,您不能運行xcodebuild-target。當您使用-target時,Xcode將只考慮活動項目,並且無法拉入Pod依賴項,類似於您只是在Xcode中打開項目文件並嘗試構建。

您應該運行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/Application/FBC92D11-240D-45BB-9F21-C4372DE509B4/TestMyKit.app/TestMyKit 原因是:image not found (lldb) –

+0

這是完全錯誤嗎?沒有關於它無法加載的圖像的信息?這兩個庫中列出的.framework鏈接和二進制文件以嵌入到該應用程序中? –

+0

這是完整的錯誤:dyld:Library not loaded:@ 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) - 是的框架既是鏈接的又是嵌入的。 –