以前一直做持续发布使用xcbuild和xctool这些工作进行打包,但是经常遇到证书相关的问题,各种Provising Profile文件匹配不上,然后又证书不匹配等等。于是开始寻求新的解决方案,找到了新的神器fastlane。
相关信息
fastlane是一整套的工具帮助开发者主要是iOS开发者,打包App上传App到App store或着TestFlight。
fastlane的官方repo地址:
https://github.com/fastlane/fastlane
fastlane的快速上手文档:
https://docs.fastlane.tools/
fastlane支持的action文档
https://docs.fastlane.tools/actions/
安装fastlane
1.确保xcode命令行工具已经安装
```xcode-select --install`
``
2.参考官方文档有三种安装方式任选一种进行安装
使用fastlane进行打包
1.初始化项目 fastlane init
使用fastlane必须要先对项目进行初始化fastlane init
a.使用命令行工具进入项目目录执行fastlane init
命令
初始化的过程中会需要填写一些项目信息包括scheme name和你的Apple id等等。同时会在项目中生成一个fastlane的文件夹。
2.查看fastlane文件夹中的内容
上面已经说到初始化之后,在项目根目录会生成一个fastlane的文件夹,接着打开文件夹看一看
文件夹里一共有4个文件
- Appfile里面存放了App的基本信息包括app_identifier、apple_id、team_id等等。如果在第一步init的时候你输入了正确的appId账号和密码会在这里生成正确的team_id信息。
- Fastfile是最重要的一个文件,可以编写和定制我们打包脚本的一个文件,我们自定义的一些功能就写在这里。
- README.md里面是一些帮助说明信息
- report.xml就不用管了
Fastfile
下面贴一下Fastfile中的内容
Paste_Image.png前面几行记录了fastlane的版本信息
从
platform :ios do
开始下面的就是fastlane可以执行的任务第一个
before_all do
cocoapods
end
这个点意思是在执行每一个lane之前都先执行这个功能,它里面其实就跑了一个fastlane的action这个action叫cocoapods
。
3.1查看fastlane的action以及action的用法
上面提到before_all
中其实就是执行了一个action那么让我们来看看fastlane一共有哪些action,以及action怎么用
在命令行中使用fastlane actions
可以列出所有的action,使用fastlane action [action的名字]
可以查看该action的相关信息,最重要的是在帮助文档中的这里可以查看具体action的使用方法和示列https://docs.fastlane.tools/actions/.
列出所有action
查看某个action的说明
Paste_Image.png
网页文档中关于cocoapods这个action的说明:
屏幕快照 2016-12-05 上午1.11.49.png3.编写自己的lane
知道了action和lane之后,我们回到Fastfile文件中,看看其实在生成的文件中已经帮我们写了好几个lane了
desc "Runs all the tests"
lane :test do
scan
end
desc "Submit a new Beta Build to Apple TestFlight"
desc "This will also make sure the profile is up to date"
lane :beta do
# match(type: "appstore") # more information: https://codesigning.guide
gym # Build your app - more options available
pilot
# sh "your_script.sh"
# You can also use other beta testing services here (run `fastlane actions`)
end
上面有2个lane,一个叫test 一个叫beta,test中执行了scan这个action,这就是用来运行单元测试的一个action,具体信息可以使用fastlane action scan
查看,然后beta这个lane执行了gym和pilot,gym是打包,pilot是把应用发到TestFlight,具体使用方法一定要去查看文档哦。
但是生成的这些lane可能不满足我们的需求,下面以一个企业版应用打包为例我们自己新建一个lane:
desc "打包成企业版ipa"
lane :inhouse do |options|
#更新info plist文件 ENV["key"]表示从环境变量中读取值,也可以直接写死,如果要在打包时改变某些参数,可以把它们设置成环境变量
update_info_plist(
plist_path: "GoodFolks/info.plist",
display_name: "新App名字",
)
#更新urlType 具体用法查询action文件update_info_plist的说明
update_info_plist(
xcodeproj: "GoodFolks.xcodeproj",
plist_path: "GoodFolks/info.plist",
block: lambda { |plist|
#这里我在更新微信的urlType 这个action还可以更新app的bundleid 具体可以查阅文档
urlScheme = plist["CFBundleURLTypes"].find{|scheme| scheme["CFBundleURLName"] == "weixin"}
urlScheme[:CFBundleURLSchemes] = ENV["app_urlschems_weixin"]
}
)
#设置版本号
increment_version_number(
version_number: ENV["app_versionName"]
)
#设置build号,这些都可以写死,也可以不要这些action,也可以从环境变量中获取值
increment_build_number(
build_number: ENV["app_versionCode"]
)
#这个action很重要cert就是下载和安装匹配的Provision Profile文件,不用你去管那些证书不匹配的事情啦,下载的文件会存在项目根目录的build文件夹下
cert(output_path:"build")
#这一步就是签名了
sigh(
app_identifier: ENV["app_applicationId"],
team_id:"9M8CTWAV8P",
output_path: "build"
)
#最后就是打包,企业版打包,打包完成后会在项目根目录的build文件夹下生成ipa文件
gym(
scheme: "GoodFolks",
export_method: "enterprise",
output_directory: "build",
include_bitcode: false
)
# do some other stuff here
end
4.起飞
上面说了这么多,但是怎么运行呢?
很简单在你的项目根目录执行fastlane [lane的名字]
比如我们上面自己写的一个fastlane inhouse
,fastlane就会执行指定的任务了,然后你就可以去喝咖啡啦。
Tips
fastlane在打包的时候可能需要交互比如输入你的Apple id的密码,但是很明显在做持续发布的时候都是自动化的,不是交互式的shell,没办法人工去输入密码,这个只需要把你的Appleid的密码设置成一个环境变量即可,环境变量的key为FASTLANE_PASSWORD。
网友评论
然后我又用xcode手动archive出来放到蒲公英下载是ok的 不知道是哪里出问题了
感谢分享
RVM detected, forcing to use system ruby
Warning! PATH is not properly set up, '/Users/caoyunxiao/.rvm/gems/ruby-2.4.0/bin' is not at first place.
Usually this is caused by shell initialization files. Search for 'PATH=...' entries.
You can also re-add RVM to your profile by running: 'rvm get stable --auto-dotfiles'.
To fix it temporarily in this shell session run: 'rvm use ruby-2.4.0'.
To ignore this error add rvm_silence_path_mismatch_check_flag=1 to your ~/.rvmrc file.
Now using system ruby.
你能看看是什么原因吗
在命令行里执行`echo $PATH`
然后去你的打包工具里设置环境变量jenkins或者其他的,不知道你用什么做的CI,添加一个 PATH='echo 输出的内容'