在mac中,描述文件存放的位置在~/Library/MobileDevice/Provisioning\ Profiles/。开发ios时,双击mobileprovision文件可以导入。过程其实很简单,先将mobileprovision文件重命名,在将重命名后的文件其复制~/Library/MobileDevice/Provisioning\ Profiles/目录下。要用命令实现这个过程的话,难点在于,这个重命名的名字,这个名字可以在mobileprovision文件中找到,用vim或emacs打开,找到UUID,其对应的value就是重命名需要的名字。
为了从mobileprovision文件读取我们想要的信息,需要先对其进行处理,这里是将其转换成plist文件,在用/usr/libexec/PlistBuddy读取,当然,直接用文本读取,也是可以的。
将mobileprovision文件中不是乱码的部分提取出来,保存为plist文件,用命令security可以实现:
security cms -D -i provisionfile > plistfile
再用PlistBuddy可以读取UUID,也就是导入描述文件需要的文件名,以及修改pbxproj文件时需要的,包括debug_uuid和release_uuid
/usr/libexec/PlistBuddy -c 'Print UUID'
还可以从mobileprovision文件读取CODE_SIGN_IDENTITY的值,替换证书的时候需要。需要处理DeveloperCertificates对应的一大段字符串。
identity_str=`/usr/libexec/PlistBuddy -c 'Print DeveloperCertificates:0' plistfile | openssl x509 -subject -inform der | head -n 1`
证书字符串值可以用一下命令拿到
`echo "${identity_str}" | cut -d "/" -f3 | cut -d "=" -f2`
修改描述文件,需要在pbxproj文件中用上面得到的UUID替换PROVISIONING_PROFILE和"PROVISIONING_PROFILE[sdk=iphoneos*]"对应的值 ;修改证书需要用上面得到的证书字符串替换CODE_SIGN_IDENTITY和 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" 对应的值。这里由于要区分Debug和Release,全局替换可能会出问题。我的做法是这样的:
先搜索出"/* Debug */ = {"和"/* Release */ = {",将其对应的UUID(前面数字字符串组成的字符串),存放在array_uuid_values,其对应的行号存放在array_uuid_lines中,array_uuid_lines是排好顺序了的。(这里用shell处理字符串的时候,可能遇到以下字符转义的问题,我是先将这些特殊的字符去掉了,再处理的):
test=`echo "${uuid_dr_str//[\*, ,\n,\/,=]}"`
array_uuid_values是为了判断其对应的是Debug还是Release.遍历array_uuid_values,取当前的uuid,并用PlistBuddy取出其对应的name值(Debug或者Release):
这里为了方便读取,先用plutil命令将pbxproj转成plist文件
plutil -convert xml1 ${PATH_PBXPROJ} -o ${PROJECT_PLIST}
再用PlistBudy读取:
`/usr/libexec/PlistBuddy -c "Print objects:${uuid_value}:name" ${PROJECT_PLIST}`
根据取出的name值可以选择要替换的值是debug_uuid或release_uuid,然后从array_uuid_lines取出对应的line值,接着是替换,替换规则是这样的从line行开始给替换,这样做是为了保证只被有效替换一次,
替换证书如下:
sed -i "" -E "${array_uuid_lines[$[tag_index]]},\$s/CODE_SIGN_IDENTITY = \"[^\"]*\"/CODE_SIGN_IDENTITY = \"${IDENTITY_DEBUG}\"/g" ${PATH_PBXPROJ}
sed -i "" -E "${array_uuid_lines[$[tag_index]]},\$s/\"CODE_SIGN_IDENTITY\[sdk=iphoneos\*\]\" = \"[^\"]*\"/\"CODE_SIGN_IDENTITY\[sdk=iphoneos\*\]\" = \"${IDENTITY_DEBUG}\"/g" ${PATH_PBXPROJ}
替换的思路:从project.pbxproj中读出/* Debug */ = {,/* Release */ = { 所在行的内容和行号,并对行号排序(需要区分是Debug/Release),并获取对应的UUID,用plutil命令将project.pbxproj转化成plist格式,根据UUID读出对应的CODE_SIGN_IDENTITY值,并在project.pbxproj修改,为了防止每个值只有一次有效的修改,替换的时候每次替换从对应的行号到文本结束。
代码下载地址:http://download.csdn.net/detail/ttt307307/8877787
在网上看到有用Ruby和Python写的库,可以编辑pbxproj文件,https://github.com/cocoapods/xcodeproj
还有xUnique,mergepbx。