虛擬定位對于自己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以及防止心得