1. 程式人生 > 程式設計 >淺談關於如何檢測iOS14本地網路許可權的一些思路

淺談關於如何檢測iOS14本地網路許可權的一些思路

前戲

蘋果iOS 14針對本地局域做了一些許可權限制,詳情見連結:https://developer.apple.com/videos/play/wwdc2020/10110/

wwdc翻譯過來湊字數的

什麼是本地網路?

這裡的本地網路其實就是我們常說的區域網,是將裝置接入路由器以後形成的網路,裝置可以通過這張網路互相通訊,如我們的裝置發現、裝置繫結、區域網優先等功能都是使用的本地網路。

從 iOS 13 開始,應用想要獲得當前連線到的 Wi-Fi 名稱,那就必須要獲得定位許可權。因為通過識別 Wi-Fi 名稱, 應用就能輕鬆地在你和周圍的人之間建立大資料網路。但是不給定位許可權不代表應用就沒有辦法跟蹤你了,因為應用可以通過本地網路裡的裝置進行跟蹤。

為什麼需要向用戶申請許可權?

和iOS 13獲取WiFi名稱需要通過定位許可權類似,蘋果加強了對使用者隱私安全許可權,這裡也是類似的問題。在過去的 iOS 版本中,應用可以隨意掃描本地網路中的裝置,因此應用就可以很輕鬆地得到本地網路裡所有裝置的名稱和 MAC 地址。MAC 地址是一種確認網路裝置位置的地址,每個網絡卡都有一個唯一的 MAC 地址,加上 MAC 地址也具有唯一性,裝置廠商會按照一定的規律分配 MAC,所以不同的區域網都是獨一無二可以識別的。比方說,你從線下渠道買了個新相機,拍完照片利用相機自帶的 Wi-Fi 將照片匯入到手機上。這時候帶有某個推廣模組的應用對區域網發起了一次掃描,識別到了一個新的裝置,推廣模組會將相機的 MAC 地址上傳了雲端,進行簡單的識別對比以後,很容易知道這個 MAC 地址屬於相機。這樣帶有推廣模組的應用都會在畫像裡給你加上「相機使用者」這樣的標籤,當你下次開啟帶有同一個推廣模組的購物應用時,你就會看到推薦了一堆和相機有關的東西。

那些應用需要使用本地網路?

  • 利用本地網路進行裝置發現
  • 利用本地網路進行資料傳輸
  • 網路除錯工具

影響範圍

主要影響無法使用Socket或者Bonjour做一些區域網的發現,資料傳輸。

對區域網應用如:智慧家居類,局域網遊戲,網路測試工具等等。本人測試了下其實也沒有那麼大,因為發現這個開關,App下次啟動後可能不會生效,暫時未定位原因。

怎麼解決?

相信很多人都很奇怪為什麼不整個許可權申請或狀態查詢的介面,在翻了一些資料後發現,居然真的沒有。 連結:https://developer.apple.com/forums/tags/wwdc20-10110

很無奈!

大部分應用使用局域一般使用Socket或者Bonjour做一些局域的發現,資料傳輸。說在呼叫的時候會出現code:65 desc:no route to host。這是其實就是所謂的無本地網路許可權。但是我在測試時發現有時候即使是關掉本地網路許可權的開關,也能正常的使用UDP、TCP。簡直不敢信!難道iOS 14也會想iOS 13一開始出來一樣各種坑滿天飛?

這裡的思路是

  • 通過介面獲取本機的IP地址
  • 使用(SimplePing)來ping手機的IP

整個流程的大概耗時在0.13-0.2秒之間,大部分在0.17秒左右。可能耗時還能接受。但是不知道某些路由器是否可以設定禁止ping。如果有那就炸裂了。 下面上簡單的程式碼

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view.
  NSDictionary *router = [LDSRouterInfo getRouterInfo];
  pinger = [[SimplePing alloc] initWithHostName:router[@"ip"]];
  pinger.delegate = self;
  [self->pinger start];
  
}
- (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address {
  if (timer) {
    return;
  }
  timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,dispatch_get_main_queue());
  dispatch_source_set_timer(timer,DISPATCH_TIME_NOW,2 * NSEC_PER_SEC,0 * NSEC_PER_SEC);
  dispatch_source_set_event_handler(timer,^{
    [pinger sendPingWithData:nil];
  });
  dispatch_resume(timer);
}

- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber {
  NSLog(@"可以使用區域網");
}

- (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error {
  if (error.code == 65) {//no route to host
    NSLog(@"不可以使用區域網");
  }
}

友情提示

  • 調上面介面可以觸發首次啟動本地網路許可權的系統彈窗
  • 不知道某些路由器是否可以設定禁止ping
  • 整理流程在iPhone 6sp耗時130-200毫秒之間。平均值在160毫秒左右
  • 上面程式碼未正式上線,本人也在測試中,請酌情使用。

demo

到此這篇關於淺談關於如何檢測iOS14本地網路許可權的一些思路的文章就介紹到這了,更多相關檢測iOS14本地網路許可權內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!