美文网首页
iOS使用fastlane一键打包、提交应用

iOS使用fastlane一键打包、提交应用

作者: _小沫 | 来源:发表于2021-03-10 10:22 被阅读0次

    当开发的应用越来越多,或者应用提交的频率越来越高,就会体会到打包、提交这些重复的工作是多么枯燥且无聊还耗时;那么自然就会考虑让机器帮我们完成这一系列的工作,fastlane无疑是这样一个理想好用的工具;

    fastlane初始化

    • 安装正确的Ruby版本,需要2.0及以上版本
    ruby -v
    
    • 安装fastlane
    sudo gem install fastlane
    

    或者

    brew install fastlane
    
    • 初始化配置
      cd到项目路径下,执行命令
    fastlane init
    
    1. 首先会提示让你选择fastlane用途,因为需要提交App Store这里选择3
    2. 输入Apple ID和密码及验证码
    3. 选择是否下载metadata(如果App Store上对应的Apple ID已经有相应的App,则会自动下载所有的app数据)
    init metadata

    metadata数据包括App的预览/截屏图片,图片比较多比较大时可能只能下载到部分图片;
    这时可以执行以下命令单独下载图片:

    fastlane deliver download_screenshots
    

    如果在下载图片这步报错,需要添加--use_live_version

    • fastlane结构
      初始化成功后,项目下会多出一个fastlane的文件,所有数据、配置均在这个目录下;
    fastlane

    如果fastlane目录下的文件缺少Deliverfilemetadata,可能是在fastlane init的第一步选错了选项;可以执行以下命令重新生成:

    fastlane deliver init
    

    fastlane配置

    • Appfile
      这个文件主要配置、app和apple id相关信息;包括app_identifier,apple id,team id;这个一般会根据你初始化填的Apple ID自动生成;
    • Deliverfile
      这个文件就是配置App提交审核的相关信息;有两种方式:
      1. 使用metadata
        所有数据都会直接metadata文件下自动读取,这种方式Deliverfile配置比较简单:
     # The Deliverfile allows you to store various App Store Connect metadata
    # For more information, check out the docs
    # https://docs.fastlane.tools/actions/deliver/
    
    metadata_path "./fastlane/metadata" # 根据你自己的metadata路径配置
    force true              # Skip verification of HTML preview file
    submit_for_review false     # 提交审核
    automatic_release false     # 自动发布
    #auto_release_date          # 自动发布时间
    skip_screenshots false      # 是否不更新预览图
    overwrite_screenshots true  # 是否清空之前的预览图再添加
    skip_binary_upload false        # 是否不上传ipa
    
    1. 编写脚本
      不使用metadata,相关信息直接编写对应的命令;这些命令和apple developer网站添加提交信息都是一一对应的,可以把它看成通过接口的形式添加应用信息;
      具体的命令可以参考官网,说明的比较详细了;
      贴一个比较详细的配置:
    # The Deliverfile allows you to store various App Store Connect metadata
    # For more information, check out the docs
    # https://docs.fastlane.tools/actions/deliver/
    
    #metadata_path "./fastlane/metadata"
    #skip_metadata true     # 是否使用metadata
    #screenshots_path "./fastlane/screenshots"
    
    force true              # Skip verification of HTML preview file
    submit_for_review false     # 提交审核
    automatic_release false     # 自动发布
    #auto_release_date          # 自动发布时间
    skip_screenshots false      # 是否不更新预览图
    overwrite_screenshots true  # 是否清空之前的预览图再添加
    skip_binary_upload false        # 是否不上传ipa
    
    primary_category 'BUSINESS' # 分类
    
    copyright("@#{Time.now.year} xx版权所有 翻版必究") # 版权信息
    
    keywords({              # 关键字
      "en-US" => "english is poor",
      "zh-Hans" => "关键词1,关键词2"
    })
    
    support_url({           # 技术支持网站
      "en-US" => "https://xxx.com",
      "zh-Hans" => "https://xxxx.com"
    })
    
    submission_information({        # 使用广告的情况
        add_id_info_uses_idfa: true,
        add_id_info_serves_ads: false,
        add_id_info_tracks_install: false,
        add_id_info_tracks_action: false,
        add_id_info_limits_tracking: false
    })
    
    app_review_information(     # 审核信息
      first_name: "xx",
      last_name: "xx",
      phone_number: "+8618xxxxxxxx",
      email_address: "xx@xx.com",
      demo_user: "xxxxxxx",
      demo_password: "1234567",
      notes: ""
    )
    
    app_review_attachment_file "./fastlane/fastSign.MP4"   # 附件信息
    
    
    
    app_version '5.7.8' 
    #build_number '5.7.8'
    
    name({                  # app名称
      "en-US" => "english is poor",
      "zh-Hans" => "应用名称"
    })
    
    privacy_url({           # 隐私政策url
      "en-US" => "https://xx.xx.com/xxx",
      "zh-Hans" => "https://xx.xx.com/xxx"
    })
    
    release_notes({         # 版本新增内容
      "en-US" => "english is poor",
      "zh-Hans" => "1) 升级测试第一行\n2) 升级测试第二行"
    })
    
    description({           # 描述
      "en-US" => "english is poor",
      "zh-Hans" => "应用描述。。。。
    "
    })
    
    

    需要注意的是,一些信息比如privacy_url,release_notes是区分地区的,配置时需要编写两套:en-USzh-Hans否则执行会报错;

    • Fastfile
      这个文件就是配置我们需要执行的脚本;
      在对 Fastfile 进行配置前,我们先了解下几个概念;
      1. lane
        lane可以理解为 fastlane 的执行脚本,一个Fastfile 里可以编写任意个lane,每个lane都可以独立运行,也可以嵌套运行。
      2. fastlane actions
        actions相当于就是对一些脚本的封装,为了方便我们使用,fastlane定义了很多actions供我们使用,可以像函数调用一样实现不同的功能;同时我们也可以自定义actions;
        官方定义好的actions:https://docs.fastlane.tools/actions/,常用的actions有:gym,deliver,cocoapods

    应用打包到提交App Store审核的Fastfile大致如下:

    # Uncomment the line if you want fastlane to automatically update itself
    # update_fastlane
    
    default_platform(:iOS)
    
    platform :iOS do
      desc "sumbmit"        # lane描述
      lane :upload_app do
        # 打包
        gym(
            scheme: "your scheme",
            workspace: "your.xcworkspace",
            include_bitcode: false
         )
    
         # 发布
         deliver
      end
    end
    

    运行

    所有都配置好后,cd到项目路径执行需要的lane

    fastlane upload_app
    

    之后命令行就会输出相应的日志;
    deliver阶段,如果Deliverfile配置缺少,命名行都会有错误日志:

    根据对应的提示补充即可;
    需要注意的是,上传元数据时,App Store要求使用专用密码;否则将会报错

    专用密码可以在apple accout页面设置

    Multi-Target打包、发布

    以上对单个应用的配置相对比较简单,但当需要提交多个应用,比如一个project中有多个target时,该怎么办呢;无需为每个target配置一份脚本,fastlane提供了Environment Variables,也就是环境变量;可以通过配置不同的环境变量实现Multi-Target打包、发布;
    具体步骤:

    • 新建Environment文件
      fastlane的Environment文件为.env文件,fastlane初始化后,默认不会有.env配置文件,需要手动添加文件;
      cd到fastlane文件目录下,为每个target创建.env文件
      touch .env.targetA
      touch .env.targetB
      

    .开头的文件为隐藏文件,添加后显示隐藏文件即可看到添加的.env文件;

    • 配置不同的环境变量
      根据自己的业务需求,归纳出变量并为每个target的.env文件配置;

    .env.targetA

    APP_IDENTIFIER = "com.xxx.targeta"
    
    SCHEME = "targetA"
    
    SCREENSHOTS_PATH = "./fastlane/targeta/screenshots"
    
    APP_REVIEW_ATTACHMENT_FILE = "./fastlane/targeta/fastSign.MP4"
    
    APP_VERSION = "5.0.0"
    
    APP_NAME = "第一个APP"
    
    DESCRIPTION = "第一个APP的描述"
    

    .env.targetB也是一样的配置、只是value更换为自己需要的;

    • 使用环境变量
      环境变量在Appfile、Deliverfile、Deliverfile等文件中均可使用;使用语法:
    ENV['变量KEY']
    

    Appfile

    app_identifier(ENV['APP_IDENTIFIER']) 
    

    Deliverfile

    app_version ENV['APP_VERSION']  
    #build_number ENV['APP_VERSION']
    
    name({                  # app名称
      "en-US" => "english is poor",
      "zh-Hans" => ENV['APP_NAME']
    })
    
    description({               # 描述
      "en-US" => "english is poor",
      "zh-Hans" => ENV['DESCRIPTION']
    })
    
    
    • 执行
      执行时需要指定对应的环境变量
    fastlane upload_app --env targetA
    
    • lane嵌套
      之前介绍lane时说过每个lane都可以独立运行,也可以嵌套运行,对于需要一键打包提交多个target的,我们就可以编写嵌套的lane:

    Fastfile

    default_platform(:iOS)
     
    platform :iOS do
    
    desc "sumbmit_all"
    lane :upload_all do
       sh "fastlane upload_app --env targetA"
       sh "fastlane upload_app --env targetB"
     end
    
    desc "sumbmit"
    lane :upload_app do
      gym(
          scheme: ENV[' SCHEME'],
          workspace: "app.xcworkspace",
          include_bitcode: false
       )
    
      deliver
    end
    
    end
    
    
    • 批量打包、提交
    fastlane upload_all
    

    如果一切正常的话,应用就已经自动提交审核了;本来繁琐的事情最后转换为fastlane upload_all一句命令搞定,省时省力还能愉快的摸鱼


    AppleID登录有效期为1个月,超过一个月后连接App Store时会提示输入6 digit码;如果输入后不能正常登录;
    需要执行命令:

    bundle exec fastlane spaceauth
    

    重新验证、获取session;

    相关文章

      网友评论

          本文标题:iOS使用fastlane一键打包、提交应用

          本文链接:https://www.haomeiwen.com/subject/hjfbqltx.html