likes
comments
collection
share

Flutter 解放双手-Shell自动化打包之IPA

作者站长头像
站长
· 阅读数 4

您能在这里看到啥

  1. 温故知新
  2. iOS打包流程
  3. iOS项目配置
  4. iOS最终打包
  5. DEMO
  6. 脚本地址

温故知新

往期文章

流程图如下所示

Flutter 解放双手-Shell自动化打包之IPA

脚本目录如下所示

Flutter 解放双手-Shell自动化打包之IPA

打包导出的文件.如下所示

Flutter 解放双手-Shell自动化打包之IPA

这些基础配置,就是打包的基石.给我们指明了道路.根据上面的流程图.shell自动化打包.总共分为四步

  • 参数配置
  • 清缓存
  • 导出文件
  • 打包

后续也会不断丰富解放双手系列.喜欢的可以点点关注.

好了,回归主题.--- Flutter 解放双手-Shell自动化打包之IPA

iOS打包流程

Flutter 解放双手-Shell自动化打包之IPA

从上面的流程图中,我们发现有一个奇怪的步骤.那就是前期配置.下面我先来讲解一下这个.

前期配置

前因

我们这里选择的打包命令,是苹果官方提供的xcodebuild.简单易上手.下面先看一下pack_ipa.sh文件,我们哪里使用了xcodebuild.使用了xcodebuild什么功能.

archive

Flutter 解放双手-Shell自动化打包之IPA

export

Flutter 解放双手-Shell自动化打包之IPA

xcodebuild exportArchive的命令中,我们得知.

最后导出ipa文件的时候,有一个特殊的参数exportOpptionsPlist.

这个参数指定导出IPA包的属性.分为developad-hocappstore三种类型.

由于我们这里xcode中签名方式是automatic,也就是登录开发者账号,让xcode自动配置证书的方式.

所以导出的exportOpptionsPlist会和手动配置证书的不一样.

如果你使用的是手动配置.不用担心.

下面我们也会讲解一下,exportOpptionsPlist怎么获取.

这里我们就简单讲一下xcodebuild的使用.

可选参数参数说明
xcodebuild type[build(编译) 、 archive(归档)、 exprotArchive(导出)]
-workspace编译工作空间名称
-scheme编译计划名称
-archivePath被指定任何创建的档案将被放置的目录,或应导出存档
-configuration为构建每一个目标使用build配置名称
-destination使用由目标说明(用逗号分隔的一系列的key =描述目的地使用值对)中描述的目的地
-exportOptionsPlist指定用于配置归档导出plist文件的路径
-exportArchive指定归档应导出

说到这里,总会算是把你引到了前期配置的主题上了.继续看看后果吧.

后果 Flutter 解放双手-Shell自动化打包之IPA

从上面的流程图.我们来一一讲解一下,exportOpptionsPlist是怎么找到的.

  1. 配置iOS项目

    • 自动配置证书 Flutter 解放双手-Shell自动化打包之IPA 如上图所示,登录自己的开发者账号即可.
    • 手动配置证书 Flutter 解放双手-Shell自动化打包之IPA 如上图所示,把选择对应描述文件即可
  2. Xcode Archive Flutter 解放双手-Shell自动化打包之IPA

  3. 手动导出IPA Flutter 解放双手-Shell自动化打包之IPA

    App Store:上传商店版本,release环境
    Ad Hoc:可以通过蒲公英下载安装的release环境,也可以收到推送
    Development: Debug环境.
    

    当然,我们也可以通过修改打包环境,让Ad Hoc环境为Debug.但是,请慎用.修改Archive环境.如下所示

    1. Edit Scheme Flutter 解放双手-Shell自动化打包之IPA
    2. Change Build Configuration Flutter 解放双手-Shell自动化打包之IPA 通过修改Archive build环境,就可以到达我们的目的,但还是那句话,请慎用.
  4. 获取ExportOptions.plist Flutter 解放双手-Shell自动化打包之IPA 这样我们就获取到ExportOptions.plist,当然如果你使用的也xcode 自动配置证书,那么你就不用重新获取ExportOptions.plist文件了,因为.我已经帮你配置好了.如下所示

    Flutter 解放双手-Shell自动化打包之IPA Flutter 解放双手-Shell自动化打包之IPA

    从上面的文件里.我们可以看出,各个环境的ExportOptions.plist,只是有一点点的差别.

    虽然我也可以通过plutil -replace命令,修改一个ExportOptions.plist文件.来达到三个ExportOptions.plist的效果.

    为了更好的区分app-stroead-hocdevelopment这三个环境,还有因为每个项目配置也不一样.各个环境可能各不相同.区分开也方便修改.

    至此.前期配置完成.这样我们就可以好好的讲一下pack_ipa.sh文件了.

pack_ipa.sh

通过我们上面的流程图.我把IPA总共分为5部分.如下所示

  1. 配置环境

    主要目的是为了配置export_options_plistbuild_typeconfiguration,判断逻辑如下所示

      # 根据上传类型,确定是上传商店版本
      if [[ $upload_type == 1 ]]; then
         export_options_plist=$export_options_plist_store
         build_type="release"
         configuration="Release"
      elif [[ $project_build_type == 1 ]]; then
         # 如果不是上商店,那就是上传蒲公英了,
         # 蒲公英是要确认打包环境
         # 这里面打包环境是release
         export_options_plist=$export_options_plist_hoc
         build_type="release"
         configuration="Release"
      else
         # 这里就是debug
         build_type="debug"
         configuration="Debug"
         export_options_plist=$export_options_plist_dev
      fi
    
    
  2. 编译iOS

    这里我们使用的还是flutter build,这个命令.当然也是可以使用xcodebuild的.如下所示

    • flutter build
      if [ -e "${project_path}"/pubspec.yaml ]; then
           echomsg "编译FLUTTER"
           ### 根据👆**配置环境**
           ### 我们获取到了打包的环境 build_type
           ### 然后执行 build 指令
           flutter build ios --$build_type
       fi
      
    • xcodebuid build
      xcodebuild \
           build -workspace "${project_workspace_path}" \
           -scheme "$project_scheme" \
           -configuration $configuration \
           -destination 'generic/platform=iOS' \
           -quiet || **exit**
      
  3. archive

      echomsg "开始archive"
      xcodebuild archive \
          -workspace "${project_workspace_path}" \
          -scheme "$project_scheme" \
          -configuration $configuration \
          -archivePath "${export_xcarchive_path}${xcarchive_name}" \
          -destination "$generic" -quiet || exit  
    
  4. exportArchive

    为了更好的完成导出,已经判断导出文件是否成功.我们需要知道导出文件的名字.

    IPA的名字,是根据info.plist文件中的CFBundleName字段,进行命名的.其格式如下 CFBundleName.ipa

    因此我们需要获取到info.plist文件,并获取到CFBundleName字段对应的名字才可以.

    所以我在exportArchive的时候,分4步来完成,如下所示:

    1. 获取info.plist

      有两个地方可以获取我们想要的info.plist

      • 工程项目中的info.plist Flutter 解放双手-Shell自动化打包之IPA
      • archive中的info.plist Flutter 解放双手-Shell自动化打包之IPA 这里我选择了archive中的info.plist,现在想想,好像把获取弄的麻烦了,直接使用项目中的info.plist文件即可.尴尬了.好了我们看一下代码吧 info_plist="$export_xcarchive_path$xcarchive_name/Products/Applications/Runner.app/Info.plist"
    2. 获取CFBundleName

       ipa_name=$(/usr/libexec/PlistBuddy -c "Print CFBundleName" "$info_plist")
      
    3. 修改export_options_plist文件中的团队ID.

      获取TeamId

      通过archive,我们在export_xcarchive_path中的info.plist文件中,找到我们想要的Team.获取代码如下

       run_plist="$export_xcarchive_path$xcarchive_name/Info.plist"
       ipa_teamID=$(/usr/libexec/PlistBuddy -c "Print ApplicationProperties:Team" "$run_plist")
      

      修改TeamId

      这样我们就获取到了TeamId,然后通过plutil命令,来修改plist文件,就拿到了完整的export_options_plist文件了,修改Team代码如下.

      plutil -replace teamID -string "$ipa_teamID" "$export_options_plist"                        
      
    4. 执行导出指令

      经过前面步骤,终于到了导出了,直接上代码

      # 导出上传商店的ipa
       xcodebuild \
           -exportArchive -archivePath "$export_xcarchive_path$xcarchive_name" \
           -exportPath "${export_ipa_path}" \
           -exportOptionsPlist "${export_options_plist}" \
           -destination "$generic" \
           -allowProvisioningUpdates -quiet || exit
      

      通过上面的步骤,如果状态是成功的.我们就能获取到IPA.到这里,我们基本上打包完成了,高不高兴,简不简单.唉,可对于我来说,也是学习了不少东西呢.下面,我们再把上传搞定就齐活了.

  5. 上传

    从上面的流程图中,上传分为商店蒲公英.下面我们来看一下吧

    商店

    上传商店,我们用的是苹果提供的xcrun altool命令.

    上传分为两种密码验证机制,一种是密钥,一种是专属密码.

    这里我们选用的专属密码方式.想要学习xcrun altool的同学,我将会在后续文章里,做详细讲解.这里我们就不再细讲.

    当然,上传主要分为两个步骤

     1. 验证app
         ```
         xcrun altool \
              --validate-app \
              -f "$export_ipa_path/$ipa_name.ipa" \
              ## 开发者账号
              -u "$xcrun_u" \
              ## 开发者专属密码
              -p "$xcrun_p" \
              ## 验证类型
              -t ios
         ```
     3. 上传app
         ```
         xcrun altool \
              --upload-app \
              -f "$export_ipa_path/$ipa_name.ipa" \
              -u "$xcrun_u" \
              -p "$xcrun_p" \
              -t ios
         ```
        > 通过上面的流程,你的**IPA**就上传到商店了,是不是很省事啊.
         
    

    蒲公英

    蒲公英相对简单一点,因为我们用的pgyer_uload.sh文件,已经封装的很好.只需要调用方法.如下所示

      echomsg "开始上传ipa到蒲公英"
      ### 调用方法需要两个参数
      ### 第一个是你蒲公英的key,
      ### 第二个就是IPA的全路径即可
      uploadPgyer "$api_key" "$export_ipa_path/$ipa_name".ipa
    

至此.Flutter 解放双手-Shell自动化打包之IPA完成.后续有什么问题,我也会持续更新.喜欢的可以点点赞,关注一下.

系列文章