代碼重簽名
簽名機(jī)制
iOS簽名需要用到codesign這個(gè)命令徽级,了解這個(gè)命令的用法可以增加我們對(duì)簽名機(jī)制的了解
最簡(jiǎn)單的情況是用可簽名的證書對(duì)文件進(jìn)行簽名
codesign -s "iPhone Distribution: Xiaoxuan Chen (CXJ8TF54LW)" mix.sh
使用證書簽名可以確認(rèn)身份和代碼的完整性,但是應(yīng)用運(yùn)行還會(huì)受到其他的一些限制岖瑰,在簽名的時(shí)候可以指定應(yīng)用的權(quán)限公给。
codesign -fs "iPhone Distribution: Qinda Zhuang (287VV6UT6R)" --entitlements=/Users/wangxuefeng/Desktop/CITest/entitlements.plist Live.app
在entitlements.plist中存放了應(yīng)用的權(quán)限轻抱。
我們沒有直接創(chuàng)建entitlements.plist奕剃,但是當(dāng)我們修改應(yīng)用的權(quán)限的時(shí)候渣窜,比如開啟推送,entitlements會(huì)隨之更改敛腌。entitlements信息保存在provisioning profiles中卧土,
- codesign 通過codesign可以對(duì)OS X 和 iOS系統(tǒng)中任何可執(zhí)行二進(jìn)制文件設(shè)置簽名,設(shè)置簽名需要證書和密鑰像樊,保證文件不被篡改
- entitlements entitlements授權(quán)機(jī)制決定了哪些系統(tǒng)資源在什么情況下允許被一個(gè)應(yīng)用使用,比如可以使用推送旅敷、可以調(diào)試生棍,針對(duì)沙盒配置
- provisioning profiles 在整個(gè)代碼簽名和沙盒機(jī)制中有一個(gè)組成部分將簽名,授權(quán)和沙盒聯(lián)系了起來媳谁,那就是配置文件涂滴。
重簽名
- 準(zhǔn)備新的證書和provisioning profiles
簽名會(huì)用到證書和密鑰,授權(quán)機(jī)制會(huì)用到entitlements.plist,和證書相匹配的provisioning profiles當(dāng)然也少不了晴音。
entitlements.plist可以從provisioning profiles中導(dǎo)出柔纵,所以準(zhǔn)備一個(gè)可簽名的證書和相應(yīng)的provisioning profiles就可以。
- 刪除舊的簽名
iOS 應(yīng)用的簽名是針對(duì).app進(jìn)行的锤躁,因此簽名相關(guān)的文件都存放在.app里面搁料。
移除已有文件簽名:應(yīng)用程序的簽名都放在一個(gè)文件里面 _CodeSignatue/CodeResources,由于這個(gè)文件在簽名過程中會(huì)重新生成系羞,因此不移除也是可以的郭计。
移除provisioning profiles: provisioning profiles會(huì)被copy到應(yīng)用中,名稱為embedded.mobileprovision椒振,刪除這個(gè)文件
CFBundleIdentifier
# 修改 Plist,Plist路徑必須為絕對(duì)路徑
defaults write /Users/wangxuefeng/Desktop/ci/Live.app/info.plist "CFBundleName" "小愛Top"
defaults write /Users/wangxuefeng/Desktop/ci/Live.app/info.plist "CFBundleDisplayName" "小愛Top"
defaults write /Users/wangxuefeng/Desktop/ci/Live.app/info.plist "CFBundleIdentifier" "com.fungo.loveshowtop"
# 重簽名 iPhone Distribution: Qinda Zhuang (287VV6UT6R) 在鑰匙串中對(duì)應(yīng)的證書只有一個(gè)昭伸,否則不能這么寫
codesign -f -s "iPhone Distribution: Qinda Zhuang (287VV6UT6R)" --entitlements entitlements.plist Live.app
#驗(yàn)證簽名
codesign --verify Live.app
#獲取簽名詳情
codesign -vv -d Live.app
#獲取主機(jī)上所有可用于簽名的證書
security find-identity -v -p codesigning
#導(dǎo)出entitlements.plist
security cms -D -i Live.app/embedded.mobileprovision > t_entitlements_full.plist
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' t_entitlements_full.plist > entitlements.plist
resign.sh
workspace=~/Desktop/CITest
payloadDirectory=${workspace}/Payload
entitlementsPlistPath=${workspace}/entitlements.plist
rm -rf payloadDirectory
mkdir payloadDirectory
cp -r $1 Payload
provisioningFile=$3
appName=Live.app
appBundlePath=${payloadDirectory}/${appName}
appBundleInfoPlist=${appBundlePath}/Info.plist
appBundleProvisioningFilePath=${appBundlePath}/embedded.mobileprovision
#刪除info.plist中的CFBundleResourceSpecification這一項(xiàng)
defaults delete $appBundleInfoPlist "CFBundleResourceSpecification"
#刪除原有的embedded.mobileprovision
rm $appBundleProvisioningFilePath
#將新的embedded.mobileprovision復(fù)制到app中
cp -R "${3}" $appBundleProvisioningFilePath
#解析新的embedded.mobileprovision
security cms -D -i $appBundleProvisioningFilePath > ${workspace}/t_entitlements_full.plist
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' ${workspace}/t_entitlements_full.plist > ${entitlementsPlistPath}
#解析appID
applicationIdentifier=`defaults read ${entitlementsPlistPath} "application-identifier"`
newBundleId=${applicationIdentifier#*.}
#確保文件可執(zhí)行
bundleExecutable=`defaults read $appBundleInfoPlist "CFBundleExecutable"`
chmod 755 ${appBundlePath}/${bundleExecutable}
#改變bundleid,以.app .appex結(jié)尾的文件中的info.plist都需要修改
oldBundleId=`defaults read ${appBundleInfoPlist} "CFBundleIdentifier"`
# if $newBundleId != $oldBundleId then
echo changing Bundle id $appBundleInfoPlist $newBundleId
defaults write $appBundleInfoPlist "CFBundleIdentifier" $newBundleId
# fi
#簽名
for file in `ls $appBundlePath/Frameworks`
do
codesign -vvv -fs "$2" --no-strict --entitlements=${entitlementsPlistPath} $appBundlePath/Frameworks/$file
done
codesign -vvv -fs "$2" --no-strict --entitlements=${entitlementsPlistPath} $appBundlePath
#測(cè)試簽名結(jié)果
codesign -v $appBundlePath
調(diào)用
sh resign.sh /Users/wangxuefeng/Desktop/ci/Release-iphones/Live.app "iPhone Distribution: Qinda Zhuang (287VV6UT6R)" /Users/wangxuefeng/Library/MobileDevice/Provisioning\ Profiles/1fb19f15-021a-40ac-9f4f-d33fe1a1d138.mobileprovision