日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2025/4/5 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在做移動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

總結

以上是生活随笔為你收集整理的java读取 info.plist源码_Java 解析 IPA 文件,读取 Info.plist 信息-Go语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天干,天天操,天天射 | 中文字字幕在线中文乱码电影 | www.国产精品视频 | 人妻色综合网站 | 国产66页 | 亚洲玖玖玖 | 野花视频免费在线观看 | 老司机激情影院 | 日韩大片在线 | av免费不卡 | 婷婷成人av | 色偷偷人人澡人人爽人人模 | 国产在线伊人 | 日女人免费视频 | 亚洲h视频在线观看 | 久精品视频| 麻豆精品在线 | 欧美久久久久久 | 午夜激情福利视频 | 亚洲精品日产精品乱码不卡 | 护士的小嫩嫩好紧好爽 | 99成人国产精品视频 | va在线 | 欧美骚视频 | 全部免费毛片在线播放 | 久久久96人妻无码精品 | 春日野结衣av | 国内成人自拍视频 | 四虎国产精品成人免费入口 | 亚洲精品123区 | 亚洲欧美在线看 | 97人妻天天摸天天爽天天 | 国产中出视频 | 色妞综合 | 午夜美女视频 | 强睡邻居人妻中文字幕 | 97人人澡人人爽人人模亚洲 | 国产黄在线播放 | 丁香久久| 婷婷色一区二区三区 | 午夜一级视频 | 国产区欧美区日韩区 | 超碰人人草人人干 | 韩国黄色精品 | 老司机激情影院 | 97超碰碰碰 | 五月婷婷一区二区三区 | 亚洲成人系列 | 亚洲av永久无码精品一百度影院 | 国产精品无遮挡 | 天天天天操 | 亚洲国产精品毛片 | 九九热在线精品 | 国产日批| 国产成人无码久久久精品天美传媒 | 先锋影音av在线 | 日韩欧美自拍偷拍 | 精品三区视频 | 免费在线观看日韩 | 日本成人三级电影 | 国产精品福利小视频 | 日韩三级一区二区 | 国产网红无码精品视频 | 叶山小百合av一区二区 | 午夜黄色网址 | 国产5区 | 国产精品三级在线观看 | 亚洲午夜一区 | 久久久久久久黄色片 | 66av欧美| 婷婷伊人综合 | 黄色精品 | 国产日韩欧美综合在线 | 亚洲成熟毛多妇女av毛片 | 欧美中文字幕一区 | 男人的天堂2018 | 亚洲一区二区观看 | 久久久久久a | 黄色小视频在线免费观看 | 在线免费观看日韩av | 黄色片aaa| 激情五月综合色婷婷一区二区 | 一级看片 | 嫩草嫩草嫩草 | 蜜桃又黄又粗又爽av免 | 黄色片在线免费观看视频 | 国产美女免费 | 97视频免费在线 | 欧美xxxx胸大 | 羽月希奶水一区二区三区 | 91在线免费视频观看 | 国产性久久 | 女人av| 久久久久久久久久久免费 | av黄色av| 日本不卡视频 | 五十路在线观看 | 在线视频观看一区 | 色黄视频在线观看 |