iOS分享一个ipa打包脚本

栏目: IOS · 发布时间: 5年前

内容简介:用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包安装到手机上测试了。

iOS分享一个ipa打包脚本

用Generic iOS Device来build工程

iOS分享一个ipa打包脚本 压缩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来管理的:

iOS分享一个ipa打包脚本

通过.xcworkspace来管理

iOS分享一个ipa打包脚本 项目的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项目构建成功 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

BSD Hacks

BSD Hacks

Dru Lavigne / O'Reilly Media, Inc. / 2004-05-24 / USD 24.95

If you want more than your average BSD user--you want to explore and experiment, unearth shortcuts, create useful tools, and come up with fun things to try on your own--BSD Hacks is a must-have. This ......一起来看看 《BSD Hacks》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具