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

Posted Jsen_Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 应用信息手机设备信息网络信息权限信息GPS网络信息存储信息屏幕信息传感器信息手机卡信息等信息获取工具相关的知识,希望对你有一定的参考价值。

JSAnalysis

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

JSAnalysis项目github链接

项目简介

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

设计要点

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

获取信息详情

ios设备信息获取SDK可获取信息列表
特别说明:以下部分Key值是有可能为空的,本SDK的所有空值均以NONE字符串来标识
(一)appInfo-应用信息
序号应用信息名称参数名称示例可行性可行性描述特别说明
1应用名称appName海豚队长Y
2应用唯一标识appBundle友信普惠或 YOUXINY
3应用版本appVersion2.0.1YclientVersion
4行为数据采集SDK版本sdkVersion1.0.1Y
5App启动时间launchTime4.32Y
6本应用用户iduserId1002231Y需要sdk接入的开发人员初始化@property (nonatomic, copy) GetUserIdBlock userIdBlock;
(二)clientInfo-客户端信息
序号基础信息名称参数名称备注示例可行性可行性描述特别说明
7设备名称deviceName获取设备驱动名称hwG750-T01Y/N我理解是设备的昵称,就是给我自己手机设置的别名
8设备型号deviceModel手机的型号HUAWEI G750-T01YdeviceModel:iPhone X
9设备品牌brand设备品牌HuaweiY
10系统名称osName系统名称androidYplatform:iOS
11系统版本osVersion获取系统版本字符串4.4.4YdeviceOs:iOS12.1
12系统sdk版本osSDK系统sdk版本比如iOS11.2iOS11.2Y
13制造商manufacturer设备制造商HUAWEIY
14系统默认语言initialLanguage系统默认语言zhY默认语言可以修改,获取结果同15
15配置时区timeZone配置时区北京Y
16剩余电量dumpEnergy剩余电量0.15Y模拟器获取为-1.00
17是否充电charging是否充电0、1Y0代表没有在充电,1代表正在充电
18电池状态batteryStateUnknown: 未知状态 Unplugged: 未插电 Charging: 充电中 Full: 充电中/并且已经充满ChargingY
19UUIDUUIDIOS设备唯一标识xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxY这个标识会在卸载应用后会改变,现在传的imei字端其实就是这个
20IDFAIDFA与device相关的唯一标识符,可以用来打通不同app之间的广告1E2DFA89-496A-47FD-9941-DF1FC4E6484AY
21是否越狱jailbroken是否越狱是、否、NONEY模拟器获取为NONE
22是否为模拟器simulator是否为模拟器1、0Y1代表是,0代表不是
23手机cpu使用率cpuUsagecpu使用率12.91Y
24app cpu 的使用率appCpuUsageapp占用的cpu1.23Y
25系统启动时间bootTime格林威治时间1549851830Y
26系统运行总时间upTime从启动到现在运行的总时长,秒为单位1233360Y
27内核版本kernelVersion系统内核版本Darwin Kernel Version 18.2.0: Mon Nov 12 20:24:31 PST 2018; root:xnu-4903.231.4~1/RELEASE_X86_64Y
28现在时间nowTime格林威治时间1551085190Y
(三)netInfo-网络信息
序号网络信息名称参数名称备注示例可行性可行性描述特别说明
29网络类型networkTypeWIFI、WWAN、NONEWIFIY
30网络名称SSID网络名/wifi名/YOUXIN_WIFI/NONEY模拟器获取为NONE iOS13后值固定为“WLAN”
31mac地址mac无线局域网mac地址00:08:02:a4:fbN如果没有连接到WiFi,获取到固定值0x020000000000模拟器获取为NONE
32路由器地址routerAddress无线路由器地址192.168.1.1Y
33路由器macrouterMacwifi的mac地址10:76:93:2c:a0Ybssid/ ssid模拟器获取为NONE
34网速link_speed网速135mbpsY目前有这个功能,但是都没有获取
35cell_ipcellIp蜂窝网络ip192.168.1.105Y模拟器获取为NONE
36wifi_ipwifiIp无线局域网ip192.168.1.12Y
37代理ipproxyIp代理ipY
38蓝牙名称bluetoothName蓝牙名称HUAWEI TAG-TL00Y和iPhone本身的别名相同
39VOIP状态voipStatus0、1Y
40网络制式radioType移动网络制式LETY
41路由广播地址routerDstaddr10.255.17.255Y
42路由网关routerGateway160.197.64.113Y
43路由名称routerName112.50.112.48Y
44路由子网掩码routerNetmask255.255.254.0Y
(四)phoneCardInfo-手机卡信息
序号手机卡信息名称参数名称备注示例可行性可行性描述特别说明
45手机卡国家simCountryIso手机卡国家iso代码cnY模拟器获取为NONE
46运营商名字simOperatorName运营商名字中国联通Y模拟器获取为NONE
47运营商idsimOperator运营商id46001Y/N能获取国家代码和网络代码,运营商id,没有直接获取的api模拟器获取为NONE
48手机卡状态simStateSIM_STATE_UNKNOUNKNOW、INSTALL、NONEY/N只能获取到是否插入sim卡
49移动国家代码mobileCountryCode移动国家代码NONE,1Y
(五)screenInfo-屏幕信息
序号屏幕信息名称参数名称备注示例可行性可行性描述特别说明
50屏幕高度screenWidth屏幕高度4.960638Y
51屏幕宽度screenHeight屏幕宽度2.795277Y
52屏幕密度density屏幕密度2Y
53屏幕亮度值screenBrightness屏幕亮度值 0--255YY模拟器获取为0
(六)sensorInfo-传感器信息
序号传感信息名称参数名称备注示例可行性可行性描述特别说明
54定位经度gpsLongitude定位经度Y需要用户授权位置权限在没有权限的情况下为NONE
55定位纬度gpsLatitude定位纬度Y需要用户授权位置权限
56GPS认证状态gpsStatusGPS认证状态NotDetermined、Restricted、Denied、Always、WhenInUse、NONEY
57GPS开关gpsSwitchgps开关是否打开0、1Y
(七)storageInfo-存储/内存信息
序号存储信息名称参数名称备注示例可行性可行性描述特别说明
58内存总大小totalMemorybytes为单位8589934592Y
59内部存储totalSpacebytes为单位501580873728Y
60物理内存当前占用usedMemorybytes为单位14700544Y
61app占用内存appUsedMemorybytes为单位48287744Y
62空闲的总内存freeSpacebytes为单位18707865600Y

接入指南

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;
    // 设备标识 IDFA
    clientId = "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网络信息存储信息屏幕信息传感器信息手机卡信息等信息获取工具的主要内容,如果未能解决你的问题,请参考以下文章

手机定位不准确怎么办

关于百度地图

Android平台应用启动时读写手机存储访问设备信息(如IMEI)等权限策略及提示信息

不同品牌手机的GPS位置服务名称

手机定位开启了,怎么还是定位失败

gps的信号信息是直接传到我们的手机上吗