我们在上传ipa想要安装的时候必须要通过plist文件去下载,并且还要遵循 itms-services协议。 
意思就是,第一步我们要生成一个plist文件, 
第二步生成一个html文件,用来指向plist文件

下面是生成plist文件

<?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/project/upload/files/20160504201048174_7836_19.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>cn.vrv.im-inhouse</string>
<key>bundle-version</key>
<string>1.0.7</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>下载</string>
<key>title</key>
<string></string>
</dict>
</dict>
</array>
</dict>
</plist>

上面重要的地方有两点

  1. url:这个参数是为了找到你自己上传的ipa文件;
  2. bundle-identifier:这个参数是开发者账号用户名,可以为空或任意,区别在于安装的过程中有无图标和进度

下面是生成html文件,通过html的方式下载这个ipa文件。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载</title>
<script type="text/javascript"> var url = 'http://127.0.0.1:80//upload/plists/20160606143426371_63551_1.plist'; window.location.href = "itms-services://?action=download-manifest&url=" + url; </script>
</head>
<body></body>
</html>

这样只要我们只要访问这个html地址,就可以自动下载ipa文件了。 
注意:访问这个html文件的时候必须是基于HTTPS的,所以这就需要有一台https服务器 
所以我们只要按照上面的格式,把plist文件,和html文件生成好,就可以安装了。

下面通过写文件的方式生成,请看代码

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/** * * @author ZSL * */
public class CreateUtil {
public static String createPlist() throws IOException{
System.out.println("==========开始创建plist文件");
//这个地址应该是创建的服务器地址,在这里用生成到本地磁盘地址
final String path = "D:/upload/plists/";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
String plistFile = "a.plist";
final String PLIST_PATH = path + plistFile;
file = new File(PLIST_PATH);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
String plist = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+ "<plist version=\"1.0\">\n" + "<dict>\n"
+ "<key>items</key>\n"
+ "<array>\n"
+ "<dict>\n"
+ "<key>assets</key>\n"
+ "<array>\n"
+ "<dict>\n"
+ "<key>kind</key>\n"
+ "<string>software-package</string>\n"
+ "<key>url</key>\n"
//你之前所上传的ipa文件路径
+ "<string>http://127.0.0.1/project/upload/files/20160504201048174_7836_19.ipa</string>\n"
+ "</dict>\n"
+ "</array>\n"
+ "<key>metadata</key>\n"
+ "<dict>\n"
+ "<key>bundle-identifier</key>\n"
//这个是开发者账号用户名,也可以为空,为空安装时看不到图标,完成之后可以看到
+ "<string>cn.vrv.im-inhouse</string>\n"
+ "<key>bundle-version</key>\n"
+ "<string>1.0.7</string>\n"
+ "<key>kind</key>\n"
+ "<string>software</string>\n"
+ "<key>subtitle</key>\n"
+ "<string>下载</string>\n"
+ "<key>title</key>\n"
+ "<string></string>\n"
+ "</dict>\n"
+ "</dict>\n"
+ "</array>\n"
+ "</dict>\n"
+ "</plist>";
try {
FileOutputStream output = new FileOutputStream(file);
OutputStreamWriter writer;
writer = new OutputStreamWriter(output, "UTF-8");
writer.write(plist);
writer.close();
output.close();
} catch (Exception e) {
System.err.println("==========创建plist文件异常:" + e.getMessage());
}
System.out.println("==========成功创建plist文件");
return PLIST_PATH;
} public static String createHtml(String plistPath) {
System.out.println("==========开始创建html文件"); //这个地址应该是生成的服务器地址,在这里用生成到本地磁盘地址
final String path = "D:/upload/htmls/";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
String plistFile = "a.plist";
final String PLIST_PATH = path + plistFile;
file = new File(PLIST_PATH);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} String html = "<!DOCTYPE html>\n"
+ "<html lang=\"en\">\n"
+ "<head>\n"
+ "<meta charset=\"UTF-8\">\n"
+ "<title>下载</title>\n"
+ "<script type=\"text/javascript\">\n"
+ "var url = '" + plistPath + "';\n"
+ "window.location.href = \"itms-services://?action=download-manifest&url=\" + url;\n"
+ "</script>\n"
+ "</head>\n"
+ "<body></body>\n"
+ "</html>"; try {
FileOutputStream output = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(output, "UTF-8");
writer.write(html);
writer.close();
output.close();
} catch (IOException e) {
System.err.println("==========创建html文件异常:" + e.getMessage());
}
System.out.print("==========成功创建html文件"); return "success";
} public static void main(String[] args) throws IOException {
String plistPath = CreateUtil.createPlist();
createHtml(plistPath);
}

直接运行main函数就可以生成这两个文件。

原文出自:http://www.voidcn.com/blog/moyanxuan_1993_2_24/article/p-6025867.html

【转】Java生成plist下载ipa文件的更多相关文章

  1. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  2. Java读取并下载网络文件

      CreateTime--2017年8月21日10:11:07 Author:Marydon import java.io.ByteArrayOutputStream; import java.io ...

  3. 108.生成和下载csv文件

    生成CSV文件 有时候我们做的网站,需要将一些数据,生成一个csv文件返回浏览器,并且是作为附件的形式下载下来. 生成小的csv文件: 生成一个小的csv文件,我们用Python内置的csv模块来处理 ...

  4. Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  5. 转帖 Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  6. (转载)Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  7. 关于自动编译iOS工程,生成app及ipa文件的方法-备

    文章地址. 1.所需语句(可直接在命令行中执行) xcodebuild -configuration Release        进入所在工程的根目录文件夹,执行上面的语句,即可开始自动使用rele ...

  8. java 生成execl下载

    /** * execl Export */ private void createExecl(HttpServletRequest request, HttpServletResponse respo ...

  9. JAVA代码实现下载单个文件,和下载打包文件

    //下载单个文件调用方法 /**     * response     * imgPath 下载图片地址    * fileName 保存下载文件名称    * @date 2015年4月14日 下午 ...

随机推荐

  1. Spring源码分析(十二)FactoryBean的使用

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 一般情况下,Spring通过反射机制利用bean的class属性指定实现 ...

  2. 关于CodePlex

    CodePlex是微软的开源工程网站,涉及诸多微软最新技术的开源工程. 网址:http://www.codeplex.com/ 应常去看看.

  3. Debian 8 时间同步

    每天执行一次 sudo ntpdate ntp.ubuntu.com 逐渐觉得麻烦了,有没有自动执行的方法? 在Linux中用户可以执行例行性的工作,使用crontab这个命令. 步骤: 1.在终端中 ...

  4. ios 开发UI篇—UITextView

    概述 UITextView可滚动的多行文本区域 UITextView支持使用自定义样式信息显示文本,并支持文本编辑.您通常使用文本视图来显示多行文本,例如在显示大型文本文档的正文时. UITextVi ...

  5. ios开发UI篇--UIButton

    概述 UIButton 是执行自定义代码以响应用户交互的控件. UIButton 其实包含 UIImageView 和 UILabel 两个控件,UIButton 继承于 UIControl,所以有  ...

  6. 【OC底层】KVO原理

    KVO的原理是什么?底层是如何实现的? KVO是Key-value observing的缩写. KVO是Objective-C是使用观察者设计模式实现的. Apple使用了isa混写(isa-swiz ...

  7. macos版本mojave 安装postgres报错

    mac os 版本mojave 安装postgres报错 事由:前几天升级mac到mojave版本也就是10.14系统,发现对于很多原系统的软件包都不兼容,安装时出现报错. 报错: pthread.h ...

  8. PHP原生开发的各大音乐平台API接口

    支持以下音乐平台 网易云音乐 QQ音乐 酷狗音乐 酷我音乐 虾米音乐 百度音乐 一听音乐 咪咕音乐 荔枝FM 蜻蜓FM 喜马拉雅FM 全民K歌 5sing原创 5sing翻唱 若是数据获取失败 方案一 ...

  9. day 84 Vue学习四之过滤器、钩子函数、路由、全家桶等

      本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤器 1 moment.js 在这里我们先介绍一个 ...

  10. elasticsearch 请求体查询方式整理

    空查询(empty search) —{}— 在功能上等价于使用 match_all 查询, 正如其名字一样,匹配所有文档: GET /_search { "query": { & ...