最近公司的产品要进行一次批量的升级,产品中的一些配置存放在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. 获取Wi-Fi的SSID

    前几天做项目的时候,碰到一个问题,获取wifi的SSID,其实就是获取Wi-Fi的名字 iOS12以前 在iOS13之前获取wifi的SSID很简单,苹果提供了接口CNCopyCurrentNetwo ...

  2. Web 跨域请求问题的解决方案- CORS 方案

    1.什么是跨域 跨域是指跨域名的访问,以下情况都属于跨域: 跨域现象 实例 域名不相同 www.baidu.com与www.taobao 一级域名相同,但是端口不相同 www.baidu.com:80 ...

  3. Java中的动态定义数组

    1.一维矩阵的动态定义(代码注释) 1.1方法一 package dongtai; import java.util.Scanner; import java.util.ArrayList; publ ...

  4. bootstrap栅格系统的使用

    bootstrap栅格系统的使用 bootstrap栅格系统的使用,主要分为四种方式 1.列组合  col-md-* 2.列偏移 col-md-offset-* 3.列嵌套  大列组合包含着小组合 4 ...

  5. 汽车安全攻击篇:智能网联系统的短板,如何防护汽车的安全C

    我们在<速度与激情>里,经常可以看到主角们利用网络侵入汽车网络系统,然后任意的操纵这些车辆,看电影的时候会被画面所震撼到,这两年"自动驾驶"随着特斯拉的车已经越来越普及 ...

  6. C# 判断文件格式的一些总结

    前提概述: 项目中 经常会有上传图片的地方  有的时候需要对图片类型做一些要求   这个时候就需要一些判断   虽然前段上传的时候可以去做类型的限制  或者后台接受的时候从file的type 中获取图 ...

  7. STM32 时钟树配置快速入门

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 为什么要了解时钟树? ...

  8. MATLAB与三大变换

    运行 Simulink 有三种方式: z 在 MATLAB 的命令窗口直接键入“Simulink”并回车: z 单击 MATLAB 工具条上的 Simulink 图标: z 在 MATLAB 菜单上选 ...

  9. [hdu4292]最大流,拆点

    题意:给定每个人所喜欢的食物和饮料种类以及每种食物和饮料的数量,一个人需要一种食物和一种饮料(数量为1即可),问最多满足多少人的需要 思路:由于食物和饮料对于人来说需要同时满足,它们是“与”的关系,所 ...

  10. Python --函数学习3 (将函数存储在模块中)

    将函数存储在模块 函数可以将代码块和主程序分离,通过给函数指定描述性名称,可以让主程序更加容易理解,还可以更进一步,将函数存储在模块的独立文件中,再将模块导入到主程序.import 语句允许再当前运行 ...