JSAnalysis

本文只做介绍,项目源码在github,链接如下

JSAnalysis项目github链接

项目简介

JSAnalysis 是一款苹果设备信息静默获取的工具。它可以在用户无感知的情况下获取到尽可能多的设备信息,方便开发者对用户提供更好的体验。本工具仅限于技术学习交流使用.

设计要点

  • 使用AES256加入签名、敏感信息加密. 防篡改、防劫持.
  • 在没有权限获取对应信息时统一设置value为@“NONE”、防止因App、系统的更新带来的crash,对用户灵感知.
  • 加入缓存机制、子线程异步获取, 避免影响主线程业务

获取信息详情

iOS设备信息获取SDK可获取信息列表
特别说明:以下部分Key值是有可能为空的,本SDK的所有空值均以NONE字符串来标识
(一)appInfo-应用信息
序号 应用信息名称 参数名称 示例 可行性 可行性描述 特别说明
1 应用名称 appName 海豚队长 Y
2 应用唯一标识 appBundle 友信普惠或 YOUXIN Y
3 应用版本 appVersion 2.0.1 Y clientVersion
4 行为数据采集SDK版本 sdkVersion 1.0.1 Y
5 App启动时间 launchTime 4.32 Y
6 本应用用户id userId 1002231 Y 需要sdk接入的开发人员初始化@property (nonatomic, copy) GetUserIdBlock userIdBlock;
(二)clientInfo-客户端信息
序号 基础信息名称 参数名称 备注 示例 可行性 可行性描述 特别说明
7 设备名称 deviceName 获取设备驱动名称 hwG750-T01 Y/N 我理解是设备的昵称,就是给我自己手机设置的别名
8 设备型号 deviceModel 手机的型号 HUAWEI G750-T01 Y deviceModel:iPhone X
9 设备品牌 brand 设备品牌 Huawei Y
10 系统名称 osName 系统名称 Android Y platform:iOS
11 系统版本 osVersion 获取系统版本字符串 4.4.4 Y deviceOs:iOS12.1
12 系统sdk版本 osSDK 系统sdk版本比如iOS11.2 iOS11.2 Y
13 制造商 manufacturer 设备制造商 HUAWEI Y
14 系统默认语言 initialLanguage 系统默认语言 zh Y 默认语言可以修改,获取结果同15
15 配置时区 timeZone 配置时区 北京 Y
16 剩余电量 dumpEnergy 剩余电量 0.15 Y 模拟器获取为-1.00
17 是否充电 charging 是否充电 0、1 Y 0代表没有在充电,1代表正在充电
18 电池状态 batteryState Unknown: 未知状态 Unplugged: 未插电 Charging: 充电中 Full: 充电中/并且已经充满 Charging Y
19 UUID UUID IOS设备唯一标识 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Y 这个标识会在卸载应用后会改变,现在传的imei字端其实就是这个
20 IDFA IDFA 与device相关的唯一标识符,可以用来打通不同app之间的广告 1E2DFA89-496A-47FD-9941-DF1FC4E6484A Y
21 是否越狱 jailbroken 是否越狱 是、否、NONE Y 模拟器获取为NONE
22 是否为模拟器 simulator 是否为模拟器 1、0 Y 1代表是,0代表不是
23 手机cpu使用率 cpuUsage cpu使用率 12.91 Y
24 app cpu 的使用率 appCpuUsage app占用的cpu 1.23 Y
25 系统启动时间 bootTime 格林威治时间 1549851830 Y
26 系统运行总时间 upTime 从启动到现在运行的总时长,秒为单位 1233360 Y
27 内核版本 kernelVersion 系统内核版本 Darwin Kernel Version 18.2.0: Mon Nov 12 20:24:31 PST 2018; root:xnu-4903.231.4~1/RELEASE_X86_64 Y
28 现在时间 nowTime 格林威治时间 1551085190 Y
(三)netInfo-网络信息
序号 网络信息名称 参数名称 备注 示例 可行性 可行性描述 特别说明
29 网络类型 networkType WIFI、WWAN、NONE WIFI Y
30 网络名称 SSID 网络名/wifi名/ YOUXIN_WIFI/NONE Y 模拟器获取为NONE iOS13后值固定为“WLAN”
31 mac地址 mac 无线局域网mac地址 00:08:02:a4:fb N 如果没有连接到WiFi,获取到固定值0x020000000000 模拟器获取为NONE
32 路由器地址 routerAddress 无线路由器地址 192.168.1.1 Y
33 路由器mac routerMac wifi的mac地址 10:76:93:2c:a0 Y bssid/ ssid 模拟器获取为NONE
34 网速 link_speed 网速 135mbps Y 目前有这个功能,但是都没有获取
35 cell_ip cellIp 蜂窝网络ip 192.168.1.105 Y 模拟器获取为NONE
36 wifi_ip wifiIp 无线局域网ip 192.168.1.12 Y
37 代理ip proxyIp 代理ip Y
38 蓝牙名称 bluetoothName 蓝牙名称 HUAWEI TAG-TL00 Y 和iPhone本身的别名相同
39 VOIP状态 voipStatus 0、1 Y
40 网络制式 radioType 移动网络制式 LET Y
41 路由广播地址 routerDstaddr 10.255.17.255 Y
42 路由网关 routerGateway 160.197.64.113 Y
43 路由名称 routerName 112.50.112.48 Y
44 路由子网掩码 routerNetmask 255.255.254.0 Y
(四)phoneCardInfo-手机卡信息
序号 手机卡信息名称 参数名称 备注 示例 可行性 可行性描述 特别说明
45 手机卡国家 simCountryIso 手机卡国家iso代码 cn Y 模拟器获取为NONE
46 运营商名字 simOperatorName 运营商名字 中国联通 Y 模拟器获取为NONE
47 运营商id simOperator 运营商id 46001 Y/N 能获取国家代码和网络代码,运营商id,没有直接获取的api 模拟器获取为NONE
48 手机卡状态 simState SIM_STATE_UNKNO UNKNOW、INSTALL、NONE Y/N 只能获取到是否插入sim卡
49 移动国家代码 mobileCountryCode 移动国家代码 NONE,1 Y
(五)screenInfo-屏幕信息
序号 屏幕信息名称 参数名称 备注 示例 可行性 可行性描述 特别说明
50 屏幕高度 screenWidth 屏幕高度 4.960638 Y
51 屏幕宽度 screenHeight 屏幕宽度 2.795277 Y
52 屏幕密度 density 屏幕密度 2 Y
53 屏幕亮度值 screenBrightness 屏幕亮度值 0--255 Y Y 模拟器获取为0
(六)sensorInfo-传感器信息
序号 传感信息名称 参数名称 备注 示例 可行性 可行性描述 特别说明
54 定位经度 gpsLongitude 定位经度 Y 需要用户授权位置权限 在没有权限的情况下为NONE
55 定位纬度 gpsLatitude 定位纬度 Y 需要用户授权位置权限
56 GPS认证状态 gpsStatus GPS认证状态 NotDetermined、Restricted、Denied、Always、WhenInUse、NONE Y
57 GPS开关 gpsSwitch gps开关是否打开 0、1 Y
(七)storageInfo-存储/内存信息
序号 存储信息名称 参数名称 备注 示例 可行性 可行性描述 特别说明
58 内存总大小 totalMemory bytes为单位 8589934592 Y
59 内部存储 totalSpace bytes为单位 501580873728 Y
60 物理内存当前占用 usedMemory bytes为单位 14700544 Y
61 app占用内存 appUsedMemory bytes为单位 48287744 Y
62 空闲的总内存 freeSpace bytes为单位 18707865600 Y

接入指南

1.接入代码

#import "JSAnalysis.h"[JSAnalysis standardAnalysis].appKey = @"你的AppJKey";
//手动获取
[[JSAnalysis standardAnalysis] getAnalysisBoxWithOption:JSAnalysisGetAnalysisBoxOptionManual responseBlock:^(NSDictionary * _Nonnull analysisBoxInfo) {NSLog(@"%@",analysisBoxInfo);
}];

更改JSAnalysisGetAnalysisBoxOptionManual 为 JSAnalysisGetAnalysisBoxOptionIntelligentAuto 可以在特定的条件下自动上传到信息收集的服务器,用户可根据 jsBox去查询数据的解密结果。

- (void)getAnalysisBoxWithOption:(JSAnalysisGetAnalysisBoxOption)option responseBlock:(void(^)(NSDictionary *analysisBoxInfo))block API 每次被调用都会执行重新获取动作,如果需要重新获取,在每个合适的节点重新调用即可。

提供了设备信息的缓存:cacheBoxInfoJSAnalysis的单例对象中可获取。

** 如果需要不加密的数据可以参考 JSAnalysis.m 中的getAllInfo方法实现. **

成功获取数据示例:


{// app 标识"appBundle" = "com.analysisi.show";// 信息加密后的结果"jsBox" = "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";// 数据签名"sign" = 377dce9785fc41c5e502cefa3082531b;// 获取时间"timestamp" = 1551237554589;// 设备标识 IDFAclientId = "9047090B-1140-4A66-8503-A76B7698C113";// sdk版本sdkVersion = "1.0.0";// 签名sign = 84ec561739fe2ce531e3ce8c8cba427d;timestamp = 1552977734417;
}

2,加解密过程

举例:
两个关键的key

  • AES256 key: 0f607264fc6318a92b9e13c65db7cd3c (用于AES256将敏感数据加密)
  • JSAnalysisEncryptionTool.mstatic const char JSEncryptionToolAES256Key[] = "xxxxxxxxxxxxxxxx";修改AES256的密钥
  • sign key : appkey_test (用于将加密后的数据做签名,防篡改)
  • 签名默认加密私钥使用的是JSAnalysis.h@property (nonatomic, copy, nonnull) NSString *appKey; 请自行更改.

加密过程:

jsBox:

  • 一个map,将其中的key:value对,按照key升序排列,如 app、baby、brand、cos、design…
  • 使用 AES256 key 以及 AES256加密方式对步骤1中的结果map进行加密。

sign:

  • map = { app_bundle : 当前应用标识,
    jsBox : 加密后的结果值,
    timestamp :当前时间的时间戳
    } (同样按key升序)

  • 以sign key为盐 做md5.

解密按照AES256

步骤1中的加密数据解密结果:

{appInfo = {appBundle = "com.ucredit.sales";appName = AnalysisDemo;appVersion = "1.0.0";launchTime = "0.51";sdkVersion = "1.0.0";userId = NONE;};clientInfo = {IDFA = "9047090B-1140-4A66-8503-A76B7698C113";UUID = "2F0CB187-60A6-48EE-8DAE-C8C97FC1B186";appCpuUsage = "61.80";batteryState = Unknown;bootTime = 1552914866;brand = Apple;charging = 0;cpuUsage = "16.50";deviceModel = "x86_64";deviceName = "iPhone XR";dumpEnergy = "-1.00";initialLanguage = en;jailbroken = NONE;kernelVersion = "Darwin Kernel Version 18.2.0: Mon Nov 12 20:24:31 PST 2018; root:xnu-4903.231.4~1/RELEASE_X86_64";manufacturer = Apple;nowTime = 1552977730;osName = iOS;osSDK = "12.1";osVersion = "12.1";simulator = 1;timeZone = "Asia/Shanghai (GMT+8d) offset 28800";upTime = 62864;};netInfo = {SSID = NONE;bluetoothName = "iPhone XR";cellIp = NONE;mac = NONE; networkType = WiFi;proxyIp = NONE;radioType = NONE;routerAddress = "10.255.16.152";routerDstaddr = "10.255.17.255";routerGateway = "16.44.60.99";routerMac = NONE;routerName = "112.50.112.48";routerNetmask = "255.255.254.0";voipStatus = 0;wifiIp = "10.255.16.152";};phoneCardInfo = {mobileCountryCode = NONE;simCountryIso = NONE;simOperator = NONE;simOperatorName = NONE;simState = UNKNOW;};screenInfo = {density = 2;screenBrightness = 0;screenHeight = 480;screenWidth = 320;};sensorInfo = {gpsLatitude = "0.000000";gpsLongitude = "0.000000";gpsStatus = NotDetermined;gpsSwitch = 1;};storageInfo = {appUsedMemory = 48046080;freeSpace = 12156682240;totalMemory = 8589934592;totalSpace = 501580873728;usedMemory = "-147644416";};
}

iOS 应用信息、手机设备信息、网络信息、权限信息、GPS、网络信息、存储信息、屏幕信息、传感器信息、手机卡信息等信息获取工具相关推荐

  1. 微信小程序区分ios安卓Android手机设备信息

    初心-杨瑞超个人博客诚邀您加入qq群(IT-程序猿-技术交流群): 757345416丨(IT-程序猿-技术交流2群): 936929828 官方文档:https://developers.weixi ...

  2. Android设置网络访问权限

    Android设置网络访问权限 Android的网络权限设置:需要在 AndroidManifest.xml 中加入以下代码 < android:name="android.permi ...

  3. 网络上的计算机无权限访问权限,电脑连不上网,提示无网络访问权限怎么办?...

    原标题:电脑连不上网,提示无网络访问权限怎么办? 网络提示无网络访问权限该如何解决?这是前几天一位网友问云骑士的问题,下面就与大家一起分享. 电脑连不上网,提示无网络访问权限的解决办法: 方法一:诊断 ...

  4. Android 获取app 地址,获取手机设备信息、app版本信息、ip地址

    获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 获取当前运行环境信息.与其它程序进行通讯等.通过plus.runtime可获取运行环境管理 ...

  5. html5 手机 消息,H5获取手机设备信息、app版本信息、ip地址

    获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 获取当前运行环境信息.与其它程序进行通讯等.通过plus.runtime可获取运行环境管理 ...

  6. js获取PC设备信息,js获取手机设备信息,最全

    获取设备系统和型号<封装方法> <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  7. mui获取手机设备信息

    Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 下面是我获取设备的名称.版本.语言.网络类型的一个例子: ...

  8. ADB——查看手机设备信息

    查看设备信息 查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery''' Current Battery ...

  9. Android 手机设备信息获取使用详解

    Android 手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的参数信息呢? 通过本文你讲了解到获取手机常用信息的基本方法. 获取手机基本信 ...

最新文章

  1. 2022-2028年中国SIP芯片行业市场前景预测及投资战略研究报告
  2. Delphi2010使用TImage打开jpeg图片错误的处理
  3. 001Python路--入门
  4. 就业模拟试题_Java
  5. Java 7:满足Fork / Join框架
  6. amos看拟合度在哪里看_哪里可以看亲爱的热爱的电视剧全集
  7. 实验室最拼命的博士生,为什么却面临延毕?
  8. 【英语学习】【医学】Unit 09 The Respiratory System
  9. python thrift 示例
  10. 使用码云或GitHub搭建简单的个人网站
  11. csdn设置资源下载所需积分
  12. MATLAB数字图像处理
  13. 联想拯救者Y9000P 2022 安装ubuntu 20.04 以及显卡驱动
  14. 装修报价不担心被骗 避免家装陷阱报价揭密
  15. 批量添加搜狗域名绑站工具
  16. 虚无鸿蒙混沌系统,玄幻 鸿蒙混沌选择系统
  17. 2020个人成长计划
  18. 王子救公主(DFS)
  19. JavaScript-动画-轮播图
  20. 共享充电宝PCBA方案开发设计

热门文章

  1. 使用javamail、阿里云邮箱发送邮件
  2. 安装oh my zsh
  3. python之身份证号码的出生日期的提取与性别判段
  4. android studio导入as项目,Android Studio(AS)--导入项目
  5. python中pytest教程_Pytest安装新手详细教程
  6. 3ds max不能完全自定义设置FOVX和FOVY(3ds max 2014)
  7. 推荐模型-基于知识图谱-2019:MKR
  8. Java基于局域网(LAN)的聊天室软件-内附源码
  9. VC++深入详解学习笔记
  10. python的猴子补丁(Monkey Patching)