在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manifest.xml,只要能够从IPA文件中提取出来Info.plist,然后在进行解析提起相关信息,那就马到成功了。那么,按照上面步骤开始了。

1、Java解压IPA文件,只获取 Info.plist

/**

* 解压IPA文件,只获取IPA文件的Info.plist文件存储指定位置

* @param file

* zip文件

* @param unzipDirectory

* 解压到的目录

* @throws Exception

*/

private static File getZipInfo(File file, String unzipDirectory)

throws Exception {

// 定义输入输出流对象

InputStream input = null;

OutputStream output = null;

File result = null;

File unzipFile = null;

ZipFile zipFile = null;

try {

// 创建zip文件对象

zipFile = new ZipFile(file);

// 创建本zip文件解压目录

String name = file.getName().substring(0,file.getName().lastIndexOf("."));

unzipFile = new File(unzipDirectory + "/" + name);

if (unzipFile.exists()){

unzipFile.delete();

}

unzipFile.mkdir();

// 得到zip文件条目枚举对象

Enumeration zipEnum = zipFile.getEntries();

// 定义对象

ZipEntry entry = null;

String entryName = null;

String names[] = null;

int length;

// 循环读取条目

while (zipEnum.hasMoreElements()) {

// 得到当前条目

entry = zipEnum.nextElement();

entryName = new String(entry.getName());

// 用/分隔条目名称

names = entryName.split("\\/");

length = names.length;

for (int v = 0; v

if(entryName.endsWith(".app/Info.plist")){ // 为Info.plist文件,则输出到文件

input = zipFile.getInputStream(entry);

result = new File(unzipFile.getAbsolutePath()+ "/Info.plist");

output = new FileOutputStream(result);

byte[] buffer = new byte[1024 * 8];

int readLen = 0;

while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1){

output.write(buffer, 0, readLen);

}

break;

}

}

}

} catch (Exception ex) {

ex.printStackTrace();

} finally {

if (input != null)

input.close();

if (output != null) {

output.flush();

output.close();

}

// 必须关流,否则文件无法删除

if(zipFile != null){

zipFile.close();

}

}

// 如果有必要删除多余的文件

if(file.exists()){

file.delete();

}

return result;

}

/**

* IPA文件的拷贝,把一个IPA文件复制为Zip文件,同时返回Info.plist文件

* 参数 oldfile 为 IPA文件

*/

private static File getIpaInfo(File oldfile) throws IOException {

try{

int byteread = 0;

String filename = oldfile.getAbsolutePath().replaceAll(".ipa", ".zip");

File newfile = new File(filename);

if (oldfile.exists()){

// 创建一个Zip文件

InputStream inStream = new FileInputStream(oldfile);

FileOutputStream fs = new FileOutputStream(newfile);

byte[] buffer = new byte[1444];

while ((byteread = inStream.read(buffer)) != -1){

fs.write(buffer,0,byteread);

}

if(inStream != null){

inStream.close();

}

if(fs != null){

fs.close();

}

// 解析Zip文件

return unzip(newfile, newfile.getParent());

}

}catch(Exception e){

e.printStackTrace();

}

return null;

}

2、Java读取Info.plist文件,获取需要的信息

/**

* 通过IPA文件获取Info信息

* 这个方法可以重构,原因是指获取了部分重要信息,如果想要获取全部,那么应该返回一个Map

* 对于plist文件中的数组信息应该序列化存储在Map中,那么只需要第三发jar提供的NSArray可以做到!

*/

public static Map getIpaInfoMap(File ipa) throws Exception{

Map map = new HashMap();

File file = getIpaInfo(ipa);

// 第三方jar包提供

NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(file);

// 应用包名

NSString parameters = (NSString) rootDict.objectForKey("CFBundleIdentifier");

map.put("CFBundleIdentifier", parameters.toString());

// 应用名称

parameters = (NSString) rootDict.objectForKey("CFBundleName");

map.put("CFBundleName", parameters.toString());

// 应用版本

parameters = (NSString) rootDict.objectForKey("CFBundleVersion");

map.put("CFBundleVersion", parameters.toString());

// 应用展示的名称

parameters = (NSString) rootDict.objectForKey("CFBundleDisplayName");

map.put("CFBundleDisplayName", parameters.toString());

// 应用所需IOS最低版本

parameters = (NSString) rootDict.objectForKey("MinimumOSVersion");

map.put("MinimumOSVersion", parameters.toString());

// 如果有必要,应该删除解压的结果文件

file.delete();

file.getParentFile().delete();

return map;

}

3、程序测试

public static void main(String[] args) throws Exception {

File file = new File("d:/UniAccess.ipa");

Map map = getIpaInfoMap(file);

for(String key : map.keySet()){

System.out.println(key+" : "+map.get(key));

}

}

4、测试结果

CFBundleIdentifier : com.qihoo.installSafety

CFBundleDisplayName : 360手机卫士

CFBundleName : 360MobileSafe

CFBundleVersion : 4.2.0.2

MinimumOSVersion : 5.0

5、相关jar包,以及IPA文件,可以到如下指定地址下载

1)http://download.csdn.net/detail/wp562846864/8474481

2)http://m1.app111.org/2014/09/19/20140919142959.ipa

ipa java_Java 解析 IPA 文件,读取 Info.plist 信息相关推荐

  1. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

  2. 安装rpm包命令_编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出...

    不常用R的朋友,可能并不能意识到好的编辑模板带来的长期效率提高和代码重用性,非计算机专业科研人员且需要使用R语言,此文会对您有帮助. 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与 ...

  3. osgEarth的Rex引擎原理分析(七十三)从高程文件读取的高程信息如何填充rex的高程瓦片

    目标:(七十二)中的问题147 高程文件的划分规则和rex瓦片是不一样的,高程文件的0级就是文件本身,不管文件实际范围多大,然后采用二分法逐级增加.rex瓦片的0级对应整个地球表面. 两个范围一般不是 ...

  4. java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区

    在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manife ...

  5. 苹果iOS开发 解析描述文件 读取mobileprovisioning profile

    如果想使用命令行自动打包ios,就需要从描述文件中获取到相关信息,本文介绍如何解析描述文件. 工具使用Mac OS自带的命令: plistBuddy="/usr/libexec/PlistB ...

  6. pcap java_java解析Pcap文件获取五元组(可执行)

    [实例简介] java解析Pcap文件获取五元组(可运行) [实例截图] [核心代码] PcapTestZ └── PcapTestZ └── PcapTestZ ├── 111.206.37.193 ...

  7. 计算三角形面积 java_java 三角形面积计算(文件读取)

    [实例简介] [实例截图] [核心代码] /*课堂实践3-2(个人作业 , 总分 100) 作业描述 计算三角形面积: 一.定义一个三角形类: 1.成员变量:三个边长 2.成员方法:求面积 二.定义测 ...

  8. JAVA通过Hutool解析CSV文件【导入即用,无需封装】

    JAVA通过Hutool解析CSV文件 ​ Java解析CSV方式有很多种方式[javaCSV(未更新),openCSV(apache)],这篇文章主要是用到Hutool工具类,能快速的解析读取,不需 ...

  9. CSS-T | Mysql Client 任意文件读取攻击链拓展

    作者:LoRexxar@知道创宇404实验室 & Dawu@知道创宇404实验室 原文地址:https://paper.seebug.org/1112/#_6 英文版本:https://pap ...

  10. springboot解析txt文件顺便加到数据库中(nohup文件)

    大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是:2022年4月20日13:33:23 以前是怎么都没想到,我需要在服务器的nohup文件中找记录,然后往数据库里面更新.具体因为啥不提 ...

最新文章

  1. JavaScript中正则表达式学习(一)
  2. myeclipse10.7安装git插件
  3. Tkinter的Radiobutton组件
  4. python读取只读word只读_Python用于NLP :处理文本和PDF文件
  5. php 生成ai文件,php_Generator php 生成器
  6. linux模拟题,Linux操作系统模拟题.doc
  7. w3cSchool jquery学习
  8. 计算机网络网络层之路由算法
  9. Python + selenium之组织unittest单元测试用例
  10. as ssd中文版测试软件,AS SSD Benchmark
  11. 中职微型计算机说课,微型计算机原理说课.ppt
  12. 【python数据结构】多维数组
  13. 有电脑病毒就会有杀毒软件!李开复和MIT彭特兰这样看AI挑战
  14. 【RK3399】[Android 6.0] linux4.4 调试8723BU记录过程
  15. Python:后缀为whl的文件是什么?如何安装whl文件?
  16. 拼多多的店铺怎样引流和出价-纽黑文教学
  17. 美版iPhone 4s未激活解决方案
  18. windows xp下载python3.5.8_Python3.5中文版下载
  19. (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
  20. Python还原CryptoJs_DES_CBC模式_js逆向学习

热门文章

  1. 找1到n中缺失的数字(长度为n-1的整形数组,数字的范围在1到n,找其中一个缺失的数字)
  2. ( 转)关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
  3. 【C++】针对char 字符类型cout的三种输出情况(++ch 和 ch+1 和 ch++)难点加重点
  4. Matlab根据excel数据画图
  5. Dubbo 使用 kryo 序列化
  6. BackTrack5 (BT5)无线password破解教程WPA/WPA2-PSK无线password皴
  7. 【HZNUOJ】【C系列3.16】征战的Loy
  8. Android多线程理解
  9. Facebook加好友被禁止,请问什么时候被解禁
  10. SSH Agent Forwarding概念与示例