跳转至

多环境支持

搭建多环境支持,优化开发流程

基于同一套源代码自动构建出有差异功能的app。

支持多个团队并行开发。

分离测试和生产环境。

Xcode 构建基础概念

一般在构建一个 iOS App 的时候,需要用到 Xcode Project,Xcode Target,Build Settings,Build Configuration 和 Xcode Scheme 等构建配置。

xcconfig

创建Configurations目录,创建xcconfig文件

主工程创建Configuration Setting File文件,xcconfing是控制build setting的。

编译需要配置:

PROJECT->Info->Configurations->Debug和Release->每一个target对应一个xcconfig文件

只能配置一个config文件,如果有其它的config文件需要include。

配置了xcconfig,要在对应的build setting中对应设置的值给删除,改为设置$(inherited)继承。

多个target

动态库或iWarch的应用的BundleID必须要跟主应用程序的bundleid一致,比如你的应用的id是com.mycop.hello,那么内嵌的id必须是com.mycop.hello.xxx

Xcode Project

Xcode Project用于组织源代码文件和资源文件。一个 Project 可以包含多个 Target,当新建一个 Xcode Project 的时候,会自动生成 App 的主 Target,Unit Test Target 和 UI Test Target。

使用Build Configuration 和 Xcode Scheme来管理多环境

在构建过程中使用Xcode Scheme选择不同的Build Configuration

Xcode Scheme

Xcode Scheme用于定义一个完整的构建过程,包括指定哪些 Target 需要进行构建,构建过程中使用了哪个 Build Configuration ,以及需要执行哪些测试案例等等。在项目新建的时候只有一个 Scheme,但可以为同一个项目建立多个 Scheme。不过这么多 Scheme 中,同一时刻只能有一个 Scheme 生效。

环境变量

OBJC_PRINT_LOAD_METHODS:哪些类实现了load方法。

fastlane自动化打包

  • 安装 Xcode command line tools:xcode-select --install
  • 安装fastlane:sudo gem install fastlane
  • cd工程所在目录,执行fastlane init
  • 选择2打包testfilght。
  • 登录开发者账号、用户和访问、密钥,App Store Connect API,获取Issuer ID、密钥id,下载密钥p8文件、拷贝到fastlane文件夹。

fastlane [lane_name]

执行:fastlane [lane_name]或者bundle exec fastlane [lane_name]

Gym常用配置项:

Name Type Description Default
scheme string 指定需要编译的scheme
clean bool 是否在编译前clean false
output_directory string 导出目录 ./
output_name string 导出ipa名字 [app_name].ipa
export_options hash/string 这里指定Xcode API的外部配置文件地址,或者配置hash,见下文
export_method string 打包方式,可选项app-store ad-hoc package``enterprise``development``developer-id 如果在fastlane中使用了sigh,这个值会从上下文获取
include_bitcode bool 是否开启bitcode Xcode API 默认值为true
include_symbols bool 是否生成符号表 Xcode API 默认值为true

Xcode API允许我们指定一个plist文件作为额外的配置文件。gym默认会帮你创建这个文件,你可以直接指定配置。更多关于plist可配置项,执行xcodebuild -help查看Available keys for -exportOptionsPlist

export_methodinclude_symbols,和include_bitcode 这些参数都是exportOptionsPlist的配置,对应methoduploadSymbolsuploadBitcode

Gym可以指定配置文件Gymfile

初始化:

gym init

Fastfile

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do

  desc "Push a new beta build to TestFlight"
  lane :beta do
    increment_build_number(xcodeproj: "SCM.xcodeproj")
    # gym(
    #   # 每次打包之前clean一下
    #   clean: true,
    #   workspace: "SCM.xcworkspace",
    #   scheme: "SCM",
    #   output_directory: './fastlane/release',
    #   output_name: 'SCM.ipa',
    #   configuration: 'Release',
    #   include_bitcode: true,
    #   include_symbols: true,
    #   # app-store, validation, ad-hoc, package, enterprise, development, developer-id and mac-application
    #   export_method: 'app-store',
    #   export_xcargs: '-allowProvisioningUpdates'
    # )

    build_app(
      # 每次打包之前clean一下
      clean: true,
      workspace: "SCM.xcworkspace",
      scheme: "SCM",
      output_directory: './fastlane/release',
      output_name: 'SCM.ipa',
      configuration: 'Release',
      include_bitcode: false,
      include_symbols: true,
      # app-store, validation, ad-hoc, package, enterprise, development, developer-id and mac-application
      export_method: 'app-store',
      export_xcargs: '-allowProvisioningUpdates'
    )

    # mac上的通知弹窗,通知打包完毕
    notification(app_icon: './fastlane/icon.png', title: '打包成功', subtitle: '打包成功,已导出安装包', message: '准备发布中……')

    # 上传到testflight
    # upload_to_testflight和(之间不要有空格
    # upload_to_testflight(
    #     # 上边设置的授权信息
    #     api_key: get_app_store_connect_api_key,
    #     skip_waiting_for_build_processing: true,
    #     # 打包好要上传的文件
    #     ipa: './fastlane/release/SCM.ipa',
    #     skip_submission: true
    # )

    upload_to_app_store(
      # 上边设置的授权信息
      api_key: get_app_store_connect_api_key,
      # 打包好要上传的文件
      ipa: './fastlane/release/SCM.ipa',
      app_identifier: "com.ningmengyun.SCMTest",
      # skip_waiting_for_build_processing: true,
      # skip_submission: true,
      skip_metadata: true,
      skip_screenshots: true,
      precheck_include_in_app_purchases: false,
    )

    # 通知上传成功
    notification(app_icon:"icon.png",title:"上传成功",subtitle: "IPA上传成功", message: "自动打包完成!")
  end

  # 配置上传到App Store connect的api_key
  # 通过这种设置可以绕过二次认证等验证操作,实现一键打包上传
  desc 'Get App Store Connect API key'
  private_lane :get_app_store_connect_api_key do
    # The key needs to have App Manager role, see https://github.com/fastlane/fastlane/issues/17066
    key_content = ENV["APP_STORE_CONNECT_API_CONTENT"]  # Make sure setting this environment variable before call this lane.
    api_key = app_store_connect_api_key(
      # 通过苹果申请的key id,申请同时会生成issuer_id和一个.p8授权文件,就是以下参数,文件只能下载一次,注意保存,申请方式https://appleid.apple.com/account/manage中的专用密钥
      key_id: '9B6ASXN3GN',
      issuer_id: '69a6de8f-0a10-47e3-e053-5b8c7c11a4d1',
      # 授权文件路径
      key_filepath: './fastlane/AuthKey_9B6ASXN3GN.p8',
      # key_content: "-----BEGIN EC PRIVATE KEY-----\n" + key_content + "\n-----END EC PRIVATE KEY-----",
      duration: 1200,
      in_house: false
    )
    api_key 
  end

end

Appfile

app_identifier("com.ningmengyun.SCMTest") # The bundle identifier of your app
apple_id("zirongzhang@yuncaishui.com") # Your Apple Developer Portal username

# itc_team_id("118426720") # App Store Connect Team ID
team_id("FHBV35YZLP") # Developer Portal Team ID

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile