梦里出品
本文主要说明怎样使用代码在IOS设备上安装IPA文件。说的可能有点多,主要面对新手,大神可以略掉;
本例子在IOS6.0
iPad2和IOS5.1.1
iPad2中测试通过;
前题:
IOS设备须越狱;
Xcode需要安装Command Line Tools;
下载ldid工具
地址:https://github.com/downloads/rpetrich/ldid/ldid.zip
一、修改Xcode中的SDKSettings.plist文件
因为要实现代码安装IPA文件,所以用Xcode编译的APP文件是不能有代码签名(Code Sign)的,需要修改SDKSettingd.plist文件。让Xcode生成的APP文件可以在没有代码签名的情况下编译成功。
找到Xcode中的SDKSettingd.plist文件,不同版本的SDKSettingd.plist文件所在的目录也不同,以Xcode4.6.2、IOSSDK6.1为例。
目录为:/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/
在这个目录下可以看到需要修改的SDKSettingd.plist文件。双击打开SDKSettingd.plist文件,在DefaultProperties的子项中可以看到一个叫“CODE_SIGNING_REQUIRED”的键,现在值为“YES”(图1),将值修改为“NO”,保存。这样就可以将工程在Xcode设置为“Don't
Code Sign”了。

图1
现在到Xcode中选中工程的xcodeproj文件(图2),选择“Build
Settings”,将“code sign
identity”全都设置为“Don't
Code Sign”。

图2
二、在工程中添加安装代码
在需要使用安装IPA代码的类中引用头文件:
#import "dlfcn.h"
在.m中加入以下代码:
typedef int
(*MobileInstallationInstall)(NSString *path, NSDictionary *dict, void *na, NSString
*path2_equal_path_maybe_no_use);
- (int)IPAInstall:(NSString *)path
{
void
*lib = dlopen("/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation",
RTLD_LAZY);
if (lib)
{
MobileInstallationInstall pMobileInstallationInstall =
(MobileInstallationInstall)dlsym(lib, "MobileInstallationInstall");
if
(pMobileInstallationInstall)
{
int ret =
pMobileInstallationInstall(path, [NSDictionary dictionaryWithObject:@"User" forKey:@"ApplicationType"], nil, path);
dlclose(lib);
return ret;
}
}
return -1;
}
在需要的时候调用IPAInstall:(NSString*)path方法,参数path为需要安装的IPA文件所在的完整目录。本例中是将需要安装的IPA放到本程序的“Document”目录下了,示例代码如下:
NSString *path
= [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
objectAtIndex:0]
stringByAppendingPathComponent:@"Test.ipa"];
[self IPAInstall:path];
这样就会调用安装方法,安装名为“Test.ipa”的文件了,但现在在真机上还不能正常运行,因为还没有给APP添加权限和把“Test.ipa”放到“Document”目录下。那怎么办?向下看,呵呵。
二、编译生成APP文件
因为需要给APP签名加权限,所以不要生成IPA文件,而是生成APP文件。等把签名与权限加好后,再手动用APP制作IPA文件。
在Xcode中选择设备(IOS Device)(图3),编译(Build)(图4)。编译完成后,在工程的Products文件夹中可以看到刚刚编译好的APP文件,右键Show in
Finder(图5),就可以在文件夹中显示。将APP复制到一个别的文件夹中,什么地方都可以,后面需要用到。

图3

图4

图5
三、给APP文件加权限
因为现在用的安装API是系统私有API,正常编译生成的APP是没有权限访问和使用私有API的,所以需要给APP添加访问和使用私有API的权限。这时就用到刚刚上文是说到的工具“ldid”了。
使用ldid前需要先将Xcode的Command
Line Tools安装好。否则会报错。ldid下载好后,将ldid文件放到/usr/bin中。
创建一个XML文件,命名为“entitlements.xml”。这个XML文件中包含安装API的权限信息,entitlements.xml的内容如下:
<?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>com.apple.private.mobileinstall.allowedSPI</key>
<array>
<string>Install</string>
<string>Browse</string>
<string>Uninstall</string>
<string>Archive</string>
<string>RemoveArchive</string>
</array>
</dict>
</plist>
这个XML文件内容中包含调用私有API和权限信息,如果需要调用别的API可以自行添加或删除信息。IOS6.0(包含6.0)以上需要权限,IOS6.0以下好像是不需要权限。保存这个XML文件到刚刚保存APP的文件夹中。直接复制本文的内容到XML文件中可能会出现格式错误,检查方法就是用浏览器(Safari)打开XML文件,如果可以正常显示,说明没有问题,如果显示错误请自行修改,直到没有问题。
确保entitlements.xml格式没有问题,entitlements.xml和APP文件一同文件夹下。
打开系统终端(命令行)工具,进入APP所在文件夹目录下,用”cd”命令,本文中是放在桌面的“test”目录中(图6)。

图6
进入后再输入命令“ldid -Sentitlements.xml
TestInsetIPA.app/TestInsetIPA”对APP进行添加权限工作(图7)。

图7
这个命令中“ldid -S” ,“ldid”与“-S”之间有一个空格。“-S”与“entitlements.xml”之间没有空格。“entitlements.xml”就是上面说到的XML文件,如果你的XML不是这个名,请将命令修改为你的XML文件名即可。
“-Sentitlements.xm”与“TestInsetIPA.app”之间有一个空格。“TestInsetIPA”是刚刚生成的APP文件,如果你的名字不一样,请修改为你的名字。“/“后面和APP的名字是一样的。
如果没有输出错误信息或是卡住(就是敲回车后没反应)就是添加权限成功了。下面就可以制作IPA文件了。
四、制作IPA文件
新建一个文件夹,命名为“Payload”。将刚刚添加好权限的APP文件放到这个文件夹中。右键“压缩Payload”,得到一个“.zip”文件,将这个ZIP文件的后缀名改为“.ipa”。好了,IPA文件就制作完成了,是不是太简单了。没想到吧。
五、安装测试
安装IPA文件就不用说了吧,越狱后很多工具都可以直接安装IPA文件。安装好后不要急着运行,因为“Test.ipa”文件(就是需要用代码安装的IPA文件)还没有放到“Document”目录中呢。怎么放?一样越狱后很多工具都可以打开IOS设备中的文件目录,找到刚刚安装好的APP应用目录,将“Test.ipa”放到APP应用目录中的“Document”目录中就行了,好了大功告成,现在运行APP吧。如果成功就成功了,如果没成功,就看看是不是人品出问题了。
六、说明
本文整合了网络中的资源,与本人实际测试。感谢网络中的大神们,我也学到很多东西,也借鉴了网络中大神的经验。再次感谢(包括但不限于):
Yonsm
xzstar
since2006 记忆碎片
Nate
等等还有不知道名字的
本文中借鉴过的网址(排名不分先后):
http://www.iloss.me/2012/03/27/原创分析-ios系统中中已安装程序mobileinstallation方式/
http://blog.csdn.net/itjobtxq/article/details/7996189
http://www.yonsm.net/post/553
http://stackoverflow.com/questions/14871748/how-do-i-change-my-applications-entitlements-to-com-apple-backboard-client
http://stackoverflow.com/questions/13817569/how-to-programatically-install-a-ipa-file-in-ios-6/15062538#15062538
http://since2006.com/blog/240/ios6-mobileinstallationinstall
http://hi.baidu.com/prognostic/item/831b622202b2dd0f72863e9c
http://www.vsyo.com/a/t/89895554d4043c5a
http://mobile.dotblogs.com.tw/cmd4shell/archive/2013/03/26/98967.aspx
加载中,请稍候......