在自动化测试过程当中,我们可以通过脚本快速实现 DEV 证书替换 (除 Release 外基本都可通过这个方式进行证书替换),而省去 Xcode-build Xcode-run 各种煎熬的编译等待。
笔者实现这个过程也是因为在 CI 过程当中被自动化的逼迫~脚本其实是基于codesign
,细心的同学会注意到 Xcode 编译时的 shell output 在最后会自动调用这个命令codesign
也就是给我们的 app 签署配置的证书。
下面已贴出脚本,主要介绍 5 个参数:
1. ORIGINAL_FILE="$1" 待签名的ipa包
2. CERTIFICATE="$2" 证书名称
3. MOBILEPROVISION="$3" 对应的描述文件
4. BUNDLE_ID="$4" app的BundleID, 如果你的描述文件允许你修改任意BundleID那么可以任意填写,否则就老老实实的把原BundleID写上吧
5. PASSWD="$5" 当前用户所对于的密码
# !/bin/bash
#
# Sample:
# sh resign.sh adhoc6.0.8\ 80000.ipa "iPhone Developer: wuxian autotest (xxoo)" Dev_xxoo_iphone.mobileprovision "com.xxoo.iphone" "58"
#
ORIGINAL_FILE="$1"
CERTIFICATE="$2"
MOBILEPROVISION="$3"
BUNDLE_ID="$4"
PASSWD="$5"
function unzip_IPA()
{
ipa="$ORIGINAL_FILE"
unzip -o "$ipa"
}
function create_EntitlementsPlist()
{
/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i ${MOBILEPROVISION}) > entitlements.plist
SN_CODE=$(/usr/libexec/PlistBuddy -c "Print :com.apple.developer.team-identifier" entitlements.plist)
/usr/libexec/PlistBuddy -c "Set :application-identifier ${SN_CODE}.${BUNDLE_ID}" entitlements.plist
}
function set_BundleID()
{
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_ID" Payload/*.app/Info.plist
}
function del_OldCodeSign()
{
rm -r Payload/*.app/_CodeSignature/
}
function copy_EmbeddedProvision()
{
cp $MOBILEPROVISION Payload/*.app/embedded.mobileprovision
}
function reSign()
{
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/
}
function rezip_IPA()
{
original_IPA=`basename "$ORIGINAL_FILE"`
re_IPA=`echo ${original_IPA/.ipa/-resigned.ipa}`
zip -qr "$re_IPA" Payload/
}
security unlock-keychain -p "$PASSWD" ~/Library/Keychains/login.keychain
unzip_IPA
create_EntitlementsPlist
set_BundleID
del_OldCodeSign
copy_EmbeddedProvision
reSign
rezip_IPA