Java解析IOS IPA文件

4 篇文章 0 订阅


参考文档:http://my.oschina.net/heweipo/blog/382942


IOS IPA文件中包含Info.plist文件,类似于Android的AndroidManifest.xml,因此想获取IOS版本相关信息,就需要解析其Info.plist文件。参考文档中有详细的描述,但编译不过,调用的函数名搞错了,以如下代码为准。

public class IpaUtil{

    /**
     * 解压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<? extends ZipEntry> zipEnum = zipFile.entries();
            // 定义对象
            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 < length; 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 getZipInfo(newfile, newfile.getParent());
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过IPA文件获取Info信息
     */
    public static Map<String, String> getVersionInfo(File ipa) throws Exception{

        File file = getIpaInfo(ipa);
	Map<String,String> map = new HashMap<String,String>();
	// 需要第三方jar包dd-plist 
	NSDictionary rootDict = (NSDictionary)PropertyListParser.parse(file); 
	// 应用包名 NSString parameters = (NSString)rootDict.objectForKey("CFBundleIdentifier"); 
	map.put("CFBundleIdentifier", parameters.toString()); 
	// 应用名称 NSString 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 info; 
    }
}



 
 

如果用Maven,可以在pom文件中加入如下xml,获取到第三方包dd-plist:

<dependency>
	<groupId>com.googlecode.plist</groupId>
	<artifactId>dd-plist</artifactId>
	<version>1.16</version>
</dependency>
如果想直接获取到此jar包,可以在此处下载:http://download.csdn.net/detail/ruyi366/9149741



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值