1.改變定位用法:
? ? ? ?下一個app蚂踊,然后購買一個配合使用的外設(shè)约谈,將外設(shè)插在手機上,打開app犁钟,即可在app 上修改位置棱诱,也可以設(shè)置坐標(biāo)進行路線規(guī)劃,虛擬出行駛路徑涝动;
2.如何禁止此類修改位置的工具
2.1:高德地圖自帶方法:高德地圖自帶detectRiskOfFakeLocation方法,檢測是否存在虛擬定位風(fēng)險靡菇,默認為NO米愿,不檢測。 注意:設(shè)置為YES時较鼓,單次定位通過 AMapLocatingCompletionBlock 的error給出虛擬定位風(fēng)險提示违柏;連續(xù)定位通過 amapLocationManager:didFailWithError: 方法的error給出虛擬定位風(fēng)險提示。error格式為error.domain==AMapLocationErrorDomain; error.code==AMapLocationErrorRiskOfFakeLocation; 附帶的error的詳細信息參考 error.localizedDescription 中的描述以及 error.userInfo 中的信息(error.userInfo.AMapLocationRiskyLocateResult 表示有虛擬風(fēng)險的定位結(jié)果; error.userInfo.AMapLocationAccessoryInfo 表示外接輔助設(shè)備信息)脖母。(但是經(jīng)過實測闲孤,檢測不出)
2.2:? 活動器CMMotionActivityManager: 通過CMMotionActivityManager類烤礁,當(dāng)運動狀態(tài)發(fā)生變化時通過startActivityUpdatesToQueue監(jiān)聽回調(diào)獲取當(dāng)前的運動狀態(tài)肥照,如果GPS位置發(fā)生改變而手機狀態(tài)為靜止,則可認定為手機沒動鲤脏,是通過外設(shè)來改變的位置吕朵,也就是通過外設(shè)來作弊。(在作弊時一直晃動手機則無法識別出來)
?使用獲取運動狀態(tài)使用方法:?
?self.motionActivityManager = [[CMMotionActivityManager alloc] init];
? ? [self.motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMotionActivity *activity)
?? ? {
?? ? ? ? if(activity.walking) { //走路
?? ? ? ? }elseif(activity.running) {//跑步
?? ? ? ? }elseif(activity.automotive) {//開車
?? ? ? ? }elseif(activity.stationary) {//禁止
?? ? ? ? }elseif(activity.cycling) {騎車
?? ? ? ? }
?? ? }];
2.3:通過禁止app:找到要禁止使用的app?Url Scheme硫嘶,在自己的app的plist文件里面添加上梧税,然后通過canOpenURL來判斷手機是否安裝了禁止使用的app,如果安裝哮塞,提示刪除后再進行操作凳谦。(只有知道要禁止的app Url Scheme 才可以禁止app)
? ? ? 使用方法:
? ? if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"app1 Url Scheme"]]) {
//? ? ? ? 說明安裝了app1,提示刪除
? ? }else if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"app2 Url Scheme"]]) {
//? ? ? ? 說明安裝了app2,提示刪除
? ? }else{
//? ? ? ? 說明該手機沒有裝要禁止使用的app剔交,可以繼續(xù)走下面流程
? ? }
2.4:通過禁止外設(shè):使用EADSessionController類改衩,蘋果不支持獲取所有外設(shè)的信息,只能獲取簽過協(xié)議的外設(shè)信息竭鞍,所以首先需要找到外設(shè)的協(xié)議橄镜,將要禁止使用的外設(shè)的協(xié)議添加到info.plist文件的Supported external accessory protocols中,然后通過EADSessionController類的connectedAccessories方法獲取是否鏈接了要禁止使用的外設(shè)晒夹,如果監(jiān)測到,則說明正在使用禁止的外設(shè)喷好。(只有知道要禁止的外設(shè)協(xié)議才可以禁止外設(shè))
? ? ? ? 外設(shè)的協(xié)議是一個反向域名組成的字符串读跷,由硬件的生產(chǎn)廠商定義的;這里講一下我是如何拿到與app連接的外設(shè)協(xié)議无切,首先通過上面app下載鏈接將其ipa包下載下來钦铺,然后將ipa后綴改成zip,解壓洼哎,右鍵選擇“顯示包內(nèi)容”沼本,找到info.plist文件,在plist文件下的Supported external accessory protocols值就是該外設(shè)的協(xié)議抽兆,將這個值添加到自己app的plist文件中即可辫红。
檢測方法:
? ?[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];
? ? NSArray*array = [EAAccessoryManager sharedAccessoryManager].connectedAccessories;
//? ?如果數(shù)組array不為空,說明手機使用了禁止使用的外設(shè)
? ? // 監(jiān)聽EAAccessoryDidConnectNotification通告(有硬件連接就會回調(diào)Block)
? ? [[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidConnectNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
//? ? ? 調(diào)用這個回調(diào)著則說明該手機使用了禁止使用的外設(shè)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }];
? ? // 監(jiān)聽EAAccessoryDidConnectNotification通告(有硬件斷開連接就會回調(diào)Block)
? ? [[NSNotificationCenter defaultCenter] addObserverForName:EAAccessoryDidDisconnectNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }];
參考鏈接:ExternalAccessory | Apple Developer Documentation? ? ? ?ExternalAccessory框架? ? ?
demo鏈接:EADemo