Fastlane - 从创建证书到上传到App Store

简介

fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化签名、配置、打包、发布等工作
为什么要用fastlane?
因为一行命令就可以实现编译、打包(ad-hoc&app store)、发布(蒲公英、App Store),剩下的时间你就可以愉快地喝茶看新闻了。而且配合Jenkins可以很好地实现持续集成,举个例子:在公司的Gitlab上打一个v开头的tag,就会自动编译打包新版本啦

话不多说直接进入实战环节,其他介绍可参考:blog.devzeng.com
安装fastlane:

sudo gem install fastlane

注:下文的PROJECT_DIR指的是工程根目录,eg:/Users/pan/Documents/Project/Demo/FastLaneDemo2

初始化fastlane

先创建工程或打开工程,这里以创建FastLaneDemo2为例,在Xcode创建FastLaneDemo2之后,先取消Xcode自动管理签名选项:

工程设置.png

初始化fastlane,终端运行:

fastlane init

终端: What would you like to use fastlane for?
你:选择 3. ?? Automate App Store distribution,即发布自动化,这里主要是想自动配置开发者账号
终端:Please enter your Apple ID developer credentials Apple ID Username:
你:输入自己的AppleID(开启两步验证的账号要输入验证码)
终端:Do you want fastlane to create the App ID for you on the Apple Developer Portal? (y/n)
你:输入n,不在Apple Developer创建应用
终端:Would you like fastlane to create the App on iTunes Connect for
you? (y/n)
你:输入n,不在iTunes Connect 创建应用
终端:Continue by pressing Enter ?
你:三次Enter键
执行完这几部就会发现工程根目录新增了fastlane文件夹,打开PROJECT_DIR/fastlane/Appfile 文件,会发现开发者账号配置完毕:

app_identifier("com.showu.FastlaneDemo2") # 你的应用的 bundle identifier 
apple_id("3*******5@qq.com") # 你的AppleID邮箱

itc_team_id("11*****78") # iTunes Connect Team ID
team_id("6FB****FUR") # Developer Portal Team ID

在Apple Developer和iTunesConnect创建App

PROJECT_DIR/fastlane/Fastfile 文件增加:createApp Action

    #在iTunesConnect创建App
    #如果出现The app name you entered is already being used错误请更换app_name值
    #push_notification: "on"表示App开启通知功能
    lane :createApp do
        produce(
            username: '3*******5@qq.com',
            app_identifier: 'com.showu.FastLaneDemo2',
            app_name: 'FastLaneDemo2018',
            language: 'English',
            #如果只在AppleDeveloper创建app,不在iTunesConnect创建app的话
            #skip_itc: true,
            app_version: '1.0',
            enable_services: {
                app_group: "on",
                push_notification: "on",
            }
        )
    end

这里用到了fastlane的第一个工具:produce(←push_notification等更多参数配置请戳进去查看)。作用是使用命令行在iTunes Connect和Dev Portal上创建新的iOS应用程序

终端输入

fastlane createApp

刷新Apple Developer和iTunesConnect官网,会发现新增了一个App:FastLaneDemo2018

创建、下载、安装Provisioning Profiles

PROJECT_DIR/fastlane/Fastfile 文件增加:adhoc_profile Action

    #下载provisioning_profile
    lane :adhoc_profile do
        #如果没有在Apple Developer创建证书的话,get_certificates会帮你自动创建证书
        get_certificates
        sigh(
            username: '3*******5@qq.com',
            app_identifier: 'com.showu.FastLaneDemo2',
            force: true,
            provisioning_name: 'com.showu.FastLaneDemo2_AdHoc',
            ignore_profiles_with_different_name: true,
            adhoc: true
        )
    end

终端输入

fastlane adhoc_profile

小插曲:

{"responseId"=>"2914996e-aaef-47d8-b279-f0ca557275a4", "resultCode"=>35, "resultString"=>"There were errors in the data supplied. Please correct and re-submit.", "userString"=>"There are no current IOS devices on this team matching the provided device IDs.", "creationTimestamp"=>"2018-06-04T09:11:01Z", "protocolVersion"=>"QH65B2", "userLocale"=>"en_US", "requestUrl"=>"https://developer.apple.com/services-account/QH65B2/account/ios/profile/createProvisioningProfile.action", "httpCode"=>200, "validationMessages"=>[{"validationKey"=>"deviceIds", "validationUserMessage"=>"There are no current IOS devices on this team matching the provided device IDs."}]}

原因:There are no current IOS devices on this team matching the provided device IDs.
因为用的是新的开发者账号,所以AppleDeveloper没有添加设备,所以需要添加至少一台设备才能打Ad-Hoc包
既然用了fastlane,咱就可以用命令行来做这个操作:

添加Devices到AppleDeveloper

创建一个制表符tab分隔的文件devices.txt如下:

Device ID   Device Name
6ccb3dc72b0c574fa5e****29d3cad609d3cb080    Pan
4af771e47a9067610d****846be8ea5f9bc0faa1    Yan 

注意:
要放在PROJECT_DIR路径下面,每行包含一个设备ID和一个设备名称。您可以将第一行用于标题,因为该行在分析时会被忽略。
第二行是设备ID和自定义名称,中间要加tab符号,推荐使用Sublime Text文本编辑器
打开AppleDeveloper的TXT文件,参考:help.apple.com

PROJECT_DIR/fastlane/Fastfile文件增加:add_device action

    lane :add_device do
        register_devices(
            devices_file: "./devices.txt"
        ) 
    end

终端输入

fastlane add_device

设备添加成功!

重新下载安装provisioning profile:

fastlane adhoc_profile

会发现工程根目录多了AdHoc_com.showu.FastLaneDemo2.mobileprovision文件,现在我们就可以愉快地打包了

打Ad-Hoc包

如果有多个Target,需要先设置scheme,参考:developer.apple.com
Product > Schemes > Manage Schemes, 点击 '+' 按钮, 选择自己刚才新建的target (FastLaneDemoDev),点击 'OK' 按钮,右侧的Shared选项记得勾上

PROJECT_DIR/fastlane/Fastfile文件增加:adhoc Action

    #打ad-hoc包
    lane :adhoc do
        #build_app 是gym的别名,可以换成gym
        build_app(
            scheme: "FastLaneDemoDev",
            export_method: "ad-hoc"
        )
        
    end

然后打开Xcode工程,选择合适的配置文件:


选择合格的配置,请忽略细节.png

终端输入:

fastlane adhoc 

即可在工程根目录看到生成的ipa

如果需要上传ipa到蒲公英,可先安装蒲公英的 Fastlane 插件,终端输入:

fastlane add_plugin pgyer

会在PROJECT_DIR/fastlane/新增Pluginfile文件、修改Gemfile文件
修改PROJECT_DIR/fastlane/Fastfile文件,增加如下action,增加上传到蒲公英功能,参数获取请参考:蒲公英官网

    #打ad-hoc包
    lane :adhoc do
        #build_app 是gym的别名,可以换成gym
        build_app(
            scheme: "FastLaneDemoDev",
            export_method: "ad-hoc"
        )
        #上传到蒲公英
        pgyer(api_key: "c9f01d6**************c206ea2cd", user_key: "2dfd4fc**************c7b758b1")
        # upload_to_app_store(skip_metadata: true, skip_screenshots: true)
    end

打App Store包

修改PROJECT_DIR/fastlane/Fastfile文件,增加如下action

lane :appstore_ipa do
    #下载安装provisioning profile
    sigh(
      username: '3*******3@qq.com',
      app_identifier: 'com.*****.FastlaneDemo1',
      force: true,
      provisioning_name: 'com.*****.FastlaneDemo1 AppStore',
      ignore_profiles_with_different_name: true,
    )
    gym(
      scheme: "FastlaneDemo1",
      export_method: "app-store",
      #如果用到了LLVM混淆工具的话可以指定toolchain(下面是https://github.com/HikariObfuscator/Hikari):
      #toolchain:"com.naville.hikari",
      output_name:"FastlaneDemo1_AppStore.ipa"
    )
  end

然后打开Xcode工程,在Target - General - Signing(Release) 选择合适的配置文件(同上),运行fastlane appstore_ipa即可生成ipa

上传ipa到iTunesConnect

PROJECT_DIR/fastlane/Fastfile文件新增以下Action:

    lane :upload do
        # upload_to_app_store
        # submit_for_review:上传完成后提交新版本进行审查,这里选择不,提交审核前自己检查下
        # force:跳过HTML报告文件验证
        # ignore_language_directory_validation:在元数据和screeenshot目录中发现无效语言时忽略错误
        deliver(
            submit_for_review: false,
            force: true,
            ignore_language_directory_validation:true,
            metadata_path: "./metadata"
        )
    end

这里用到了一个deliver工具,可上传二进制文件到iTunesConnect,我这里忽略了商店截图等参数的配置,直接上传二进制文件,如果不想登录iTunesConnect一个个地设置请参考(deliver章节](https://docs.fastlane.tools/actions/deliver/),这样在本地填好了txt文本就可以自动帮你填写提交审核需要的资料了
终端运行fastlane upload,几分钟后就可以在构建版本里看到了

当然,你也可以把前面的所有action实现组合一下,用一个新action代替

其他实用Action

生成不同尺寸的icon

准备一张1024*1024的图片,放到根目录,
先安装appicon插件,更多参数请参考appicon README

fastlane add_plugin appicon 

再在PROJECT_DIR/fastlane/Fastfile文件新增以下代码:

    lane :generate_icon do 
    #执行自定义脚本,比如修改启动页图片
    # sh "your_shell.sh"
    #如果支持iPad请使用[:ipad, :iphone, :ios_marketing]
    appicon(
      appicon_image_file: './AppIcon.png',
      appicon_devices: [:iphone, :ios_marketing],
      appicon_path: 'FastlaneDemo2/Assets.xcassets'
    )
  end

运行fastlane generate_icon,即可在Xcode工程生成各种尺寸的icon

更多使用指令,请去官网探索吧!

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容