前言
之前写过一篇非越狱手机安装ipa包的方法,然而现在已经不能用了,不仅会报警告“–resource-rules has been deprecated in Mac OS X >= 10.10”,而且苹果在iOS8.1.3系统以后加强了对ipa安装包签名的验证,主要区别在于ipa唯一标识在原有Bundle Identifier的基础上增加了证书ID,也就说安装包和手机上已安装APP的Bundle Identifier即使一致,如果两者签名的证书ID不相同,那么安装包也无法正常安装
原理
其实安装ipa最核心的在于签名,因为iOS上的app运行前系统都会对其进行签名校验,来保证是否被篡改或者合法,证书过期或者无效时,点击app图标会直接闪退。主要分为三类,一种是个人/团队开发者证书签名,另一种是企业证书签名,比如各种xxx助手之类的,主要区别在于企业开发者不能通过appstore途径发app,但是可以直接无上限的分发app(in-house 发布),个人开发者可以通过Appstore发布,同时有一些别的特权。还有一类是教育帐号本文不做阐述。
步骤
我假定你已经是一名iOS开发者,并且加入了苹果开发者计划,电脑已经装了开发证书和发布证书。
进入Member Center,建立一个新的App ID,并创建一个新的Provisioning Profiles
解压你需要重签名的ipa包(友情提示,去xxx助手找有很多哦),删除包内的_CodeSignature目录
下载之前新建的Provisioning Profiles,重命名为embedded.mobileprovision替换ipa包内的同名文件
修改info.plist中的包名(经实测不是必须)
创建entitlements.plist,这是一个授权文件,其授权机制决定了哪些系统资源在什么情况下允许被一个应用使用。简单的说它就是一个沙盒的配置列表,上面列出了哪些行为被允许,哪些会被拒绝。很可能你已经猜到授权机制也是按照 plist 文件格式来列出的。Xcode 会将这个文件作为 –entitlements 参数的内容传给codesign,在 Xcode 的 Capabilities 选项卡下选择一些选项之后,Xcode 就会生成这样一段 XML。 Xcode 会自动生成一个.entitlements 文件。此处我们的entitlements.plist文件如下,identifier需要和Provisioning Profiles里的一致,比如我的Provisioning Profiles用的是通配符com.peach.*,另外XXX是发布证书的id,可以参考mac上的keychain,或者用下面的命令查看
#查看本机安装的证书
security find-identity -v -p codesigning
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>XXX.com.peach.test</string>
<key>com.apple.developer.team-identifier</key>
<string>XXX</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>XXX.*</string>
</array>
</dict>
</plist>
- 签名
/usr/bin/codesign -f -s "iPhone Distribution: xxxxxxx" --entitlements entitlements.plist Payload/xxx.app
- 签名完成后您可以进行验证
#查看签名信息
/usr/bin/codesign -vv -d Payload/xxx.app
#验证签名是否成功,无返回表示成功
/usr/bin/codesign --verify Payload/xxx.app
- 重新压缩成zip并将后缀改为ipa
zip -r xxxNew.ipa Payload/
注意:ipa文件,entitlements.plist,最好放在同目录下
自动化
有了上面的步骤,自然就可以做成一个工具/脚本方便下次使用,把以下脚本的路径和证书名称改成自己对应的即可~~~
#!/bin/sh
#把你的所有需要的文件都放到path目录下,见下面的path的定义。比如我的是/Users/peach/Downloads
#并且entitlements.plist,embedded.mobileprovision,ipa都需要在同一文件夹
if ! ([ -f "$1" ]); then
echo \"${1}\"文件不存在
exit
fi
ipaName=${1%.ipa}
if [ "$ipaName" = "$1" ]; then
echo \"${1}\"不是ipa文件
exit
fi
path="/Users/peach/Downloads"
## step 1, unzip ipa file
unzip ${path}/${ipaName}.ipa
## step 2, remove old codesign
rm -rf ${path}/Payload/*.app/_CodeSignature/
## step 3, copy new provision profile
cp ${path}/embedded.mobileprovision ${path}/Payload/*.app/
## step 4, codesign with new certificate and provision
/usr/bin/codesign -f -s "iPhone Distribution: XXXX" --entitlements entitlements.plist ${path}/Payload/*.app
## if code sign error, will to here
## step 5, zip it
cd ${path}
zip -r ${ipaName}New.ipa Payload/
rm -rf ${path}/Payload/
总结
有了上面的方法和脚本,就可以在非越狱手机安装几乎任意ipa包(说的不好听就是安装盗版和破解软件),当然有一种app是装不了,就是app内部做了安全校验,发现证书被篡改或者非法直接退出程序,不过那个是app内部代码的流程,也无可奈何了。工具/脚本永远是把双刃剑,用的好会带来效率提升和极大的方便,用的不好那么就呵呵了~~~
本文详细介绍了如何在未越狱的iOS设备上安装IPA文件,包括理解安装原理、步骤以及如何自动化这一过程。核心在于利用开发者证书进行重签名,以绕过系统签名验证。虽然此方法可安装大多数IPA,但对于内部有安全校验的APP则无法安装。
3561

被折叠的 条评论
为什么被折叠?



