ios黑科技之实现91助手的效果(app内下载并安装另一个app)
今天分享一个非常牛逼,非常装逼的黑科技--ios应用内下载并安装另一个应用,中间不需要经过appstore。
其实这个技术,就是我们实现91助手或者同步推的效果,他们也可以在他们的应用里面下载并安装其他的app。
下面教程分两步走
第一步,自动下载并安装另一个app,中间不需要经过appstore
第二步,基于第一步,实现和91助手、同步推一模一样,自己管理下载和安装(支持断点续传、下载管理器等)
不过这个技术并不可以上线appstore(91助手和同步推那些也没有上线appstore)。
除非你是像同步推类型的公司,否则这个技术只是用来装逼。
学这个技术前,首先要知道itms-services协议,这个技术是基于itms-services协议的。
itms-services:学名叫:OTA (Over The Air) 空中下载,是Apple在 iOS4 中新加的一项技术,目的是让开发者能够脱离Appstore,实现从自己的服务器下载并安装iOS应用。简单地说,就是用户只需要在Safari中点开一条链接,就能直接在主界面中安装App,不需要通过App Store。
当然,这里面还涉及到苹果签名之类的东西,大家就自行百度了,这里就不解释了。
这里的演示,我就直接通过苹果签名过的ipa进行演示,大家也可以像我这样做,就不用自己弄签名这么复杂了。
下面详细介绍怎么做
1 首先我们要获取已经签名的ipa文件,在mac里面打开itunes,点搜索,下面我搜索 git,以这个app为例,点击获取。
![](http://upload-images.jianshu.io/upload_images/1930285-afac5d6828139cf2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
2 输入你的appid 和 密码
3 下载后,在资料库里面找到 刚刚的app,右键点击 在Finder显示
![](http://upload-images.jianshu.io/upload_images/1930285-6ee52b40a882e88e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
![](http://upload-images.jianshu.io/upload_images/1930285-659f73e6968ca3ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/958/format/webp)
![](http://upload-images.jianshu.io/upload_images/1930285-d98597bd26e7259e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
4 好了,ipa下载下来了,而且这个ipa已经通过了签名(你的appid已经有这个ipa的使用权了)
5 接下来把ipa上传到 7牛里面,
![](http://upload-images.jianshu.io/upload_images/1930285-8c07f40cb1987b5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
6 然后编写plist文件
![](http://upload-images.jianshu.io/upload_images/1930285-249a9dc3f26ba2c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
<?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>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>http://xxx.xxx.com/xxxx.ipa</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>请填上你的开发者证书用户名</string> <key>bundle-version</key> <string>版本</string> <key>kind</key> <string>software</string> <key>title</key> <string>请填上标题</string> </dict> </dict> </array> </dict> </plist>
7 把plist文件上传的GitHub,然后点击GitHub的
![](http://upload-images.jianshu.io/upload_images/1930285-65316725440f4ad8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
8 最后一步,手机safari通过itms-services协议下载,在手机safari 输入
itms-services://?action=download-manifest&url=https://raw.githubusercontent.com/xxxx/xxxx.plist
url后面就是刚刚在GitHub的plist链接
下载成功。并且可以成功运行。
刚刚上面的流程是这样做
![](http://upload-images.jianshu.io/upload_images/1930285-31077c222f6f5aef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
第一步完成了,总结一下:
上面的演示简单来说,就是只要用户在appstore下载过这个app,就有这个app的使用权(签名)
我们之后进行itms-services下载的ipa文件,就可以直接使用
如果这个ipa文件我们没有使用权(没有签名)
那么这个app打开的时候就会不停的要我们输入appid和密码
就算输入对了也没有反应(以前直接是闪退,不允许使用)
原因是苹果检查到你的appid没有这个ipa的使用权(签名)。
下面开始牛逼的第二步教程:
你会发现,上面的下载是跟appstore一样的,他会在你手机的桌面直接进行下载,并且下载完之后直接进行自动安装。
但这样,我们就无法管理下载了(虽然用私用api可以查看,不过这种办法不好用)
如果我想实现像91助手那样的功能,可以用下载管理器去管理 每个ipa包的下载,可以暂停,可以继续,支持断点续传,可以控制ipa下载后是否要安装,自己可以选择ipa安装包的安装后是否删除。
那么继续往下看
在上面第六点那里,其实plist里面的ipa路径,系统是帮我自动 下载-安装,**那如果我已经下载好了呢? 是不是就不用下载,直接帮我安装呢?
没错,如果已经下载好了,那么系统会帮我们直接安装 **
![](http://upload-images.jianshu.io/upload_images/1930285-9c8daf80b869b125.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
然后我们会有个思路,能不能先把网盘的ipa下载好
然后把plist里面的url换成我们沙盒的地址呢?
然后系统检测到沙盒的ipa已经下载好了,那么就可以从沙盒直接安装。
想法是对的,不过直接换成沙盒的话,我试过,是不行的
原因是ios8开始,沙盒的地址每次都会随机生成的,而且就算写了沙盒地址,前面的协议规定一定要http
所以不可以直接写沙盒地址。
既然不允许访问沙盒,又只可以访问http,那我访问自己的ip不就可以了吗。
**没错,访问自己的ip
像这样 http://127.0.0.1/xxx.ipa **
所以我们自己在程序里面做一个虚拟http服务器,访问本机的ip就等于访问本机的沙盒。
具体流程图如下:
![](http://upload-images.jianshu.io/upload_images/1930285-dc063214987aaa7d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
好的,有了想法之后,接下来就是实现了
流程1 在源码里面有虚拟的http服务器,可以直接用
流程2 源码里面封装好,可以设置ipa路径,可以设置成你们的网盘路径
流程3 源码里面封装好,可以设置https的plist路径,可以设置成你们的路径
流程4 以下是plist文件,其中url那里改成http://127.0.0.1:10001/xxxx.ipa 注意端口要和源码里面的虚拟服务器端口一致
流程5 下载好之后会提示安装
<?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>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>http://127.0.0.1:10001/xxxx.ipa</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>com.www.m2m</string> <key>bundle-version</key> <string>4.5.6</string> <key>kind</key> <string>software</string> <key>title</key> <string>pinglide</string> </dict> </dict> </array> </dict> </plist>
下面附上我的源码,里面已经包含下载管理器和虚拟服务器等
https://github.com/lovelyjune/DownloadAndInstallIpa
源码介绍:
实现和91助手、同步推的效果
已经封装好下载管理器,可以用下载管理器去管理 每个ipa包的下载
下载可以暂停,可以继续
支持断点续传(就算退出app,下次进入app依然保持上次的断点续传)
支持后台下载(按home键出去桌面之后依然保持下载)
支持设置最大并行下载数(默认是3个同时下载)
可以控制ipa下载后是否要安装
自己可以选择ipa安装包是否删除
使用说明:
1.快速添加一个下载ipa任务
[[DownloadManager manager] addDownloadTaskWithUrl:@"http://xxxx.com/xxxx.ipa" andPlistUrl:@"https://raw.githubusercontent.com/xxxxx/xxxxx.plist" andGameName:@"xxxxx" andGameId:@"xxxxx" andType:@"ipa"];
2.下载过程中,进度的监听,我是直接返回任务数组的数据源,可以通过数组里面的OneDownloadItem 获取每个任务
[[DownloadManager manager] progressBlock:^(NSArray *allModelArr){}];
3.下载完成后的监听,返回是单个任务的完成回调
[[DownloadManager manager] completeBlock:^(OneDownloadItem *oneItem) {}];
ps:我里面的虚拟服务器端口默认设置成10001,你可以按需自定义,直接用我的源码可以下载ipa,不过你们安装不到,因为你们appid没有得到app的签名(使用权),所以记得跟着我上面第一步的教程走一下,就可以安装了
感谢第三方插件HTTPServer、MJExtension
欢迎star
原创文章,不允许转载
参考
http://www.cnblogs.com/star91/p/5018995.html
http://stephen830.iteye.com/blog/2101884
http://blog.sina.com.cn/s/blog_5f19ccb10101da5m.html
小礼物走一走,来简书关注我