需要的文件:
appName.ipa: 要重簽名的ipa
embedded.mobileprovision: 用來簽名的provision文件
entitlements.plist: 授權(quán)機制
distributionName: 指該簽名對應的證書的名字,在keychain中可以找到對應證書的名稱
步驟:
步驟一:將ipa包、mobileprovision文件、plist文件、iOSCodeSign.rb放在同一目錄下。
步驟二:更改entitlements.plist文件,其中application-identifier中的BundleID必須是用來簽名的證書下的BundleID,不然會出現(xiàn)安裝ipa包不成功。
步驟三:更改iOSCodeSign.rb腳本,第一部分的內(nèi)容需要填寫,IPA為ipa包的名字,PROVISION為mobileprovision文件的名字,PLIST文件必須命名為entitlements.plist,KEY為證書名字,BUNDLEID為BundleID,如果不修改則不填。
步驟四:運行腳本 ruby iOSCodeSign.rb。
iOSCodeSign.rb
=begin
需要的文件:
appName.ipa: 要重簽名的ipa
embedded.mobileprovision: 用來簽名的provision文件
entitlements.plist: 授權(quán)機制
distributionName: 指該簽名對應的證書的名字,在keychain中可以找到對應證書的名稱
步驟:
步驟一:將ipa包、mobileprovision文件、plist文件、iOSCodeSign.rb放在同一目錄下。
步驟二:更改entitlements.plist文件,其中application-identifier中的BundleID必須是用來簽名的證書下的BundleID,不然會出現(xiàn)安裝ipa包不成功。
步驟三:更改iOSCodeSign.rb腳本,第一部分的內(nèi)容需要填寫,IPA為ipa包的名字,PROVISION為mobileprovision文件的名字,PLIST文件必須命名為entitlements.plist,KEY為證書名字,BUNDLEID為BundleID,如果不修改則不填。
步驟四:運行腳本 ruby iOSCodeSign.rb。
=end
# 需要填寫
IPA = "example.ipa" # 用來重簽名的ipa包
PROVISION = "example.mobileprovision" # 用來重簽名的provision,可自定義命名
PLIST = "entitlements.plist" # entitlements文件,必須命名為entitlements.plist
KEY = "" # 用來重簽名的證書,在鑰匙串可以獲得
BUNDLEID = "" # BundleID,如果不需要改BundleID則不填
@ipa = Dir.pwd + "/" + IPA
@provision = Dir.pwd + "/" + PROVISION
@plist = Dir.pwd + "/" + PLIST
@payLoad = Dir.pwd + "/" + "Payload"
# 解壓ipa包
def unzipIPA
if Dir.exist? @payLoad
`rm -rf #{@payLoad}` # 刪除非空的文件夾
end
`unzip #{@ipa}`
end
# 修改BundleID
def changeBundleID
if BUNDLEID.length > 0 # 需要修改BundleID
appName = getAppName
infoPlist = "#{@payLoad}/#{appName}/Info.plist"
if File.exist? infoPlist # 可以更改BundleID
`/usr/libexec/PlistBuddy -c 'Set :CFBundleIdentifier #{BUNDLEID}' #{infoPlist}`
else
puts "Info.plist文件不存在"
end
end
end
# 更換證書
def changeProvision
oldProvision = @provision
newProvision = "#{@payLoad}/#{getAppName}/embedded.mobileprovision"
`cp #{oldProvision} #{newProvision}`
end
# 重簽名
def reSign
reSignFrameWork
reSignApp
end
# 對framework重簽名
def reSignFrameWork
frameworks = "#{@payLoad}/#{getAppName}/Frameworks"
if Dir.exist? frameworks
Dir.foreach frameworks do |framework|
if framework.end_with? ".framework"
`codesign -fs "#{KEY}" --no-strict --entitlements #{@plist} #{frameworks}/#{framework}`
end
end
end
end
# 對app重簽名
def reSignApp
`codesign -fs "#{KEY}" --no-strict --entitlements #{@plist} #{@payLoad}/#{getAppName}`
end
# 打包
def zipIPA
newAppName = getAppName.gsub(".app", "") + "_resign.ipa"
`zip -r #{newAppName} Payload`
end
# 獲取appName
def getAppName
appName = ""
Dir.foreach @payLoad do |file|
if file.end_with? "app"
appName = file
break
end
end
appName
end
# 程序開始
if File.exist? @ipa
if File.exist? @provision
if File.exist? @plist
if KEY.length > 0
unzipIPA
changeBundleID
changeProvision
reSign
zipIPA
else
puts "證書為空"
end
else
puts "entitlements.plist文件不存在"
end
else
puts "provision文件不存在"
end
else
puts "ipa包不存在"
end