本文包含如下内容:html
前言linux
1.shell脚本的编写git
2.xcodebuild命令shell
3.完整的可用示例数据库
参考资料json
作iOS开发,打包APP是比较频繁的事情,每次都手动去配置一堆东西确实是比较乏味。xcode
另外,我目前负责维护的APP在发布时,不一样的Mode设置不一样的AppIcon和BundleID,安全
因此要是能够简单执行一个脚本就完成打包的各类配置,那就轻松了!bash
因而乎,我就在网上学习了一下实现自动打包的方法,可是好多都是老版本的教程。
因此我打算参考别人的教程,而后本身也研究研究,再把研究的结果和你们分享一下。
不喜勿喷哈,可是若是有好的建议,也欢迎你们提出!
Okay,follow me !
这段时间我学了学Go语言,也买了个阿里云服务器来捣鼓,
而后就很天然地学了一些Linux指令和shell脚本编写相关的知识。
忽然发现,咱们作iOS开发的也最好去学学后端、Linux指令和shell脚本编写。
为何呢?
a) 学后端,你会想办法去学习数据库优化,写出更高效的SQL语句;
b) 学后端,你会考虑到安全问题,写出稳健性更好的代码;
c) 学后端,你会去学不少极其实用的Linux命令,这样有助于你更好地使用你的macbook,由于不少命令在macbook上也是能够用的,这样其实也丰富了你的基础知识;
d) 学后端,你可能还得学习写shell脚原本完成一些繁杂的工做,而学会shell脚本的编写将让你受益终生;
e) shell脚本强大、易学、易用;
这里附上一个Shell脚本学习网站,强大、易学、易用,请相信我!😄
打开终端,输入 man xcodebuild ,回车:
这里有说明命令的用法,若是英语读起来吃力,能够复制到谷歌翻译:
大意就是你能够使用xcodebuild命令来build project或者workspace。
若是使用了Cocoapods,build的就必定是workspace了。
能够使用-list, -showBuildSettings, -showsdks, -usage, and -version这些命令来查看一些相关的信息。
只是经过这些命令来查看对应的配置信息而已,这些命令对于打包不会产生什么影响。
注意:如下示例shell脚本代码中的变量都须要自定义并赋值!
【清理build工做目录】在项目根目录执行:
clean -configuration ${development_mode} || exit
【打包】在项目根目录执行:
xcodebuild \ archive -workspace ${project_path}/${project_name}.xcworkspace \ -scheme ${scheme_name} \ -configuration ${development_mode} \ -archivePath ${build_path}/${project_name}.xcarchive || exit
archive 指明操做是打包;
-workspace 指明须要打包的是一个workspace而不是project,
若是是打包project,这里的路径和问价明就更改成对应的project便可;
-scheme 通常和项目同名;
-configuration 指明打包模式是Debug仍是Release;
-archivePath 指明打包操做的路径;
|| exit 指明若是这一条命令执行失败,则退出当前shell;
【导出安装包】在项目根目录执行:
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \ -configuration ${development_mode} \ -exportPath ${exportFilePath} \ -exportOptionsPlist ${exportOptionsPlistPath} || exit
有一些配置项和上面的 xcodebuild archive 是相同的,因此须要两个命令的参数匹配
-exportPath 指明.ipa文件处处的路径;
-exportOptionsPlist 指明 exportOptions.plist 文件的位置,这个文件是-exportArchive必需的参数;
实测exportOptions.plist文件里能够什么都不配置,
只要Xcode的project或者workspace里设置好了对应参数就好!
exportOptions.plist文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>
若是经过Xcode打开这个exportOptions.plist文件,你也能够为其配置如下内容(资料来源):
method: (String) The method of distribution, which can be set as any of the following: app-store enterprise ad-hoc development teamID: (String) The development program team identifier. uploadSymbols: (Boolean) Option to include symbols in the generated ipa file. uploadBitcode: (Boolean) Option to include Bitcode.
3.完整的可用示例(加入了-quiet参数,只输出错误和警告信息):
#! /bin/bash # created by Ficow Shen #工程绝对路径 project_path=$(pwd) #工程名 project_name=自定义 #打包模式 Debug/Release development_mode=Debug #scheme名 scheme_name=自定义 #build文件夹路径 build_path=${project_path}/build #plist文件所在路径 exportOptionsPlistPath=${project_path}/exportOptions.plist #导出.ipa文件所在路径 exportFilePath=${project_path}/ipa/${development_mode} echo '*** 正在 清理工程 ***' xcodebuild \ clean -configuration ${development_mode} -quiet || exit echo '*** 清理完成 ***'
echo '*** 正在 编译工程 For '${development_mode} xcodebuild \ archive -workspace ${project_path}/${project_name}.xcworkspace \ -scheme ${scheme_name} \ -configuration ${development_mode} \ -archivePath ${build_path}/${project_name}.xcarchive -quiet || exit echo '*** 编译完成 ***'
echo '*** 正在 打包 ***' xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \ -configuration ${development_mode} \ -exportPath ${exportFilePath} \ -exportOptionsPlist ${exportOptionsPlistPath} \ -quiet || exit if [ -e $exportFilePath/$scheme_name.ipa ]; then
echo "*** .ipa文件已导出 ***" open $exportFilePath else
echo "*** 建立.ipa文件失败 ***"
fi
echo '*** 打包完成 ***'
注意:
a.当须要输入的shell命令过长时,能够用\来进行合理的换行分隔;
b.若是须要打包的是project,则在archieve中将-workspace替换为-project,
而后将.xcworkspace的路径替换为.xcodeproj的路径;
可供参考的建议:
a.在项目根目录新建一个AutoPack目录,将全部脚本放置到这个目录中,
打包完成后的.ipa文件也导出到这个目录里,便于统一管理;
b.若是须要替换BundleID,用git先保存项目的当前状态,而后去修改Bundle Identifier,
这时候能够经过git查看修改记录,而后就知道BundleID的修改该如何写脚原本执行了;
c.若是须要替换程序图标,直接删除Images.xcassets中的AppIcon.appiconset,
而后复制新的进去便可,连同Contents.json文件也一块儿替换掉;
d.能够将一些操做封装为函数便于重用,能够在某个文件中使用source命令将函数体所在的文件包含进来;
如下是一些可供参考的示例脚本,请注意命令内部的空格分隔!
替换图标的示例脚本:
#! /bin/bash # created by Ficow Shen useDebugIcon(){ rm -rf 项目根目录/Images.xcassets/AppIcon.appiconset || exit cp -r AutoPack/IconOfDebug/AppIcon.appiconset/ 项目根目录/Images.xcassets/AppIcon.appiconset || exit echo '* 已更改AppIcon 为:测试版 图标' } useReleaseIcon(){ rm -rf 项目根目录/Images.xcassets/AppIcon.appiconset || exit cp -r AutoPack/IconOfRelease/AppIcon.appiconset/ 项目根目录/Images.xcassets/AppIcon.appiconset || exit echo '* 已更改AppIcon 为:正式版 图标' } echo 'changeAppIcon.sh 加载完毕!'
替换BundleID的示例脚本:
#! /bin/bash # created by Ficow Shen useDebugBundleID(){ cd 项目根目录.xcodeproj/ # sed -i 直接修改源文件,'' 备份文件名, 's/要被取代的字串/新的字串/g', 须要设置bundleID的文件 # 假设com.a.a是测试环境使用的,com.b.b是正式环境使用的 sed -i '' 's/com.a.a/com.b.b/g' project.pbxproj || exit cd .. echo '* 已更改bundle ID 为:com.b.b' } useReleaseBundleID(){ cd 项目根目录.xcodeproj/ sed -i '' 's/com.b.b/com.a.a/g' project.pbxproj || exit cd .. echo '* 已更改bundle ID 为:com.a.a' } echo 'editBundleID.sh 加载完毕!'
-- 感谢以上文章做者的热心分享!😄
Ficow原创,转载请注明出处:http://www.cnblogs.com/ficow/p/6823962.html