最近把Xcode升级到了Version 8.3.2(8E2002)
,发现原来的终端打包方式已经打不了.ipa
包了。
一、使用终端打包的旧方法
原来的终端代码如下:
1 2 3 4 5 6 7
| $ cd /Users/huangaengoln/Desktop/TKAPP_XDTX_branch_for_RZRQ_1.5.0-16-04-07 $ xcodebuild -list $ xcodebuild -project TKApp_XDTX.xcodeproj -target TKApp_XDTX_invest -configuration Release $ xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/TKApp_XDTX_invest.app -o ~/Desktop/TKApp_XDTX_invest.ipa
|
于是只能重新寻找新的终端打包方式了。
关于打包,我们需要建立一个这样的观念:只要可以成功操作的功能,都是可以通过终端来实现的,特别是提供电脑系统的公司开发提供或推荐的软件。
在网上寻找一番后,找到了这2篇文章:
关于 iOS 批量打包的总结
使用xcodebuild打包 导出ipa 上传蒲公英或者提交AppStore
参考着第一篇文章,写出了新的行之有效的打包代码:
二、使用终端打包的新方法
1 2 3 4 5 6
| //信达 TKApp_XDTX_invest $ cd /Users/huangaengoln/Desktop/信达IOS_APP_for_2.1.0 $ xcodebuild archive -workspace TKApp_XDTX.xcodeproj/project.xcworkspace -scheme TKApp_XDTX_invest -archivePath ~/Documents/xcarchive/TKApp_XDTX_invest.xcarchive $ xcodebuild -exportArchive -archivePath ~/Documents/xcarchive/TKApp_XDTX_invest.xcarchive -exportPath ~/Desktop/TKApp_XDTX_invest -exportOptionsPlist TKApp/TKApp_XDTX_invest-Info.plist
|
接着又寻思着,能不能把这些代码都写在一个可执行文件中,打包时直接拖进终端就可以执行这几句代码。因为打包时这几句就是配置好后简单的复制到终端,回车后等待,纯粹是体力活。
于是把上面的代码,写在了.sh
文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #去到对应的工程目录 echo "~~~~~~~~~~~~~~~~去到对应的工程目录~~~~~~~~~~~~~~~~~~~" cd ~/Desktop/信达IOS_APP_for_2.1.0 #工程路径 ProjectCurrentPath=`pwd` #工程名称(Project的名字) ProjectName="TKApp_XDTX" ### #scheme名字 -可以点击Product->Scheme->Manager Schemes...查看 Scheme="TKApp_XDTX_invest" ### #需要编译的 targetName TARGET_NAME="TKApp_XDTX_invest" ### #导出ipa 所需plist ExportOptionsPlist=${ProjectCurrentPath}/TKApp/TKApp_XDTX_invest-Info.plist ### # .xcworkspace 的路径 Workspace=${ProjectCurrentPath}/${ProjectName}.xcodeproj/project.xcworkspace ### #编译路径 BUILDPATH=~/Desktop/xcarchive/${TARGET_NAME}_${Date} #archivePath ARCHIVEPATH=${BUILDPATH}/${TARGET_NAME}_${Date}.xcarchive #输出的ipa目录 IPAPATH=${BUILDPATH} #Release还是Debug Configuration="Release" echo "~~~~~~~~~~~~~~~~清除工程~~~~~~~~~~~~~~~~~~~" # 清理 避免出现一些莫名的错误 xcodebuild clean -project ${PROJECTNAME}.xcodeproj #构建 echo "~~~~~~~~~~~~~~~~开始编译~~~~~~~~~~~~~~~~~~~" xcodebuild archive \ -workspace ${Workspace} \ -scheme ${Scheme} \ -configuration ${Configuration} \ -archivePath ${ARCHIVEPATH} echo "~~~~~~~~~~~~~~~~检查是否构建成功~~~~~~~~~~~~~~~~~~~" # xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断 if [ -d "$ARCHIVEPATH" ] then echo "构建成功......" else echo "构建失败......" rm -rf $BUILDPATH exit 1 fi #生成ipa echo "~~~~~~~~~~~~~~~~导出ipa~~~~~~~~~~~~~~~~~~~" beginTime=`date +%s` xcodebuild -exportArchive \ -archivePath ${ARCHIVEPATH} \ -exportPath ${IPAPATH} \ -exportOptionsPlist ${ExportOptionsPlist} echo "~~~~~~~~~~~~~~~~检查是否成功导出ipa~~~~~~~~~~~~~~~~~~~" IPAPATH=${IPAPATH}/${TARGET_NAME}.ipa if [ -f "$IPAPATH" ] then echo "导出ipa成功......" #打开ipa所在文件夹 open $BUILDPATH else echo "导出ipa失败......" # 结束时间 endTime=`date +%s` echo "$ArchiveTime" echo "导出ipa时间$[ endTime - beginTime ]秒" exit 1 fi
|
三、给打出来的.ipa
包名字后面加上日期和时间(时、分)
打出ipa
包后,可以在后面用终端命令修改.ipa
的名字:
1 2 3
| # 修改ipa包的名字 echo "~~~~~~~~~~~~~~~~修改ipa的名字~~~~~~~~~~~~~~~~~~~" mv ${BUILDPATH}/${TARGET_NAME}.ipa ${BUILDPATH}/${TARGET_NAME}_${Date}.ipa
|
四、显示打包花了多少时间
在第一行获取开始时间:
当编译完成时,再获取编译后的当前时间,与开始时间的差值就是build所消耗的时间:
1 2 3 4
| endTime=`date +%s` ArchiveTime="构建时间$[ endTime - beginTime ]秒" #... ... echo "$ArchiveTime"
|
在打出ipa包前后,分别获取下当前时间,并计算差值,即打包所需时间:
1 2 3 4 5 6
| beginTime=`date +%s` #... ... endTime=`date +%s` ExportTime="导出ipa时间$[ endTime - beginTime ]秒" #... ... echo "$ExportTime"
|
五、修改bundleId、version和build号
在编译之前,可以修改工程.plist
中的verseionhe、build等内容:
1 2 3 4 5 6 7 8 9 10 11 12
| BundleIdentifier="com.thinkive.xxxx" ##版本号 ShortVersionString="2.1.6" ##Build号 BuildVersion="1.0.1" ###bundleID:com.thinkive.investxdtx $PlistBuddyPath -c "Set :CFBundleIdentifier $BundleIdentifier" ${ExportOptionsPlist} ###版本号:2.1.5 $PlistBuddyPath -c "Set :CFBundleShortVersionString $ShortVersionString" ${ExportOptionsPlist} ###Build号:1.0.0 $PlistBuddyPath -c "Set :CFBundleVersion $BuildVersion" ${ExportOptionsPlist}
|
注意:不建议修改.plist
中的BundleIdentifier。原来.plist
中的BundleIdentifier的值是$(PRODUCT_BUNDLE_IDENTIFIER)
,直接修改为具体的值后会造成与Settings
中的bundleID不一致。
对于不同的BundleIdentifier,可以通过建立不同的target来解决。
同时,需要声明的是,这里通过终端对.plist
的修改,跟在工程中修改是等价的。
六、在打包的时候,修改工程,是否对打包有影响?
答曰:经过测试,不会有影响。
我这里只是简单的做了测试:在build的时候,直接去掉一句代码后面的;
,观察是否会build失败。
七、把所有要配置的内容,集中放在一个地方
下面这段代码,是需要检查(路径是否正确)和配置的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #************************* 配置项目 ******************************************** #去到对应的工程目录 echo "~~~~~~~~~~~~~~~~去到对应的工程目录~~~~~~~~~~~~~~~~~~~" cd ~/Desktop/信达IOS_APP_for_2.1.0 #工程路径 ProjectCurrentPath=`pwd` #工程名称(Project的名字) ProjectName="TKApp_XDTX" ### #scheme名字 -可以点击Product->Scheme->Manager Schemes...查看 Scheme="TKApp_XDTX_invest" ### #需要编译的 targetName TARGET_NAME="TKApp_XDTX_invest" ### #导出ipa 所需plist ExportOptionsPlist=${ProjectCurrentPath}/TKApp/TKApp_XDTX_invest-Info.plist ### # .xcworkspace 的路径 Workspace=${ProjectCurrentPath}/${ProjectName}.xcodeproj/project.xcworkspace ### BundleIdentifier="com.thinkive.xxxx" ##版本号 ShortVersionString="2.1.6" ##Build号 BuildVersion="1.0.1" #************************* 配置项目 结束 ********************************************
|
八、添加是否上传蒲公英或fir.im
下面是上传fir.im的一部分实践,后期继续探索:
构建fir.im的自动上传:
参考自:iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上
Mac OS X 10.11 以后的版本, 由于10.11引入了 rootless, 无法直接安装 fir-cli, 有以下三种解决办法:
//… …
我选的是第三种方法:重写 Ruby Gem 的 bindir
1 2
| $ echo 'gem: --bindir /usr/local/bin' >> ~/.gemrc $ gem install fir-cli
|
然后再网页登录你的fir.im账号,拿到API Token(比如:你拿到的token是fa46398ca7dcf2ba25487be28ae68d75),接着在终端登录你的fir.im
1 2
| $ fir login fa46398ca7dcf2ba25487be28ae68d75 $ fir me
|
如果出现以下类似的情况,说明登录成功了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| huangsengolndeMacBook-Pro:~ huangaengoln$ fir me Ignoring RedCloth-4.2.9 because its extensions are not built. Try: gem pristine RedCloth --version 4.2.9 Ignoring fast-stemmer-1.0.2 because its extensions are not built. Try: gem pristine fast-stemmer --version 1.0.2 Ignoring ffi-1.9.10 because its extensions are not built. Try: gem pristine ffi --version 1.9.10 Ignoring posix-spawn-0.3.11 because its extensions are not built. Try: gem pristine posix-spawn --version 0.3.11 Ignoring rdiscount-2.1.8 because its extensions are not built. Try: gem pristine rdiscount --version 2.1.8 Ignoring rdiscount-2.1.7 because its extensions are not built. Try: gem pristine rdiscount --version 2.1.7 Ignoring redcarpet-3.3.3 because its extensions are not built. Try: gem pristine redcarpet --version 3.3.3 Ignoring redcarpet-3.3.2 because its extensions are not built. Try: gem pristine redcarpet --version 3.3.2 Ignoring yajl-ruby-1.2.1 because its extensions are not built. Try: gem pristine yajl-ruby --version 1.2.1 I, [2017-05-27T11:34:43.203861 #80585] INFO -- : Login succeed, current user's email: huangsj@thinkive.com I, [2017-05-27T11:34:43.204139 #80585] INFO -- : Login succeed, current user's name: huangsj I, [2017-05-27T11:34:43.204221 #80585] INFO -- : huangsengolndeMacBook-Pro:~ huangaengoln$
|