# 使用xcodebuild命令打包导出

> 当前环境： Xcode10.0 Swift4.2 iOS SDK 12.1

## 开始

> 在写之前要有几个东西先确定下，几个东西。

**一，BuildConfiguration**

> 这是一个非常重要的选项，先说一个用到他的例子，一般项目都有各种环境，在同一个位置会有不同的行为，我们要怎么判断呢，Xcode 提供了一个 Project 级别的参数就是 BuildConfiguration，我们可以设置有 N 个BuildConfiguration，来在代码里面控制代码的不同行为，下面用个截图来看。 ![](https://raw.githubusercontent.com/zColdWater/Resources/master/Images/buildconfiguration.png)

当设置好了 BuildConfiguration，可以对应设置宏来进行条件编译，[如何进行设置看这篇也许对你有帮助。](http://47.99.237.180:8080/articles/2019/11/15/1573803756740.html)

**二，Target**

一个 Project 下可以创建多个 Target，比如 Xcode 默认的空模版，就会在 Project 下给你建 3 个 Target，分别是

1 个项目 Target 1 个 UnitTest 的 Target 1个 UITest 对的Target

![](https://raw.githubusercontent.com/zColdWater/Resources/master/Images/target.png)

**三，多个 Target 的作用**

因为一套 Target 对应一套配置，比如我们的项目中，有两个 Target 分别对应不同的 BundleId，这个场景下，我们就有必要用两个 Target 来区分一下。 再者说两套配置不一样，一套给生产一套给其他环境，里面包含不同的加固配置等等，都可以用多个 Target 区分。

**四，Scheme**

一个 Target 可以对应多个 Scheme，当你创建 Scheme 的时候，是可以选择你的 Target 的，当创建 Scheme 的时候还有一个选项，Shared，当你创建的 Scheme 需要其他人也能看到的时候需要打勾，如果不需要其他人看到 不需要打勾。

![](https://raw.githubusercontent.com/zColdWater/Resources/master/Images/scheme.png)

**五，关系**

> 下图是他们的 Scope 的关系图。

![](https://raw.githubusercontent.com/zColdWater/Resources/master/Images/projectrelationship.png)

从图中可以看出，1个 Project 可以配置多个 Target，1 个 Target 可以配置多个 Scheme。 BuildConfiguration 是在 Project 级别上的配置，所以他对下面所有 Target 都生效 。

**六，Archive Export 命令**

> 执行下面命令的时候 `请确保你的证书和你的ID都是正确的`。

```
# xcodebuild archive
# 先执行XcodeBuild Archive命令，生成.xcarchive文件(下图)。
xcodebuild -workspace `<Workspace名字>` -scheme `<Scheme名字>` -configuration `<BuildConfiguration名字>` -archivePath `<导出路径>` archive

# xcodebuild export
# 执行XcodeBuild Export命令，有一个选项 archivePath，将第一步生成的xcarchive文件路径输入进去，还有一个注意的是，exportOptionsPlist，这个参数文件，就是我们平时使用Xcode打包出来的文件夹里面包含的文件，表明你导出这个ipa的具体配置。
# 把之前Xcode图形化打包成功导出的ExportOptions.plist文件保存下来。
# 然后把ExportOptions.plist路径给下面的命令，就可以导出和上次一模一样的ipa包。  
# 注意:ExportOptions.plist:记录这你的导出参数，你是AppStore还是Development还是AdHoc等。
xcodebuild -exportArchive -archivePath `<Archive路径>` -exportPath `<Export路径>` -exportOptionsPlist `<ExportOptionsPlist文件路径>`
```

![](https://raw.githubusercontent.com/zColdWater/Resources/master/Images/xcarchive.png)

![](https://raw.githubusercontent.com/zColdWater/Resources/master/Images/exportoption1.png)

## 总结

1. 如果 H5 想要可以在 Safri 调试的 App 应用 ipa，那么需要导出的时候选择 Development 导出方式即可。
2. Development profile: 允许你去测试你的 App 在物理机器上，也就是真机上。
3. App Store Distribution profile:  允许你签名你的 App 到 AppStore 去发布。
4. Ad Hoc Distribution profile:  允许你去签名你的 App 去分发给内部指定人员去测试你的 App。
