xcodebuild 打包ipa+上传蒲公英+上传应用商店app store+打包framework sdk
2018-09-23 14:51 加个小鸡腿 阅读(1416) 评论(0) 编辑 收藏 举报这篇博客包含了基本所有的ios打包方面的东西,有打包成ipa的,打包成framework的,ipa上传蒲公英的,上传应用商店和testflight的,将逐一介绍
我目前mac电脑上包含三个xcode版本,一个是xcode10,一个是xcode11,一个是xcode12,其中xcode10是用来打包framework sdk的,因为有部分用户使用的xcode版本比较低,如果打包版本高,就不能集成了,所以使用xcode10打包framework sdk,xcode12是用来打包可直接安装在iphone上的ipa包,这是根据开发的需要来的,其他打包使用xcode11,比如打包sdk对于的ipa安装测试包,系统默认的是xcode11,具体使用什么版本的xcode,根据开发人员的需要来。关于如何切换xcode的版本,可以参考的另一篇博客:https://www.cnblogs.com/zndxall/p/12909858.html
<1>xcodebuild 打包ipa+上传蒲公英+上传应用商店app store
app代码仓需要发布的ipa的打包:采用achieve的方式,比如我的app_name=HP_LB,scheme也是这个,说白了,app_name其实就是scheme
(1)前期工作
mkdir arch
archive_path=arch/${app_name}.xcarchive
(2)清理 (其中scheme和workspace就不细说了,如果不清楚的话,ios的开发都知道,ios_type包含Debug和Release)
xcodebuild clean -workspace ${workspace_name}.xcworkspace -scheme ${app_name} -configuration $ios_type
(3)打包成app(其中achieve路径自己定义)
xcodebuild archive -workspace ${workspace_name}.xcworkspace -scheme ${app_name} -archivePath $archive_path -configuration $ios_type
(4)导出ipa (其中的plist文件按照自己的路径填写)
echo export ipa ....
plist_file=ExportOptions.plist #到处ipa的重点就是这个plist文件,如果你不知道这个文件在哪里,你可以先使用xcode工具achive一个ipa,然后Build文件夹中找到这个文件,然后 保存这个文件到你的本地,xcodebuild自动打包的时候会用到这个文件。
xcodebuild -exportArchive -archivePath $archive_path -exportPath arch/target_ipa -exportOptionsPlist $plist_file -allowProvisioningUpdates
#如果是给测试人员使用的测试包,plist_file=ExportOptions.plist 里面的method使用的是“ad-hoc”,如果是要上传到应用商店和testflight,这个字段的值就是"app-store",这很重要
(5)上传ipa到蒲公英
akey="1212122311" # api key ukey="13144224451" #user key boot_passwd="1234" #开机登陆密码 des_msg=`git log -1 --pretty=%B` #日志信息 ipa_path="HP_LB.ipa" upload_url="http://www.pgyer.com/apiv1/app/upload" [ ! -f "$ipa_path" ] && echo not find $ipa_path && exit 1 echo uploading $ipa_path to pgyer ..... curl -F "file=@${ipa_path}" -F "uKey=${ukey}" -F "_api_key=${akey}" -F "updateDescription=${des_msg}" -F "password=${boot_passwd}" $upload_url
其中api key和user key可以通过登录蒲公英查看到,boot_passwd是你的mac电脑的开机登录密码,其他上面已经说的很明确了。
(6)上传ipa到应用商店app store和testflight
testflight是用来内测使用的,内测ok就可以直接上到app store了。
akey="abqbqbqbq" auser="1234-1231-123***" sed -i "" s/"ad-hoc"/"app-store"/g ExportOptions.plist #上面说过,如果是要上传到应用商店和testflight,这个字段的值就是"app-store",这很重要 echo export app store ipa .... #导出ipa archive_path=arch/HP_LB.xcarchive echo xcodebuild -exportArchive -archivePath $archive_path -exportPath arch/target_ipa -exportOptionsPlist $plist_file -allowProvisioningUpdates xcodebuild -exportArchive -archivePath $archive_path -exportPath arch/target_ipa -exportOptionsPlist $plist_file -allowProvisioningUpdates ipa_name="HP_LB.ipa" xcrun altool --validate-app -f target/$ipa_name -t ios --apiKey $akey --apiIssuer $auser --verbose #验证app的有效性 xcrun altool --upload-app -f target/$ipa_name -t ios --apiKey $akey --apiIssuer $auser --verbose #上传app 到应用商店和testflight
上面说过,如果是要上传到应用商店和testflight,ExportOptions.plist这个字段的值就是"app-store",这很重要
api key和user id是在app store官网上申请和设置的,具体如何操作,请自查。
xcrun altool那两条命令用来验证ipa是否有效,和上传应用商店,如果无效就没有上传的必要,无效的话,会报错。
2.打包framework sdk:sdk代码仓,需要打对应ipa测试,也需要给客户sdk framework集成。
(1)清理
xcodebuild clean -project ${project_name}.xcodeproj -scheme ${app_name} -configuration Release
(2)打包成app
xcodebuild build -project ${project_name}.xcodeproj -scheme ${app_name} -configuration Release
(3)将app放到Payload文件夹中,并压缩文件夹为zip后缀,然后修改为ipa后缀
mv Build/ProductsRelease-iphoneos/"$app_name".app Payload/
zip -q -r "$ios_app_name".zip Payload
cp "$ios_app_name".zip target/"$ios_app_name".ipa
这个ipa就可以发给测试测了。
(4)生成sdk framework
(4.1)生成真机framework:
ios_scheme_tmp=HP_LBFM #sdk的scheme,根据自己实际情况定 itype-iphoneos=Release #构建类型,Debug或者Release sdk_version=`xcodebuild -showsdks |grep "iphoneos" |awk -F \'-sdk \' \'{print $2}\'` #获取真机版本 xcodebuild -scheme ${ios_scheme_tmp} -configuration $itype -sdk $sdk_version clean build #使用系统真机sdk构建 mv Build/Products Build/Products_re #备份上面编译好的真机framework
(4.2)生成模拟机framework:
sdk_version=`xcodebuild -showsdks |grep "iphonesimulator" |awk -F \'-sdk \' \'{print $2}\'` #获取模拟机版本 xcodebuild -scheme ${ios_scheme_tmp} -configuration $itype -sdk $sdk_version clean build #使用模拟机sdk构建 mv Build/Products_re/* Build/Products/ #复制上面备份好的真机framework到模拟机路径下
(4.3)整合真机和模拟机famework:
cd Build/Products lipo -info $itype-iphoneos/"$ios_scheme_tmp".framework/$ios_scheme_tmp #显示真机信息 lipo -info $itype-iphonesimulator/"$ios_scheme_tmp".framework/$ios_scheme_tmp #显示模拟机信息 cp $itype-iphoneos/"$ios_scheme_tmp".framework/$ios_scheme_tmp ./ #整合真机和模拟机 lipo -create $ios_scheme_tmp $itype-iphonesimulator/"$ios_scheme_tmp".framework/$ios_scheme_tmp -output $itype-iphoneos/$ios_scheme_tmp [ $? -ne 0 ] && exit 1 mv $itype-iphoneos/$ios_scheme_tmp $itype-iphoneos/"$ios_scheme_tmp".framework lipo -info $itype-iphoneos/"$ios_scheme_tmp".framework/$ios_scheme_tmp |tee ios_result #显示整合后得信息
(4.4)检查是否整合成功:【根据自己项目确定需要满足的类型】
sed -i .tmp \'s/\n//g\' ios_result #删除文件中的换行 success_flag=`cat ios_result |awk -F \': \' \'{print $3}\'` #检查是否整合成功(支持的平台) if [ "$success_flag" != "armv7 i386 x86_64 arm64 " ];then #注意,结尾有空格 echo build fail and is not armv7 i386 x86_64 arm64 else echo build success and is armv7 i386 x86_64 arm64 #正常情况下,必须包含这四种类型才算整合成功【根据自己项目确定需要满足的类型】 fi
cd $itype-iphoneos/
tar -cvf "$ios_scheme_tmp"_framework.tar "$ios_scheme_tmp".framework #压缩framwork
最后把这个压缩好的tar包给用户就可以集成了。
xcodebuild 的其他简单用法:
(1)xcodebuild -list #显示scheme
(2)xcodebuild -showsdks #显示系统和模拟器得sdk版本
参考资料:
https://www.jianshu.com/p/36d2c6d65aa7
http://lijingcheng.github.io/blog/2016/12/05/tong-guo-xcodebuildda-bao-ipabing-shang-chuan-pu-gong-ying/