虚拟定位对于自己app调试会非常有用。但是很多app开发商可能不希望自己的产品被虚拟定位给干扰了。安卓系统中,在Android7.0后,app开发商必须声明自己支持虚拟定位后,才能收到虚拟定位数据。苹果有没有做类似的功能呢?
经过测试后,发现检测虚拟定位也是非常容易的事情。
1. 如何检测注入app的修改方式:这种方式涉及到软件注入和防注入。本人对此技术了解不多,不在此展开。
2. 如何检测xcode虚拟定位:xcode虚拟定位会使用gpx协议的文件,仅仅支持坐标,不支持海拔,海拔返回值是0,并且海拔精度返回值是固定的-1。 所以检测方式非常简单: 判断海拔和海拔精度是否是这两个固定值就好了。
3. 如何检测通过iAP协议的外设定位:苹果在外设定位也做了一定的限制,首先海拔虽然能显示,但是精度只是在小数点后一位。另外,经纬度的精度也比较有限,大概仅仅是小数点后6、7位。但真实坐标的海拔精度应该是能到小数点后13-15位。所以检测方式也显得非常简单:通过判断这几个数值的精度就能确定定位是否来自外设了。
另外在git上找到个现成的检测外设定位的库:https://gitee.com/coffee__li/iap2-location-checker (本人未测试,但看了下原理和我分析的是一致的)
/**
虽然第三方app可以修改位置,只是修改了经纬度,但是其他数据并没有修改,比如海拔垂直精度等数据,我们可以从这些参数入手
NSLog(@"定位信息:%lf,%lf,%lf,%lf,%lf,%lf,%lf",location.coordinate.latitude,location.coordinate.longitude,location.horizontalAccuracy,location.verticalAccuracy,location.altitude,location.course,location.courseAccuracy,location.speed);
Xcode:22.281960,114.163171,5.000000,-1.000000,0.000000,-1.000000,-1.000000,-1.000000
爱思助手:30.879535,120.934785,5.000000,-1.000000,0.000000,-1.000000,-1.000000,-1.000000
*/
NSLog(@"定位信息:%lf,%lf,%lf,%lf,%lf,%lf,%lf",location.coordinate.latitude,location.coordinate.longitude,location.horizontalAccuracy,location.verticalAccuracy,location.altitude,location.course,location.speed);
if (-1.0 == location.verticalAccuracy&&0.0 == location.altitude) {
NSLog(@"虚拟定位");
}
参考文章
苹果虚拟定位技术原理和检测
IOS 越狱插件-虚拟定位、WIFI修改
ios开发上班打卡防虚拟定位篡改
iOS 外接设备虚拟GPS心得
如何设置iOS虚拟定位
未越狱iPhone修改定位/iPhone虚拟定位/iPhone模拟定位,苹果MFi外设
iOS判断虚拟定位
iOS 外接设备虚拟GPS以及防止心得