[工具-003]如何从ipa中提取info.plist并提取相应信息
最近公司的产品要进行一次批量的升级,产品中的一些配置存放在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并提取相应信息的更多相关文章
- 转:SQL SERVER数据库中实现快速的数据提取和数据分页
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- VMware10中的CentOS6.5命令行安装VMwaretools工具启用windows与虚拟机中Linux系统的共享目录
VMware10中的CentOS6.5命令行安装VMwaretools工具启用windows与虚拟机中Linux系统的共享目录 一.描述 系统描述:win7旗舰版64位系统+VMware Workst ...
- 嵌入式 H264中的SPS、PPS提取与作用
使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set (PPS)需要用到,那么这两 ...
- H264中的SPS、PPS提取与作用
牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用 Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.cs ...
- python操作txt文件中数据教程[2]-python提取txt文件
python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...
- Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马
Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...
- java工具类之按对象中某属性排序
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- H264中的SPS、PPS提取与作用<转>
牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
随机推荐
- js世家委托详解
事件原理 通过div0.addElementListener来调用:用法:div0.addElementListener(事件类型,事件回调函数,是否捕获时执行){}.1.事件类型(type):必须是 ...
- 目标检测之yolo源码分析
三.配置文件详解(config.py) import os # 数据集路径,和模型检查点路径 # # path and dataset parameter # DATA_PATH = 'data' # ...
- VMware15.5.0安装MacOS10.15.0系统 安装步骤(上)
VMware15.5.0安装MacOS10.15.0系统安装步骤(上)超详细! 说明: 本文是目前最新的安装和调配教程且MacOS10.15和10.16版本搭建方法相同,我也会在一些细节地方加上小技巧 ...
- 学习笔记之MySQL的使用
什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文 ...
- 不可错过的java面试博客之java集合篇
1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...
- golang关键字select的三个例子, time.After模拟socket/心跳超时
golang关键字select的三个例子, time.After模拟socket/心跳超时 例子1 select会随机选择一个可执行的case // 这个例子主要说明select是随机选择一个 ...
- JVM系列-2、JVM内存结构
一.JVM内存结构 1.1.栈(JVM Stacks) 存放局部变量(定义在方法中的变量和定义在方法参数列表上的变量).对象引用(reference类型,它不等同于对象本身,根据不同的虚拟机实现,它可 ...
- CSS中的间距设置与盒子模型
CSS间距 内补白 外补白 盒子模型 CSS间距 很多时候我们为了美观,需要对内容进行留白设置,这时候就需要设置间距了. 内补白 设置元素的内间距 padding: 检索或设置对象四边的内部边距 pa ...
- Android 开发技术周报 Issue#279
新闻 丧心病狂or形势所迫?谈谈Android奇葩的"链式启动" 传闻称Android TV将更名为Google TV 谷歌官宣Android 11 Beta发布会:6月3日见 教 ...
- python 之模块引入
模块引入: 1.同级引入 如 ac_first.py 引入ac_second.py:只需直接 import ac_second 即可 这种情况 不论是 python ac\ac_first.py 还是 ...