最近工作需要,做了個iOS重簽名的指令碼,中間有些坑,記錄下來。順便練習下ruby。
總的來說 iOS的重簽名比較簡單 分為以下幾步:
1.解壓ipa包,得到PayLoad資料夾
2.刪除PayLoad資料夾中_CodeSignature資料夾,替換新的 embedded.mobileprovision以及你所需要的資原始檔
3.獲取 entitlements.plist 資訊,生成 entitlements.plist
4.重新codesign
5.壓縮PayLoad檔案 重新生成ipa包
詳細的說明看這位大神講解的很詳細了:(http://www.jianshu.com/p/bdbac933c1be)
一定要注意的是:entitlements.plist。 不然重簽名之後的包會驗證不成功。
下面是ruby程式碼:
if ARGV.size < 1
puts 'warning!!! need one params!'
exit(0)
end
appPath = ARGV[0]
codeSignName = 'iPhone Distribution: xxxxx' #這裡替換成你自己的證書
#step1 unzip ipa
appName = File.basename(appPath)
appPath = appPath.gsub(appName, '')
cmdStr = 'cd ' + appPath
cmdStr += ' && unzip ' + appName
system cmdStr
#step2 cp & delete resource
cmdStr += ' && cp embedded.mobileprovision Payload/*.app/embedded.mobileprovision'
cmdStr += ' && rm -rf Payload/*.app/_CodeSignature/'
system cmdStr
#step3 get & create entitlements.plist
temp = `codesign -d --entitlements - Payload/*.app`
tempStr = temp.to_s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8') #UTF8 的原因必須要強轉一下
tempArr = tempStr.split("<?xml")
tempStr = '<?xml' + tempArr[1] #這裡是為了去除 <?xml 之前的神奇亂碼
filePath = appPath + 'entitlements.plist'
File.open(filePath, 'w+') do |aFile|
aFile.puts tempStr.chomp
end
#step4 codesign
cmdStr = 'codesign -f -s "' + codeSignName + '" --entitlements entitlements.plist Payload/*.app'
system cmdStr
#step5 zip & rename payLoad
cmdStr = 'rm ' + appName
cmdStr += ' && zip -r ' + appName + ' Payload/'
cmdStr += ' && rm -rf Payload/'
cmdStr += ' && rm entitlements.plist'
system cmdStr
puts '替換完成'
複製程式碼
以上,歡迎大家交流。