使用脚本工具Xcodebuild打包项目和导出ipa 2016.12.18

一般我们可以使用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
Paste_Image.png

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文件
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容