ios證書自動導入,修改

命令行導入mobileprovision描述文件

        在mac中,描述文件存放的位置在~/Library/MobileDevice/Provisioning\ Profiles/。開發ios時,雙擊mobileprovision文件能夠導入。過程其實很簡單,先將mobileprovision文件重命名,在將重命名後的文件其複製~/Library/MobileDevice/Provisioning\ Profiles/目錄下。要用命令實現這個過程的話,難點在於,這個重命名的名字,這個名字能夠在mobileprovision文件中找到,用vim或emacs打開,找到UUID,其對應的value就是重命名須要的名字。ios

讀取mobileprovision文件

        爲了從mobileprovision文件讀取咱們想要的信息,須要先對其進行處理,這裏是將其轉換成plist文件,在用/usr/libexec/PlistBuddy讀取,固然,直接用文本讀取,也是能夠的。git

      將mobileprovision文件中不是亂碼的部分提取出來,保存爲plist文件,用命令security能夠實現:github

security cms -D -i provisionfile > plistfile

        再用PlistBuddy能夠讀取UUID,也就是導入描述文件須要的文件名,以及修改pbxproj文件時須要的,包括debug_uuid和release_uuidshell

/usr/libexec/PlistBuddy -c 'Print UUID'

        還能夠從mobileprovision文件讀取CODE_SIGN_IDENTITY的值,替換證書的時候須要。須要處理DeveloperCertificates對應的一大段字符串。vim

 identity_str=`/usr/libexec/PlistBuddy -c 'Print DeveloperCertificates:0' plistfile | openssl x509 -subject -inform der | head -n 1`

            證書字符串值能夠用一下命令拿到
xcode

`echo "${identity_str}" | cut -d "/" -f3 | cut -d "=" -f2`


 修改pbxproj文件

        修改描述文件,須要在pbxproj文件中用上面獲得的UUID替換PROVISIONING_PROFILE和"PROVISIONING_PROFILE[sdk=iphoneos*]"對應的值 ;修改證書須要用上面獲得的證書字符串替換CODE_SIGN_IDENTITY和 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" 對應的值。這裏因爲要區分Debug和Release,全局替換可能會出問題。個人作法是這樣的:iphone

        先搜索出"/* Debug */ = {"和"/* Release */ = {",將其對應的UUID(前面數字字符串組成的字符串),存放在array_uuid_values,其對應的行號存放在array_uuid_lines中,array_uuid_lines是排好順序了的。(這裏用shell處理字符串的時候,可能遇到如下字符轉義的問題,我是先將這些特殊的字符去掉了,再處理的):ide

test=`echo "${uuid_dr_str//[\*, ,\n,\/,=]}"`

        array_uuid_values是爲了判斷其對應的是Debug仍是Release.遍歷array_uuid_values,取當前的uuid,並用PlistBuddy取出其對應的name值(Debug或者Release):ui

        這裏爲了方便讀取,先用plutil命令將pbxproj轉成plist文件spa

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。

相關文章
相關標籤/搜索