iOS制作framework
#xcodebuild -project hvui.xcodeproj -target FrameworkMaker_Release;rm -rf build;
productName="${PROJECT_NAME}"
target="${productName}"
tmpDir="${PROJECT_TEMP_DIR}/build"
rm -rf "${tmpDir}"#清除编译临时文件
#编译bundle
xcodebuild -target "${PROJECT_NAME}Bundle" -configuration "Release" -sdk "iphoneos" build SYMROOT="${tmpDir}" ONLY_ACTIVE_ARCH="NO" VALID_ARCHS="arm64 armv7 armv7s i386 x86_64"
function buildLibs(){
sdks=("iphonesimulator" "iphoneos")
configurations=("Debug" "Release")
for configuration in ${configurations[@]}
do
for sdk in ${sdks[@]}
do
xcodebuild -target "${target}" -configuration "${configuration}" -sdk "${sdk}" build SYMROOT="${tmpDir}" ONLY_ACTIVE_ARCH="NO" VALID_ARCHS="arm64 armv7 armv7s i386 x86_64"
done
done
}
function lipoLibs(){
#copy Release-iphoneos到 Frameworks 目录,然后 lipo -c 一份
ios_libs_dir="${SRCROOT}/../ios_libs"
frameworkDir="${ios_libs_dir}/Frameworks"
[ -d "${frameworkDir}" ] || mkdir -p "${frameworkDir}"
cp -r "${ios_libs_dir}/Release-iphoneos/${productName}.framework" "${frameworkDir}/"
#lipo -c ... -o ..
lipo -c "${ios_libs_dir}/Release-iphoneos/${productName}.framework/${productName}" "${ios_libs_dir}/Release-iphonesimulator/${productName}.framework/${productName}" -o "${frameworkDir}/${productName}.framework/${productName}"
rm -rf "${frameworkDir}/${productName}.framework/_CodeSignature"
}
function rmLibs(){
ios_libs_dir="${SRCROOT}/../ios_libs"
sdks=("iphonesimulator" "iphoneos")
configurations=("Release")
for configuration in ${configurations[@]}
do
for sdk in ${sdks[@]}
do
rm -rf "${ios_libs_dir}/${configuration}-${sdk}/${productName}.framework"
done
done
}
buildLibs
lipoLibs
#rmLibs
#cp to ios_libs
productName="${PROJECT_NAME}"
target="${productName}"
tmpDir="${PROJECT_TEMP_DIR}/build"
rm -rf "${tmpDir}"#清除编译临时文件
#编译bundle
xcodebuild -target "${PROJECT_NAME}Bundle" -configuration "Release" -sdk "iphoneos" build SYMROOT="${tmpDir}" ONLY_ACTIVE_ARCH="NO" VALID_ARCHS="arm64 armv7 armv7s i386 x86_64"
function buildLibs(){
sdks=("iphonesimulator" "iphoneos")
configurations=("Debug" "Release")
for configuration in ${configurations[@]}
do
for sdk in ${sdks[@]}
do
xcodebuild -target "${target}" -configuration "${configuration}" -sdk "${sdk}" build SYMROOT="${tmpDir}" ONLY_ACTIVE_ARCH="NO" VALID_ARCHS="arm64 armv7 armv7s i386 x86_64"
done
done
}
function lipoLibs(){
#copy Release-iphoneos到 Frameworks 目录,然后 lipo -c 一份
ios_libs_dir="${SRCROOT}/../ios_libs"
frameworkDir="${ios_libs_dir}/Frameworks"
[ -d "${frameworkDir}" ] || mkdir -p "${frameworkDir}"
cp -r "${ios_libs_dir}/Release-iphoneos/${productName}.framework" "${frameworkDir}/"
#lipo -c ... -o ..
lipo -c "${ios_libs_dir}/Release-iphoneos/${productName}.framework/${productName}" "${ios_libs_dir}/Release-iphonesimulator/${productName}.framework/${productName}" -o "${frameworkDir}/${productName}.framework/${productName}"
rm -rf "${frameworkDir}/${productName}.framework/_CodeSignature"
}
function rmLibs(){
ios_libs_dir="${SRCROOT}/../ios_libs"
sdks=("iphonesimulator" "iphoneos")
configurations=("Release")
for configuration in ${configurations[@]}
do
for sdk in ${sdks[@]}
do
rm -rf "${ios_libs_dir}/${configuration}-${sdk}/${productName}.framework"
done
done
}
buildLibs
lipoLibs
#rmLibs
#cp to ios_libs
#cp -Rf "${SRCROOT}/ios_libs/Frameworks/${productName}.framework" "${SRCROOT}/../ios_libs/Frameworks/${productName}.framework"
$(SRCROOT)/../ios_libs/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
以上代码需要加入到的地方自行百度。下边说一个注意情况:
如果,将上边生成的framework导入到新工程运行报错了,且报错如下图:
dyld`__abort_with_payload:
0x10055ef40 <+0>: mov x16, #0x209
0x10055ef44 <+4>: svc #0x80
-> 0x10055ef48 <+8>: b.lo 0x10055ef60 ; <+32>
或者:image not found
这表示,找不到framework被编译后的代码镜像(暂且这么理解吧,其实我觉得也不是很准确)
可作如下设置:
targets->general->embedded binaries
这个表示,程序启动的时候,就将使用到的framework编译成二进制文件(暂且这么理解吧,错了不要打我)
OK,成功使用framework,并调用了其中方法。
(对了,看很多的笔记上说遇到上边运行不了的情况,要改这改那,但是本宝宝,别的地方没动,制动了上边截图的一处就可以了,如果还是运行不了的话,看看你生成的framework是否是支持模拟器和真机的)