如何用未越狱手机安装ipa文件(更新版)

前言

之前写过一篇非越狱手机安装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 


<plist version="1.0">
<dict>
    <key>application-identifierkey>
    <string>XXX.com.peach.teststring>
    <key>com.apple.developer.team-identifierkey>
    <string>XXXstring>
    <key>get-task-allowkey>
    <false/>
    <key>keychain-access-groupskey>
    <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,mac,os,x)