移动测试基础 如何通过 shell 脚本快速实现 ipa 证书替换

vigossjjj · 2015年06月15日 · 最后由 jack 回复于 2017年01月17日 · 2537 次阅读
本帖已被设为精华帖!

在自动化测试过程当中,我们可以通过脚本快速实现 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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 14 条回复 时间 点赞

哈哈 厉害 赞个

吐槽一下函数命名,小驼峰 + 下划线,好混乱

#2 楼 @wenchao 混搭风格~哥们你 out 了 哈哈

@vigossjjj 有一键重签名的自动化脚本么

#4 楼 @a00ium 这个就是啊?不明白你指的是怎样的重签名?脚本我都贴出来了,有什么想法可以自己修改自己开发

6楼 已删除

大神就是不一样,紧随大神脚本走。。。
在 Xcode 的 build 中描述文件可以省略构建成功,通过什么命令可以将 .app 文件安装到手机上呢?

#7 楼 @jindejava ideviceinstaller

不错,受教了。

#8 楼 @vigossjjj .app & .ipa 用这命令都可以成功;谢谢!O(∩_∩) O~,之前用 instruments 命令走了点弯路

#8 楼 @vigossjjj 只是更换歌签名就行了吧 设备一定要是加入到开发者设备列表中的么?

release 证书可以被开发证书重签。 已验证。

另外推荐下 https://github.com/maciekish/iReSign 这个工具。

为什么替换证书后安装 ipa 的时候 提示 WARNING: could not locate iTunesMetadata.plist in archive!
WARNING: could not locate Payload/.DS_StoreInfo.plist in archive! 然后就跳出来了啊
@vigossjjj

.app 这个地址是要自己 APP 所在的位置吗?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册