当前位置: 首页 > news >正文

免费网站申请网页空间结构

免费网站申请,网页空间结构,国家商标注册查询网,主机宝怎么设置网站主页在 TS 中解析 ipa 文件 ipa即Xcode打包出来的APP的安装包#xff0c;通过解析ipa中的文件#xff0c;我们可以获得APP的DisplayName、Version、BundleIdentifier等信息#xff0c; 同时也可以获取到APP证书的相关信息#xff0c;包括APP的安装环境、证书的有效期、APP开通…在 TS 中解析 ipa 文件 ipa即Xcode打包出来的APP的安装包通过解析ipa中的文件我们可以获得APP的DisplayName、Version、BundleIdentifier等信息 同时也可以获取到APP证书的相关信息包括APP的安装环境、证书的有效期、APP开通的功能、可安装设备的UDID、公共秘钥、指纹等。 解析 ipa 可用的工具 在NPM 官网上搜索 app、ipa、package 或 parser 等信息 可直接使用的插件有app-info-parser但是其不支持 TS经过询问作者并不明确何时可以适配 TS。 js-app-parser是支持 TS 的解析插件但是解析 ipa 时会出错解析 apk 时是正确的(解析非标准打包的 apk 会出错解决见下一篇)。 综合分析以上插件源码找到 ipa 解析失败问题并解决创建一个支持 TS 的 ts-package-parser。 js-app-parser解析出错的地方是解析info.plist的时候出错了。 分析 ipa 解析 ipa实际需要解析的文件是 info.plist、AppIcon。 而 ipa 实际上就是压缩包。只要将其解压缩即可得到全部内容再从中找到需要的文件就可以得到 APP 的信息。 mobileprovision文件中包含 APP 的证书等信息此文件可由后端进行解析。 解析 ipa 解压缩 ipa 主流的解压缩工具为 jszip并支持TS使用 jszip 解压缩 ipa 文件得到ipa里的所有文件。 解析过程中需要用到的方法 // 创建jszip对象this._jsZip new JSZip();/*** 解压文件* param blob 文件内容* returns 文件数据:JSZip*/unZipFile(blob: Blob | ArrayBuffer) {return new Promise((resolve, reject) {this._jsZip.loadAsync(blob).then((zipObjc: JSZip) {return resolve(zipObjc);}).catch((e) {return reject(解析File失败);});});}/*** 生成文件* param path 要压缩的文件路径* param type 文件类型:OutputType* returns 生成的文件*/zipFilePathToNeedTypeT extends OutputType(path: string, type: T) {return new Promise((resolve, reject) {this._jsZip.file(path).async(type).then((result) {return resolve(result);}).catch(() {return reject(生成文件失败);});});} 通过以上解压缩方法即可得到解压后的 ipa 对象。 // 解压ipathis.unZipFile(file).then((zipObjc: JSZip) {const names Object.getOwnPropertyNames(zipObjc.files);});// 通过zipObjc得到ipa的全部文件名称和路径const names Object.getOwnPropertyNames(zipObjc.files);// 通过遍历names得到info.plist文件const plistRegex /^Payload\/(?:.*)\.app\/Info.plist$/;let plistPaht ;for (let i 0; i names.length; i) {if (plistRegex.test(names[i])) {plistPath names[i];break;}} 解析 info.plist 文件 获取到 info.plist 文件路径后读取到文件内容类型为arraybuffer 使用 jszip 创建文件将得到的文件转换为 buffer 文件。 import bufferLib from buffer;import { parse as PlistParse } from plist;import bplist from bplist-parser;this.zipFilePathToNeedType(plistPath, arraybuffer).then((arrBuffer: ArrayBuffer) {// 创建buffer对象const buffer bufferLib.Buffer.from(arrBuffer);// 根据buffer的第一个元素设置bufferTpeconst bufferType buffer[0] as number | string;// 解析结果对象let result null;if (bufferType 60 || bufferType || bufferType 239) {result PlistParse(buffer.toString()) as any;} else if (bufferType 98 || bufferType b) {result bplist.parseBuffer(buffer)[0];} else {throw new Error(Unknown plist buffer type.);}} 至此即可解析出 info.plist 的信息。 Info.name result.CFBundleDisplayName || result.CFBundleName; Info.versionName result.CFBundleShortVersionString; Info.versionCode result.CFBundleVersion; Info.ubndleId result.CFBundleIdentifier; Info.platform ios; // 设置icon信息解析icon需要用到 if (result.CFBundleIcons) {const icons result.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles;if (icons) {Info.icon icons[icons.length - 1];} } 解析 AppIcon 获取 icon 路径、名称等信息解析获取到 png 文件。 // 使用 js-app-parser 解析icon的方法import { parsePNG } from js-app-parser/dist/ios/png-parse;// appIcon路径const appIconRegex /^Payload\/(?:.*)\.app\/AppIcon[0-9]{2}x[0-9]{2}[2-3]x.png$/;/*** 解析ipa中的icon.png* param zipObjc 已解析的ipa对象数据* param bundleUploadInfo 已解析的info.plist数据对象* returns ApplicationModel对象*/parserFileToPngIcon(zipObjc: JSZip, bundleUploadInfo: BundleUploadModel): PromiseBundleUploadModel {return new Promise((resolve, reject) {// 获取ipa中的全部文件及路径const names Object.getOwnPropertyNames(zipObjc.files);// 解析info.plist时获取的if (bundleUploadInfo.icon) {// icon的file对象let icon void 0;for (let i 0; i names.length; i) {if (names[i].indexOf(bundleUploadInfo.icon) 0) {// 将icon路径生成file类型数据icon zipObjc.files[names[i]];break;}}if (icon) {bundleUploadInfo.icon icon.name;// 解析icon数据this.zipFilePathToNeedType(icon.name, uint8array).then((data: Uint8Array) {const iconPng parsePNG(data);bundleUploadInfo.iconSteam iconPng;bundleUploadInfo.iconUrl URL.createObjectURL(new Blob([iconPng]));resolve(bundleUploadInfo);}).catch((err) {reject(err);});} else {resolve(bundleUploadInfo);}} else {resolve(bundleUploadInfo);}});}压缩生成文件 ipa 中其他重要的证书信息等存储在 mobileprovision 中。同样的通过 nams 获取到 mobileprovision 之后将 info.plist、mobileprovision 等文件压缩为同一个文件。 // 描述文件路径const provisonRegex /^Payload\/(?:._)\.app\/(?:._).mobileprovision$/;/*** 压缩解析后需要的文件* param bundleUploadInfo 解析后的对象* returns BundleUploadModel*/async unzipFilePathToIpaOrApk(bundleUploadInfo: BundleUploadModel): PromiseBundleUploadModel {const jszip new JSZip();const paths [];paths.push(bundleUploadInfo.plistPath);paths.push(bundleUploadInfo.provisionPath);for (let i 0; i paths.length; i) {const path paths[i];const name path.substring(path.indexOf(app/) 4);await this.zipFilePathToNeedType(path, blob).then((result: Blob) {jszip.folder(Payload/${bundleUploadInfo.name}.app/).file(name, result);});}return new Promise((resolve, reject) {jszip.generateAsync({type: blob, // 压缩类型compression: DEFLATE, // STORE默认不压缩 DEFLATE需要压缩compressionOptions: {level: 9, // 压缩等级1~9 1压缩速度最快9最优压缩方式},mimeType: bundleUploadInfo/iphone,}).then((fileZip) {bundleUploadInfo.ipaZip fileZip;resolve(bundleUploadInfo);}).catch((err) {reject(err);});});} 总结 ipa 的解析主要是解析 info.plist、appIcon。 应用之家即采用了此种方式进行解析。 上传 ipa 后并能解析到应用的安装环境、证书的有效期、APP开通的功能、可安装设备的UDID、公共秘钥、指纹等具体信息。并提供下载统计等丰富功能。
http://www.pierceye.com/news/190044/

相关文章:

  • 电子商务网站的建设与维护方法h5第三方收款平台
  • 网站建设所需人力设计广告网站
  • php网站发送邮件动态倒计时网站模板
  • 温州建设网站制作wordpress调用文章简介
  • 大庆市建设局网站刘东科技公司做网站
  • 山东助企网站建设宁波百度关键词推广
  • 宜昌市夷陵区建设局网站培训推广 seo
  • 怎样做安居客网站用幽默的语言来形容网站开发
  • 宜昌网站建设选择宜昌慧享互动手机怎么防止网站跳转
  • 本地的上海网站建设公司汽车租赁网站设计
  • 在哪下载免费的英文版网站模板建站 网站程序有哪些
  • 网页前端做购物网站的实训报告网络营销推广是做什么的
  • 广东专业网站建设效果wordpress搜索框插件
  • 茂名建站模板搭建岳阳优化营商环境
  • shopify网站建设郑州机械网站制作
  • 郑州正规公司网站建设服务国内专业建站平台
  • 做财经直播网站php网站做安卓客户端
  • 视频直播网站开发运营步骤十大免费erp软件
  • 域名备案和网站备案有什么不同wap 网站
  • 没备案的网站百度收录博客营销
  • 网站开发新技术wordpress 搜索词调用
  • 凡科手机建站教程wordpress 搜索引擎
  • asp企业网站源码下载免费ppt模板公众号
  • 西斗门的网站建设短网址生成器有哪些
  • 一站式织梦网站模板工信部备案查询网官网
  • 网站导航做外链桂林seo
  • 青岛网站建设q479185700棒软件开发者是指
  • 福永公司网站建设空间网站链接怎么做
  • 百度的企业网站谷歌浏览器下载安卓版
  • 网站建设总体情况网站设计宁波