创建ios的framework的方法很多网上找找一大把。但是在联合使用cocoapods的时候就有一些问题。在这里我主要介绍一下我在使用ios framework和cocoapods过程中遇到的问题和解决方法,供大家参考。
所有ios framework也是一种创建静态库的方法。具体怎么操作的请阅读这里。他的说明中说了比之前的ios universal framework要好。首先我按照说明创建了2个target分别使用了prepare framework和build framework脚本。先简单的说明一下,这个2个脚本的作用。所有第一个脚本prepare framework的作用就是构建framework结构,分别将文件拷贝进去已经创建link来着。而build framework的作用也很简单的,build 的那个target其实是做了2次编译操作,为什么了,因为framework这个target是有依赖的,所以先是依赖的target先编译也就是之前的那个target先编译,然后到build framework脚本里面再进行一次编译但是这次的编译和上面依赖的编译有所不同,不同的就是所编译的platfrom不同,也就是说如果之前编译的platform是iphoneos那么build里面就编译iphonesimulator,反之就编译iphoneos来着,这个样就可以保证target生成的都是全平台的了。
那问题就来了,因为cocoapods创建的workspace里面只对project修改的时候根本没有对framework哪个target进行啊。所以每次编译的时候都说找不到pod库来着。怎么办呢?既然framework的target进行了2次,那么我们再pod工程中也加上build framework里面的build脚本就行了呗。说来就来。看到了吧,我只是做一次编译而已不做什么framework的工作。
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
SF_TARGET_NAME=${PROJECT_NAME}
SF_EXECUTABLE_PATH="lib${SF_TARGET_NAME}.a"
SF_WRAPPER_NAME="${SF_TARGET_NAME}.framework"
# The following conditionals come from
# https://github.com/kstenerud/iOS-Universal-Framework
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 [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]
then
SF_SDK_VERSION=${BASH_REMATCH[1]}
else
echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi
if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
SF_OTHER_PLATFORM=iphonesimulator
else
SF_OTHER_PLATFORM=iphoneos
fi
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$SF_SDK_PLATFORM$ ]]
then
SF_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${SF_OTHER_PLATFORM}"
else
echo "Could not find platform name from build products directory: $BUILT_PRODUCTS_DIR"
exit 1
fi
# Build the other platform.
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk ${SF_OTHER_PLATFORM}${SF_SDK_VERSION} BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" $ACTION
# Smash the two static libraries into one fat binary and store it in the .framework
#lipo -create "${BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}" "${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}" -output "${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/${FRAMEWORK_VERSION}/${SF_TARGET_NAME}"
# Copy the binary to the other architecture folder to have a complete framework in both.
#cp -a "${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/${FRAMEWORK_VERSION}/${SF_TARGET_NAME}" "${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/${FRAMEWORK_VERSION}/${SF_TARGET_NAME}"