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

iOS_Objective-C 同时被 2 个专栏收录
52 篇文章 0 订阅
4 篇文章 0 订阅

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";
    };
}

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值