一般我们可以使用Xcode来打包我们的项目,但是如果每天都需要花上20分钟来打包项目实在是很痛苦的事情,程序员是最不愿意做重复劳动的人我们都懂,所以来使用脚本帮助我们自动打包项目吧。Xcodebuild是苹果官方的项目工程编译和打包工具,使用脚本打包项目的三方工具有很多,xctool、fastlane等等,都是在Xcodebuild的基础之上封装出来的,本着一颗从底层学起的心,我选择了从Xcodebuild开始学习。
1.打开终端,cd 到项目所在的文件夹下
$ cd ~/yourProjectPath
2.clean自己的项目
$ xcodebuild -workspace ${APP_NAME}/${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration Release clean
-
-workspace
参数指定了我们所在的工作空间,使用Cocoapods的话,都会生成工作空间,有工作空间时必须明确指定 -
-scheme
该参数指定了我们要build哪个scheme,也就是我们工程目录下的Target,该参数必须明确指定 -
-configuration
该参数指定了我们build的环境配置选项,我们可以指定config为Debug、release或者其他我们自定义的Config(例如我们公司的app有appstore版和企业版,所以我们自定义了appstore、enterprise两种config,如何配置和管理多种不同的config环境请看这篇:swift 环境变量配置 使用config文件管理buildsetting)
3.build 项目
xcodebuild -workspace ${APP_NAME}/${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration Release
哈哈你没看错,看起来只是少了clean
,在不指定action的情况下,xcodebuild默认就是执行build
4.archive项目
xcodebuild -workspace ${APP_NAME}/${APP_NAME}.xcworkspace -scheme ${APP_NAME} -configuration Release -archivePath ./build/${IPANAME}.xcarchive archive
-
-archivePath
该参数指定了archive后生成的xcarchive
文件的路径和名字
5.导出IPA文件
$ -xcodebuild -exportArchive -archivePath ./build/${APP_NAME}.xcarchive -exportPath ./build -exportOptionsPlist /export_wmstest.plist
-
-exportArchive
加上该参数,就表明我们要导出ipa -
-archivePath
指定我们要用哪一个archive文件来导出ipa文件 -
-exportOptionPlist
指定包含了我们导出ipa时所需的配置选项的plist文件的路径
6.配置导出ipa所需的plist文件,plist中可用的选项如下:
-
compileBitcode : Bool
非appstore应用使用,默认是YES,
For non-App Store -
embedOnDemandResourcesAssetPacksInBundle : Bool
非appstore应用使用,默认是YES,作用看不懂
For non-App Store
exports, if the app uses On Demand Resources and this is YES, asset packs are
embedded in the app bundle so that the app can be tested without a server to host asset packs. Defaults to YES unless onDemandResourcesAssetPacksBaseURL is specified.exports, should Xcode re-compile the app from bitcode? Defaults to YES. -
iCloudContainerEnvironment
non-App Store应用,默认Development,如果使用icloud需要打开
For non-App Store exports, if the app is using CloudKit, this configures the "com.apple.developer.icloud-container-environment" entitlement. Available options: Development and Production. Defaults to Development. -
manifest : Dictionary
non-App Store应用,
For non-App Store exports, users can download your app over the web by opening your distribution manifest file in a web browser. To generate a distribution manifest, the value of this key should be a dictionary with three sub-keys: appURL, displayImageURL, fullSizeImageURL. The additional sub-key assetPackManifestURL is required when using on demand resources. -
method : String
打包方式:app-store 和enterprise常用
Describes how Xcode
should export the archive. Available options: app-store, ad-hoc, package,
enterprise, development, and developer-id. The list of options varies based on
the type of archive. Defaults to development. -
onDemandResourcesAssetPacksBaseURL : String
non-App Store应用,用来下载资源,embedOnDemandResourcesAssetPacksInBundle isn't YES时会用到
For non-App Store exports, if the app uses On Demand Resources and embedOnDemandResourcesAssetPacksInBundle isn't YES, this should be a base URL specifying where asset packs are going to be hosted. This configures the app to download asset packs from the specified URL. -
teamID : String
用来打包的temID
The Developer Portal team to use for this export. Defaults to the team used to build the archive. -
thinning : String
non-App Store应用,默认 <none> ,通用设备
For non-App Store
exports, should Xcode thin the package for one or more device variants?
Available options: <none> (Xcode produces a non-thinned universal app),
<thin-for-all-variants> (Xcode produces a universal app and all available
thinned variants), or a model identifier for a specific device (e.g.
"iPhone7,1"). Defaults to <none>. -
uploadBitcode : Bool
默认 YES
For App Store exports,
should the package include bitcode? Defaults to YES. -
uploadSymbols : Bool
默认YES
For App Store exports, should the package include symbols? Defaults to YES.
下图是题主用来打包企业版项目使用的plist文件