2016-03-02 74 views
2

我有一個包含2個項目的工作區:一個是Cocoa touch框架,另一個是使用框架的應用程序。我在嵌入式二進制文件部分添加了該框架。當我運行應用程序時,它編譯框架和應用程序,事情都很好。但是,我需要該框架來編譯所有架構,而不僅僅是它目前正在構建的架構。我已經搜索了這個,最常見的解決方案是添加一個運行腳本來啓用此功能。但是,我遇到的每個腳本都是彼此不同的,所以我很困惑這種情況的理想腳本是什麼?另外,爲此目的創建一個胖二進制文件是一個好主意嗎?創建通用iOS框架

我使用下面的腳本的那一刻,我已經加入到框架的構建階段(採取從http:// www.insert.io/frameworkios8xcode6/):

set -e 
set +u 
# Avoid recursively calling this script. 
if [[ $SF_MASTER_SCRIPT_RUNNING ]] 
then 
exit 0 
fi 
set -u 
export SF_MASTER_SCRIPT_RUNNING=1 


# Constants 
SF_TARGET_NAME=${PROJECT_NAME} 
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

# Take build target 
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]] 
then 
SF_SDK_PLATFORM=${BASH_REMATCH[1]} 
else 
echo "Could not find platform name from SDK_NAME: $SDK_NAME" 
exit 1 
fi 

if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]] 
then 
echo "Please choose iPhone simulator as the build target." 
exit 1 
fi 

IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos 

# Build the other (non-simulator) platform 
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION 

xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION 

# Copy the framework structure to the universal folder (clean it first) 
rm -rf "${UNIVERSAL_OUTPUTFOLDER}" 
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" 

# Smash them together to combine all architectures 
lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

這個腳本要求的框架內建立爲iOS模擬器。在我的工作區的Products文件夾中構建.framework後,顯示該框架位於iphoneos文件夾而不是Universal文件夾中。我應該將通用文件夾中的.framework拖放到workspace中的Products部分嗎?

回答

0

我不知道在同一個工作區中有框架項目和應用程序項目,但你可以看到我的回答here我是如何做到這一點的。我不必將該框架放入嵌入式二進制文件中。我只需要加入鏈接框架和庫。我只是建立了一個構建腳本,當我爲通用iOS設備構建時,它構建了一個Fat Framework到我的桌面。然後我可以運行-lipo info命令來確認這實際上是一個胖框架。從那裏我把框架放入我的應用程序的鏈接框架和庫中。

0

什麼,它的工作對我來說是下面的完整的教程:

https://github.com/jverkoey/iOS-Framework

在那裏,你可以看到benefits使用可可觸摸靜態庫基於框架在靜態的iOS框架的。這真的是一個公開的討論,但我只是在生產環境中告訴你我的積極體驗。

你必須關心的重要命令是lipo之一。這是一個將粉碎二進制文件變成胖文件的人。使用該命令,您可以輕鬆檢查結果是否包含您需要的架構。如果沒有,請首先檢查this,然後確保您按照上面的指南進行操作。

一旦創建了靜態庫,你可以運行下面的命令來檢查體系結構:

lipo -info YourLibrary.framework/YourLibrary 

該解決方案還允許包括框架作爲從屬目標到項目使您框架開發變得更加容易。爲此,請查閱指南的this chapter