最近公司的产品要进行一次批量的升级,产品中的一些配置存放在info.plist,为了保证产品的信息无误,我们必须要对产品的发布信息进行验证。例如:广告ID,umeng,talkingdata等等。那么手动的核对,对于批量升级是又不保险,又费力气。然后我们聪明睿智的蔡主管安排我去做一个解压ipa,然后提取info.plist,最后提取产品信息进行比对的产品。

  我用的开发语言是C#,根据以上的描述,我们在开发中比较重要的就只有2步骤。

  1.解压ipa

  我引用的包是ICSharpCode.SharpZipLib.dll,为了提高速度,我只解压到info.plist就结束了,其他都不做文件写入。

     private void unzipFileIOS(String filePath)
{
// 判断文件是否是ipa文件
if (Path.GetExtension(filePath).Equals(".ipa"))
{
// 获取文件名
String appName = Path.GetFileNameWithoutExtension(filePath);
// 设置加压的文件夹目录
String outPath = PATH_TEMP_IOS + "\\" + appName;
// 获取输入流(ipa文件)
ZipInputStream s = new ZipInputStream(File.OpenRead(filePath));
// zip实体
ZipEntry theEntry;
String infoPlistName = "Info.plist";
bool found = false;
while ((theEntry = s.GetNextEntry()) != null)
{
Console.WriteLine(theEntry.Name);
// 文件名称
string fileName = Path.GetFileName(theEntry.Name);
// 寻找Info.plist文件
if (infoPlistName != null)
{
if (fileName.Equals(infoPlistName))
{
found = true;
// 创建输出目录
if (outPath.Length > )
{
Directory.CreateDirectory(outPath);
}
// 文件写入操作
using (FileStream streamWriter = File.Create(outPath + "\\Info.plist"))
{ int size = ;
byte[] data = new byte[];
while (true)
{
size = s.Read(data, , data.Length);
if (size > )
{
streamWriter.Write(data, , size);
}
else
{
break;
}
}
}
break;
}
}
}
// 一定要关闭流,不然下次会被占用
s.Close();
if (found == false)
{
logAppend(appName + "------- 无效", false, false);
logAppend(Environment.NewLine, false, false);
}
}
}

  2.读取info.plist

  通过以上的操作我们已经把ipa中的info.plist解压出来,那么我们接下来的操作就是读取plist中的内容

  我们引用的是CE.iPhone.PList.dll。

  String pathInfo = subDirectory + "\\Info.plist";
  if (File.Exists(pathInfo))
  {
    count++;
  // 获取根
    PListRoot root = PListRoot.Load(pathInfo);
  // 获取主节点
    PListDict dic = (PListDict)root.Root;
    // 获取PList的树形(根据名称获取数据)
    PListString appKey = (PListString)dic["CFBundleIdentifier"];
    PListString umengKey = (PListString)dic["UmengKey"];
    PListString adKey = (PListString)dic["ADKey"];
  // 因为tostring -》 string:+content 所以过滤
    string appKeystring = appKey.ToString().Substring().Trim();
    string umengKeystring = umengKey.ToString().Substring().Trim();
    string adKeystring = adKey.ToString().Substring().Trim();
  }

  通过以上的2个步骤我们就可以轻松的拿到我们的产品信息了,希望这篇文章对你们会有帮助。

结语

  • 受益,学会了提取ipa中的info.plist中的信息

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4527451.html

[工具-003]如何从ipa中提取info.plist并提取相应信息的更多相关文章

  1. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  2. VMware10中的CentOS6.5命令行安装VMwaretools工具启用windows与虚拟机中Linux系统的共享目录

    VMware10中的CentOS6.5命令行安装VMwaretools工具启用windows与虚拟机中Linux系统的共享目录 一.描述 系统描述:win7旗舰版64位系统+VMware Workst ...

  3. 嵌入式 H264中的SPS、PPS提取与作用

    使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set (PPS)需要用到,那么这两 ...

  4. H264中的SPS、PPS提取与作用

    牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  5. Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用

    Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用 Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.cs ...

  6. python操作txt文件中数据教程[2]-python提取txt文件

    python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...

  7. Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马

    Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...

  8. java工具类之按对象中某属性排序

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  9. H264中的SPS、PPS提取与作用<转>

    牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

随机推荐

  1. [bzoj2427]P2515 [HAOI2010]软件安装(树上背包)

    tarjan+树上背包 题目描述 现在我们的手头有 \(N\) 个软件,对于一个软件 \(i\),它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\).我们希望从中选择一些软件安装到一台磁 ...

  2. badboy 录制脚本

    第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...

  3. 201771010113 李婷华 《面向java对象程序设计(Java)》第四章学习总结

    一. 理论知识部分 第四章 对象与类 本章主要讲述面向对象程序设计.如何创建标准Java类库中的类对象.如何编写自己的类. 1.面向对象程序设计的几个主要概念: 抽象数据类型.类和对象.封装.类层次( ...

  4. 使用Proteus模拟操作HDG12864F-1液晶屏

    在Proteus中模拟了89C52操作HDG12864F-1液晶屏,原理图如下: 一.HDG12864F-1官网信息 该液晶屏是Hantronix的产品,官网上搜索出这个型号是系列型号中的一种,各种型 ...

  5. 【Linux基础总结】Linux基本环境

    Linux基本环境 对Linux的基础认识 虚拟机进入终端: [root@hadoop-senior Desktop] # 用户名 主机名 所在目录名称 #:表示当前用户属于root用户,超级管理员用 ...

  6. 生产者消费者问题中的同步机制JAVA设计和实现

    目录 问题描述 问题分析 利用记录型信号量解决 运行环境 实现思路 代码实现 运行截图 过程中出现的问题和注意点 利用AND信号集解决 运行环境 实现思路 代码实现 运行截图 问题描述 若干进程通过有 ...

  7. 去除 HTML 和 PHP 标记

    strip_tags()函数,从字符串中去除html和php标记,随笔记一下,如果看过就过去,下次再找可能又会费点事,记下来下次好找

  8. 基于Memcached的Nginx服务器集群session共享

    原料:jdk1.8,tomcat7,nginx1.16,memcached-1.2.6,Mem-Tomcat需要的jar包,基于windows7.所有的点击以下链接可下载 链接:https://pan ...

  9. 【雕爷学编程】Arduino动手做(62)---1排4键薄膜开关模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  10. node的querystring

    querystring.stringify({name:''scott",course:['jade','java'],from=''}); => 'name=scott&co ...