2016-10-06 109 views
4

我公司的iOS框架是爲了在真正的iOS設備上工作。所述框架目前作爲Xcode項目中的附加目標生成,其也生成應用程序。 (這使得調試框架相對容易)。使用Xcode 8創建通用框架?

我們最近也得到了一些要求,以使它在模擬器中也能正常工作。我現在可以做到這一點,下一步就是創建一個可以在真實設備和模擬器上工作的編譯版本。可悲的是,我一直無法找到任何材料,指出任何人都使用Xcode 8來做這件事。有些材料解釋瞭如何使用舊版本的Xcode,但是在一個Xcode版本中起作用的東西可能不起作用,或者在稍後版。 (我們已經有了一種創建通用框架的方法。)我嘗試使用一些預編譯的Xcode 8腳本,但沒有一個能夠工作。

有沒有人設法爲使用Xcode 8的iOS生成通用框架?如果是這樣,該怎麼辦?

在此先感謝任何人可以提供的幫助。

亞倫阿德爾曼

+0

這是一個完整的指南,我寫在這個問題上:https://eladnava.com/publish-a-universal-binary-ios-framework-in-swift-using-cocoapods/ –

回答

11

這是可能的,因爲我目前正在開發的Xcode 8

我這樣做,是建立一個總目標(跨平臺)的方式在iOS上,watchOS通用框架和tvOS並添加在構建階段運行腳本。該腳本基本上編譯爲iphonesimulator iOS的目標和的iPhoneOS

此之後,它會創建一個新的二進制合併兩者(脂 - 創建 - 輸出)

你介意發佈您的當前構建腳本生成一個通用框架所以我可以指導你做錯了什麼?

考慮到腳本在這裏不是你的問題,你的問題可能是設置你的有效體系結構,你的體系結構,甚至你如何簽署目標。我現在推薦在未選中目標的常規設置中保留「自動管理簽名」選項,並手動設置配置配置文件和證書。

運行腳本:在考慮

#!/bin/sh 

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

# make sure the output directory exists 
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}/iOS" 

# Step 1. Build Device and Simulator versions on iOS 
xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' clean build 
xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphoneos 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}/iOS" 

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

# Step 4. Convenience step to copy the framework to the project's directory 
mkdir -p "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS" 

cp -R "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework" "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS" 


# Step 6. Create .tar.gz file for posting on the binary repository 
cd "${TMPDIR}" 

# We nest the framework inside a Frameworks folder so that it unarchives correctly 
tar -zcf "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_NAME}/Frameworks/" 
mv "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_DIR}/" 

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

採取我生成有源體系僅設置爲NO的生成設置,也有效的架構設置爲arm64,x86_64的,I386,ARMv7的,armv7s。架構是$ {ARCHS_STANDARD} armv7s。

我還設置了一個用戶定義的構建設置BITCODE_GENERATION_MODE位碼。有了這個構建設置,我確保生成啓用了位代碼的二進制文件。

+0

我沒有當前的構建腳本,因爲沒有人嘗試過在Xcode 8中工作。 –

+0

Wo你不介意與你分享你的嗎? –

+0

讓我知道它是否有效 – iOSAddicted

2

構建的iOS/tvOS通用/脂肪框架

https://github.com/unchartedworks/universalbuild

用法:

universalbuild(-p | --project名。xcodeproj)(-s | --scheme schemename)(-c | --configuration configurationname)

例子:

git clone https://github.com/cruisediary/Pastel.git 
cd Pastel 
universalbuild -p ./Pastel.xcodeproj -s Pastel -c Debug 
+0

看起來很有意思,但是除非它和工作空間一起工作,否則我不能給你一個+1( –

+0

)。不幸的是,它不能像那樣工作。我在實現它之前做了一些研究,很多框架項目使用項目而不是工作空間。這就是爲什麼它只支持Xcode項目。 – UnchartedWorks

1

運行腳本來創建通用框架(沒有遞歸問題)

#!/bin/sh 

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

# make sure the output directory exists 
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" 

# Next, work out if we're in SIM or DEVICE 
if [ "false" == ${ALREADYINVOKED:-false} ] 
then 

export ALREADYINVOKED="true" 

if [ ${PLATFORM_NAME} = "iphonesimulator" ] 
then 
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
else 
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
fi 

# 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 (if it exists) to the copied framework directory 
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." 
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then 
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" 
fi 

# 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