iOS 重簽名

拾雪發表於2017-12-13

最近工作需要,做了個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 '替換完成'
複製程式碼

以上,歡迎大家交流。

相關文章