iOS 重签名

572 阅读1分钟

最近工作需要,做了个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 '替换完成'

以上,欢迎大家交流。