现在Apple的cpu架构如下
- arm7: 在最老的支持iOS7的设备上使用
- arm7s: 在iPhone5和5C上使用
- arm64: 运行于iPhone5S的64位 ARM 处理器 上
- i386: 32位模拟器上使用
- x86_64: 64为模拟器上使用
判断一个Framework支持哪些架构
我们该怎么验证生成的Framework支持哪些平台呢,总不能一个个测试吧?当然不用.下面的命令是加上armv7s前后生成的framework的对比
Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework
Architectures in the fat file: ./MyFramework.framework/MyFramework are: i386 x86_64 armv7 arm64
Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework
Architectures in the fat file: ./MyFramework.framework/MyFramework are: armv7 armv7s i386 x86_64 arm64
1. 关于cocoa framework的制作
网络上介绍基本正确,但是制作的过程中,需要注意两点,1.1 通用性 1.2适用是需要的配置
1.1 自定义动态framework - cocoaframework,需要的脚本,下列脚本基本能编译出模拟器和真机都适用的framework。
权做以记录,需要用的同学,需要根据脚本自己修改。本脚本用来打包framework用的
1.2 由于制作的是动态framework,所以在引用的时候需要注意下列3各配置
1.2.1 是否在引用项目project信息配置中,将该framework添加"linked Framework and Libraries"中
1.2.2 是否将framework添加到"Embedded Binaries"中
1.2.3 头文件引用的时候,需要如下引用 : framework/header.h
下列是脚本:
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
FRAMEWORK_TARGET=CocoaFramework
# 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
#编译非模拟器版本arm64
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
#编译非模拟器版本arm7
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
#编译非模拟器版本i386
xcodebuild -project "${PROJECT_FILE_PATH}" -target"${TARGET_NAME}" -configuration"${CONFIGURATION}" -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/i386" SYMROOT="${SYMROOT}" ARCHS='i386' VALID_ARCHS='i386' $ACTION
# 编译非模拟器版本x86_64
xcodebuild -project "${PROJECT_FILE_PATH}" -target"${TARGET_NAME}" -configuration"${CONFIGURATION}" -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/x86_64" SYMROOT="${SYMROOT}" ARCHS='x86_64' VALID_ARCHS='x86_64' $ACTION
#复制到相应为文件
rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_TARGET}.framework""${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_TARGET}.framework"
#通过lipo命令合并起来
lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphoneos/i386/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}""${BUILD_DIR}/${CONFIGURATION}-iphoneos/x86_64/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}""${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}""${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}" -output"${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_TARGET}.framework/${FRAMEWORK_TARGET}"
#这里我将文件复制到项目的位置,顺便打了个包。
folderpath="${PROJECT_DIR}/Framework/"
if [ -d $folderpath ]
then
rm -R "${PROJECT_DIR}/Framework/"
echo "exist"
fi
mkdir "${PROJECT_DIR}/Framework"
mv "${UNIVERSAL_OUTPUTFOLDER}/${FRAMEWORK_TARGET}.framework""${PROJECT_DIR}/Framework/${PROJECT_NAME}.framework"
2. 静态framework与动态framework的改变可以通过修改 "Build Settings -> Mach-O Type"类型来改变,而不需要重新建立新的项目