加载中…
个人资料
lily4251
lily4251
  • 博客等级:
  • 博客积分:0
  • 博客访问:329,287
  • 关注人气:47
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

代码安装IPA文件(程序内安装IPA)

(2013-05-31 15:08:24)
标签:

ios

代码安装ipa

mobileinstall

私有api

分类: IOS开发相关

梦里出品

本文主要说明怎样使用代码在IOS设备上安装IPA文件。说的可能有点多,主要面对新手,大神可以略掉;

本例子在IOS6.0   iPad2IOS5.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.2IOSSDK6.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”了。

代码安装IPA文件(程序内安装IPA)

1

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

代码安装IPA文件(程序内安装IPA)

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复制到一个别的文件夹中,什么地方都可以,后面需要用到。

代码安装IPA文件(程序内安装IPA)

3

代码安装IPA文件(程序内安装IPA)

4 

代码安装IPA文件(程序内安装IPA)

5

三、APP文件加权限

为现在用的安装API系统私有API,正常编译生成的APP是没有权限访问和使用私有API的,所以需要给APP添加访问和使用私有API的权限。这时就用到刚刚上文是说到的工具“ldid”了。

使用ldid前需要先将XcodeCommand 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.xmlAPP文件一同文件夹下。

打开系统终端(命令行)工具,进入APP所在文件夹目录下,用”cd”命令,本文中是放在桌面的“test”目录中(图6)。 

代码安装IPA文件(程序内安装IPA)

6 

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

代码安装IPA文件(程序内安装IPA)

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 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有