内容简介:用Generic iOS Device来build工程
写在前面
之前写了一个很简单的ipa打包脚本,主要是用Xcode命令中的xcodebuild和xcrun命令来完成的,其中打包ipa的命令用了PackageApplication,本来用的好好的,升级了Xcode9之后,发现苹果把PackageApplication这个东西给删了,于是脚本就跪了。。。
所以,这两个月我用了一个很原始的方法来打ipa包。大家也可以试试(大家常用的直接用Xcode中的Product->Archive的方法我就懒得说了,大家都懂):
1.自己在Xcode配置好项目的签名
2.用Generic iOS Device来build工程
3.找到生成的.app包,然后新建一个名为Payload的文件夹,将.app包放到文件夹里面
4.压缩Payload文件夹,然后将压缩包的后缀从.zip改成.ipa。
然后就可以将ipa包安装到手机上测试了。
用Generic iOS Device来build工程
压缩Payload文件夹,然后将压缩包的后缀从.zip改成.ipa
为什么需要一个ipa打包脚本
嗯,因为想偷懒。
直接在Xcode上点击Product->Archive->此处省略n步选择.......这种方式确实是挺方便的,估计很多人也是这么干的。但是,当你多次打包了之后你就发现,打包这事好无聊。每次都是同样的配置,同样的操作步骤,同样的选择,这么简单的操作我居然要重复N遍。。。而且有时候要等很久才能进行下一步。总之我觉得这种方式操作多了很是蛋疼。
我一直秉承一个理念: 能用机器自动解决的问题尽量不用人工操作 。
要是有一个东西,只要我配置好了一次之后,以后直接双击就能直接打包,是不是比之前的方式更好?
嗯,有挺多这种 工具 的,比如shenzhen,fastlane等等。
不过我是自己写了一个简单的 shell 脚本来实现功能的,比较简单,而且不会对项目有侵入性。借此还可以顺便学习下shell脚本使用。
自动打包脚本如何使用?
脚本的github地址为: https://github.com/shixueqian/AutoPackageScript
使用方法:
-
1.将脚本复制到工程的根目录
-
2.用代码编辑软件(比如Xcode)打开脚本,然后根据情况修改脚本内的一些参数
-
3.打开终端,输入
sh ${打包脚本的全路径}
就可执行打包脚本。比如我的项目工程在
/Users/mac/Desktop/AutoPackageScriptDemo
,那么我的脚本路径应该是
/Users/mac/Desktop/AutoPackageScriptDemo/AutoPackageScript.sh
,所以我要执行的命令是
sh /Users/mac/Desktop/AutoPackageScriptDemo/AutoPackageScript.sh
sh ${打包脚本的全路径}
这行命令的作用是执行shell打包脚本。
除了这样执行,我们还可以直接双击脚本文件就执行脚本,不过在这之前我们需要进行一些设置。
首先,将AutoPackageScript.sh文件的扩展名去掉,变成AutoPackageScript
然后,打开终端,执行命令 chmod +x ${打包脚本的全路径}
,这样可以给脚本加上可执行权限,并且默认的打开方式是终端。
chmod +x /Users/mac/Desktop/AutoPackageScriptDemo/AutoPackageScript
以后,直接鼠标双击就可以执行脚本了
脚本参数配置
看了脚本的使用,其中有一个很关键的东西,脚本参数配置。我对多种情况都有适配,所以脚本参数会稍微有点复杂,以下我们慢慢道来。
项目的工程结构
我也不知道怎么称呼这个东西,简单来讲就是你的工程里面是不是使用xcworkspace(工作空间)来管理你的工程。
我们在Xcode直接新建一个iOS工程,这个时候仅仅只有一个.xcodeproj文件,是没有.xcworkspace文件的。
而很多的项目都采用了cocoapods来管理项目,这个时候是有.xcworkspace文件的,cocoapods通过xcworkspace来管理了第三方库。
这两种结构的参数配置是不一样的。(因为写脚本的时候有区别)
# 是否编译工作空间 (例:若是用Cocopods管理的.xcworkspace项目,赋值true;用Xcode默认创建的.xcodeproj,赋值false) is_workspace="false" # .xcworkspace的名字,如果is_workspace为true,则必须填。否则可不填 workspace_name="" # .xcodeproj的名字,如果is_workspace为false,则必须填。否则可不填 project_name="AutoPackageScriptDemo" # 指定项目的scheme名称(也就是工程的target名称),必填 scheme_name="AutoPackageScriptDemo"
注释其实已经写得很清楚了。举个例子,github上的workspace_demo是通过.xcworkspace来管理的:
通过.xcworkspace来管理
项目的scheme_name为AutoPackageScriptDemo
所以这几个参数就是
is_workspace="true" workspace_name="AutoPackageScriptDemo" project_name="" scheme_name="AutoPackageScriptDemo"
否则,像github上面的project_demo里面的单工程结构就是
is_workspace="false" workspace_name="" project_name="AutoPackageScriptDemo" scheme_name="AutoPackageScriptDemo"
method,打包的方式。
证书签名的方式,是通过脚本中的method变量控制的。
分别为 development, ad-hoc, app-store, enterprise 。看到这几个参数估计都明白了吧?还不是不太了解的话建议看下 蒲公英的这篇文档
# method,打包的方式。方式分别为 development, ad-hoc, app-store, enterprise 。必填 method="development"
profile文件的管理方式
一般来说,证书管理方式,如今应该挺多人使用Xcode自动管理的。省心而且方便(老实说,由于工作原因,我平常比较少用自动管理,都是手动管理的,所以理解有误的话请提出)。
在Xcode->Preferrence->Account里面添加开发者账号,然后在工程的General->勾选Automatically manage signing->选择开发者账号。就可以自动管理了。
另外一种就是古老的手动管理方式了。
在开发者后台上面创建BundleID,然后创建mobileprovision文件,安装到Xcode上面选择使用。
针对这两种方式有不同的配置。
# 下面两个参数只是在手动指定Pofile文件的时候用到,如果使用Xcode自动管理Profile,直接留空就好 # (跟method对应的)mobileprovision文件名,需要先双击安装.mobileprovision文件.手动管理Profile时必填 mobileprovision_name="" # 项目的bundleID,手动管理Profile时必填 bundle_identifier=""
注释讲得很清楚,使用Xcode自动管理profile的话直接留空就好了。
如果使用手动管理的话就需要填写对应的参数了。
源码解析
脚本代码其实很简单的。主要讲解一下关键代码。
先把源码放出来:
#!/bin/sh # 使用方法: # step1: 将该脚本放在工程的根目录下(跟.xcworkspace文件or .xcodeproj文件同目录) # step2: 根据情况修改下面的参数 # step3: 打开终端,执行脚本。(输入sh ,然后将脚本文件拉到终端,会生成文件路径,然后enter就可) # =============项目自定义部分(自定义好下列参数后再执行该脚本)=================== # # 是否编译工作空间 (例:若是用Cocopods管理的.xcworkspace项目,赋值true;用Xcode默认创建的.xcodeproj,赋值false) is_workspace="false" # .xcworkspace的名字,如果is_workspace为true,则必须填。否则可不填 workspace_name="" # .xcodeproj的名字,如果is_workspace为false,则必须填。否则可不填 project_name="AutoPackageScriptDemo" # 指定项目的scheme名称(也就是工程的target名称),必填 scheme_name="AutoPackageScriptDemo" # 指定要打包编译的方式 : Release,Debug。一般用Release。必填 build_configuration="Release" # method,打包的方式。方式分别为 development, ad-hoc, app-store, enterprise 。必填 method="development" # 下面两个参数只是在手动指定Pofile文件的时候用到,如果使用Xcode自动管理Profile,直接留空就好 # (跟method对应的)mobileprovision文件名,需要先双击安装.mobileprovision文件.手动管理Profile时必填 mobileprovision_name="" # 项目的bundleID,手动管理Profile时必填 bundle_identifier="" echo "--------------------脚本配置参数检查--------------------" echo "\033[33;1mis_workspace=${is_workspace} " echo "workspace_name=${workspace_name}" echo "project_name=${project_name}" echo "scheme_name=${scheme_name}" echo "build_configuration=${build_configuration}" echo "bundle_identifier=${bundle_identifier}" echo "method=${method}" echo "mobileprovision_name=${mobileprovision_name} \033[0m" # =======================脚本的一些固定参数定义(无特殊情况不用修改)====================== # # 获取当前脚本所在目录 script_dir="$( cd "$( dirname "$0" )" && pwd )" # 工程根目录 project_dir=$script_dir # 时间 DATE=`date '+%Y%m%d_%H%M%S'` # 指定输出导出文件夹路径 export_path="$project_dir/Package/$scheme_name-$DATE" # 指定输出归档文件路径 export_archive_path="$export_path/$scheme_name.xcarchive" # 指定输出ipa文件夹路径 export_ipa_path="$export_path" # 指定输出ipa名称 ipa_name="${scheme_name}_${DATE}" # 指定导出ipa包需要用到的plist配置文件的路径 export_options_plist_path="$project_dir/ExportOptions.plist" echo "--------------------脚本固定参数检查--------------------" echo "\033[33;1mproject_dir=${project_dir}" echo "DATE=${DATE}" echo "export_path=${export_path}" echo "export_archive_path=${export_archive_path}" echo "export_ipa_path=${export_ipa_path}" echo "export_options_plist_path=${export_options_plist_path}" echo "ipa_name=${ipa_name} \033[0m" # =======================自动打包部分(无特殊情况不用修改)====================== # echo "------------------------------------------------------" echo "\033[32m开始构建项目 \033[0m" # 进入项目工程目录 cd ${project_dir} # 指定输出文件目录不存在则创建 if [ -d "$export_path" ] ; then echo $export_path else mkdir -pv $export_path fi # 判断编译的项目类型是workspace还是project if $is_workspace ; then # 编译前清理工程 xcodebuild clean -workspace ${workspace_name}.xcworkspace \ -scheme ${scheme_name} \ -configuration ${build_configuration} xcodebuild archive -workspace ${workspace_name}.xcworkspace \ -scheme ${scheme_name} \ -configuration ${build_configuration} \ -archivePath ${export_archive_path} else # 编译前清理工程 xcodebuild clean -project ${project_name}.xcodeproj \ -scheme ${scheme_name} \ -configuration ${build_configuration} xcodebuild archive -project ${project_name}.xcodeproj \ -scheme ${scheme_name} \ -configuration ${build_configuration} \ -archivePath ${export_archive_path} fi # 检查是否构建成功 # xcarchive 实际是一个文件夹不是一个文件所以使用 -d 判断 if [ -d "$export_archive_path" ] ; then echo "\033[32;1m项目构建成功
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS —— 两套自动打包脚本
- iOS自动打包并发布脚本
- iOS定制化的自动打包脚本
- 使用 Fastlane 实现 iOS 跟 Android 自动打包脚本
- 后台管理系统 icec v1.1 发布,完善打包部署脚本
- 【Flutter】如何写一个Flutter自动打包成iOS代码模块的脚本
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Inside Larry's and Sergey's Brain
Richard Brandt / Portfolio / 17 Sep 2009 / USD 24.95
You’ve used their products. You’ve heard about their skyrocketing wealth and “don’t be evil” business motto. But how much do you really know about Google’s founders, Larry Page and Sergey Brin? Inside......一起来看看 《Inside Larry's and Sergey's Brain》 这本书的介绍吧!