xcodebuild 不用多 target,打包不同 bundle identifier

xcode 8后,原来用企业证书 wildcard 打包,会因为没有 APNS 报错,所以只能指定 bundleIdentifier,但是指定之后,就不能和正常上线的 bundleIdentifier 一致了,每次打包就要重新设置一下 bundle identifier。解决方案 1、用两个 target,分开设置。2、makefile 打包的时候分别 设置 企业证书 和 上线证书。本文采用 第二种方案

一、配置参数:

version=$(shell /usr/libexec/PlistBuddy -c "print :CFBundleShortVersionString" ${infoPath})
tembundleDisplayName=$(shell /usr/libexec/PlistBuddy -c "print :CFBundleDisplayName" ${infoPath})
tembuildNumber=$(shell svn info |grep Revision)
buildNumberInfo=$(shell git log -a |wc -l | sed 's/^[ \t]*//g')
buildNumber=$(shell git log -1 --pretty=format:%h)_$(shell git log -a |wc -l | sed 's/^[ \t]*//g')
# 代码中的宏定义,定义 测试环境
serverEnvironment=BUILD_FOR_TEST

developmentTeam="NM9VP4YSNU"
productBundleIdentifier="com.***.***enterprise"
profileName=wildcard_can_push
profileID=aa64f6e9-4156-45b3-ae33-718ca2b24593
archivePath=build/DerivedData/neighborhood.xcarchive
bundleDisplayName="$(tembundleDisplayName)-e"
signKey=$(KEY_enterprise)


configWay=Adhoc

路径和文件名称 最好不要带空格,会把 shell 脚本 的参数 给 打乱。如果真有空格,就只能做转义了

# makefile 转义 infoPath 中的空格
infoPathFormat=$(subst \ ,\\ ,./neighborhood/Support Files/neighborhood-Info.plist)

二、修改 企业证书打包的 build 号,显示名称

因为用了不同的 bundle identifier,会有两个 app,为了到设备上区分出来,displayName 也设置不同的名称区分。

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $(buildNumberInfo)" "$(infoPathFormat)"
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $(bundleDisplayName)" "$(bundleDisplayName)"

key值可以把 info.plist 用文本文件打开查看。

三、打开钥匙串访问, 导入证书

security unlock-keychain "-p" 系统密码 "/Users/***/Library/Keychains/login.keychain" ; 

我用的电脑 证书都已导入钥匙串,所以不用执行导入。

四、清理项目

xcodebuild -workspace ***.xcworkspace -scheme *** -configuration Adhoc clean

五、编译

因为 PackageApplication 已经弃用,改用 xcodebuild -exportArchive ,所以 编译 也改用 archive,xcodebuild archive

1、编译 pods

xcodebuild -workspace ***.xcworkspace -scheme Pods-*** -derivedDataPath build/DerivedData OBJROOT=$(PWD)/build SYMROOT=$(PWD)/build -configuration $(configWay)

2、编译 workspace

xcodebuild -workspace ***.xcworkspace -scheme *** -configuration $(configWay) -derivedDataPath build/DerivedData -archivePath "$(archivePath)" DEVELOPMENT_TEAM="$(developmentTeam)" PRODUCT_BUNDLE_IDENTIFIER="$(productBundleIdentifier)" CODE_SIGN_IDENTITY="$(signKey)" PROVISIONING_PROFILE="$(profileID)" PROVISIONING_PROFILE_SPECIFIER="$(profileName)" IPHONEOS_DEPLOYMENT_TARGET="7.0" archive

"***" 都替换成自己的。

因为 项目本身的设置都是 上线证书,这里要全部改成和 企业证书 用的配置 一模一样,所以 添加的参数比较多,少了一个编译就过不去。

参数和 正常在 xcode -> build setting 里面会有点不一样,可以把工程用文本编辑器打开,查找对应的名称:

project.png

图种的设置 应该都可以通过 xcodebuild 来设置。
参考 苹果官方文档 buildSettings

我们需要重新设置 证书和配置文件

需要设置的项目:
DEVELOPMENT_TEAM="$(developmentTeam)" 
PRODUCT_BUNDLE_IDENTIFIER="$(productBundleIdentifier)" 
CODE_SIGN_IDENTITY="$(signKey)" 
PROVISIONING_PROFILE="$(profileID)" 
PROVISIONING_PROFILE_SPECIFIER="$(profileName)" 
IPHONEOS_DEPLOYMENT_TARGET="7.0" 

profileID 可以通过 xcode-> account 里面查看。也可以通过脚本获取

获取 profile 的 ID
#!/bin/bash
if [ $# -ne 1 ]; then
  echo "Usage: getmobileuuid the-mobileprovision-file-path"
  exit 1
fi
# mobileprovision_uuid=`grep UUID -A1 -a $1 | grep -o "[-A-Z0-9]\{36\}"`
mobileprovision_uuid=`/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i $1)`
echo "UUID is:"
echo ${mobileprovision_uuid}
添加 GCC_PREPROCESSOR_DEFINITIONS 环境变量

如果代码里面是用 宏定义来区分不同的网络 环境,比如 测试,预发,正式 环境,可以通过 传入 GCC_PREPROCESSOR_DEFINITIONS 来实现
例如代码中定义

//#define BUILD_FOR_DEVELOP
#define BUILD_FOR_TEST
//#define BUILD_FOR_PRERELEASE
//#define BUILD_FOR_RELEASE
if [ ${environment} == "test" ]; then
    serverEnvironment=BUILD_FOR_TEST
elif [[ ${environment} == "prerelease" ]]; then
    serverEnvironment=BUILD_FOR_PRERELEASE 
elif [[ ${environment} == "release" ]]; then
    serverEnvironment=BUILD_FOR_RELEASE  
elif [[ ${environment} == "develop" ]]; then
    serverEnvironment=BUILD_FOR_DEVELOP
else
    echo "未知 环境,退出"
    help_info
    exit;
fi

那么 可以再 编译的时候,带上 GCC_PREPROCESSOR_DEFINITIONS参数

GCC_PREPROCESSOR_DEFINITIONS_Adhoc=(${serverEnvironmentDefine},${configInfo},"\$(inherited)")

例如:

xcodebuild -workspace neighborhood.xcworkspace -scheme neighborhood -configuration ${configWay} -derivedDataPath build/DerivedData -archivePath "${archivePath}" DEVELOPMENT_TEAM="${developmentTeam}" PRODUCT_BUNDLE_IDENTIFIER="${productBundleIdentifier}" CODE_SIGN_IDENTITY="${signKey}" PROVISIONING_PROFILE="${profileID}" PROVISIONING_PROFILE_SPECIFIER="${profileName}" IPHONEOS_DEPLOYMENT_TARGET="7.0" archive GCC_PREPROCESSOR_DEFINITIONS=${GCC_PREPROCESSOR_DEFINITIONS_Adhoc}

但是 如果直接就写

GCC_PREPROCESSOR_DEFINITIONS='$(GCC_PREPROCESSOR_DEFINITIONS) $(serverEnvironment) $(configInfo)'

则不会生效,不知道为什么。

可以参考:https://stackoverflow.com/questions/1402641/xcode-how-to-set-debug-environment-with-multiple-xcconfig-files/7907294

六、 打包

改用 xcodebuild -exportArchive

xcodebuild -exportArchive -exportFormat IPA -archivePath "$(archivePath)" -exportPath $(out_path)/$(ddxq_ipaName) -exportProvisioningProfile "$(profileName)"

这里 需要注意,最好带上 -exportProvisioningProfile,不然虽然能打包 ipa,但是 安装不到手机上。这里 设置为 配置文件名称就好,不是profile 的 UUID。
可以参考 这里,对各字段对应哪里 描述的比较清楚。
如果 设置不对,则会报错:"no provisioning profile matches:****"

报错

1、xcodebuild error: no provisioning profile matches

xcodebuild 后面跟的 配置文件,证书,team,要全部匹配。

2、archive 报:“ archive at path '/build/.xcarchive' is malformed”

这是因为刚开始 设置了

-derivedDataPath build/DerivedData 
OBJROOT=$(PWD)/build 
SYMROOT=$(PWD)/build 

最后发现 只需要 -derivedDataPath 就够了。

3、 安装时报 “A signed resource has been added modified or deleted”

是因为 最后 export archive 的时候没有带上 -exportProvisioningProfile
参考:这里

完整脚本

传送门

参考资料:

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

推荐阅读更多精彩内容