iOS: получение текущего SSID WiFi всегда равно нулю в Testflight

Ниже приведен код, который я использую, чтобы получить текущий SSID WiFi и отобразить его в своем приложении.

У меня установлены разрешения на местоположение всегда, а также необходимые значения конфиденциальности info.plist. В мой проект также добавлена ​​возможность Access WiFi Information. Когда я создаю приложение из Xcode на своем iPhone (не в симуляторе), оно работает нормально, я вижу свой WiFi SSID. Однако, когда я распространяю приложение через Testflight, оно больше не работает и ничего не возвращает.

import SystemConfiguration.CaptiveNetwork

private func getWiFiSsid() -> String? {
        var ssid: String?
        if let interfaces = CNCopySupportedInterfaces() as NSArray? {
            for interface in interfaces {
                if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
                    ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
                    break
                }
            }
        }
        return ssid
    }

Ниже приведен снимок экрана с правами, которые я распаковываю из файла ipa, показывающий, что у меня есть набор информации о доступе к WiFi: Разрешение WiFi


person Dom Bryan    schedule 30.10.2020    source источник
comment
вы включили настройку точки доступа?   -  person Leo Dabus    schedule 31.10.2020
comment
@LeoDabus Нет, вам это тоже не нужно, если у вас включены разрешения на определение местоположения   -  person Dom Bryan    schedule 31.10.2020
comment
Я никогда не пытался использовать его в тестовом полете, но это может помочь stackoverflow.com/questions/60218223/ обновлено до iOS 14   -  person Leo Dabus    schedule 31.10.2020
comment
@LeoDabus, что вы подразумеваете под включением конфигурации точки доступа?   -  person shaqir saiyed    schedule 02.11.2020
comment
@shaqirsaiyed, вы пробовали код по ссылке, которую я разместил выше? Это сработало для меня. Я не пробовал это в приложении для тест-драйва, поэтому не знаю, решит ли это вашу проблему. dropbox.com/s/7dv44abllo7zdly/Router%20MacAddress.zip? дл=1   -  person Leo Dabus    schedule 02.11.2020
comment
@ЛеоДабус, спасибо. Я еще не пробовал, но думаю, что это должно сработать и для меня. Единственное, что заставляет меня задаться вопросом, будет ли это одобрено Apple, поскольку некоторые предполагают, что для процесса проверки требуются дополнительные разрешения. это так ?   -  person shaqir saiyed    schedule 02.11.2020
comment
@shaqirsaiyed относительно утверждения APPStore, я не знаю. Я думаю, что для испытательного полета у вас не возникнет проблем.   -  person Leo Dabus    schedule 02.11.2020
comment
@LeoDabus хорошо, спасибо, я попробую это.   -  person shaqir saiyed    schedule 03.11.2020


Ответы (2)


Поскольку CNCopyCurrentNetworkInfo устарел в iOS 14 (https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo) рассмотрите возможность перехода на NEHotspotNetwork.fetchCurrent, и мы можем использовать этот метод с авторизацией пользователя для доступа к точному местоположению, например:

import CoreLocation
import NetworkExtension

var locationManager: CLLocationManager?

...

locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()

...

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedAlways || status == .authorizedWhenInUse {
        NEHotspotNetwork.fetchCurrent { hotspotNetwork in
            if let ssid = hotspotNetwork?.ssid {
                print(ssid)
            }
        }
    }
}

ПРИМЕЧАНИЕ: вы также должны установить Access WiFi Information в YES в вашем файле прав, Privacy - Location Always and When In Use Usage Description и Privacy - Location When In Use Usage Description в вашем Info.plist.

person iUrii    schedule 02.11.2020
comment
Привет @iUrii, я не уверен, что это идеально. В документации Apple говорится, что вам нужно специальное право NEHotspotHelper is only useful for hotspot integration. There are both technical and business restrictions that prevent it from being used for other tasks, such as accessory integration or Wi-Fi based location. Before using NEHotspotHelper, you must first be granted a special entitlement (com.apple.developer.networking.HotspotHelper) by Apple. For more information, see Hotspot Helper Request. - person Dom Bryan; 02.11.2020
comment
Обратите внимание, что право com.apple.developer.networking.HotspotHelper требует заполнения анкеты, и вам может не быть предоставлено право на такие вещи, как просто получение имени WiFi. - person Dom Bryan; 02.11.2020
comment
@DomBryan Из документации SDK fetchCurrent: 1. приложение использует CoreLocation API и имеет разрешение пользователя на доступ к точному местоположению, поэтому это достаточное условие для получения ssid (то же условие, что и для CNCopyCurrentNetworkInfo). - person iUrii; 02.11.2020
comment
@iUrii вы уверены, что это безопасно использовать только для определения текущей информации о WiFi? Я также получаю ноль для своего Wi-Fi SSID в обновлении iOS 14. - person shaqir saiyed; 02.11.2020
comment
Согласен с @iUrii Метод fetchCurrentWithCompletionHandler: * Этот метод возвращает SSID и BSSID текущей сети Wi-Fi, когда * запрашивающее приложение соответствует одному из следующих 4 требований -. * 1. приложение использует CoreLocation API и имеет разрешение пользователя на доступ к точному местоположению. * 2. приложение использовало NEHotspotConfiguration API для настройки текущей сети Wi-Fi. * 3. В приложении установлены активные конфигурации VPN. * 4. В приложении установлена ​​активная конфигурация NEDNSettingsManager. - person shaqir saiyed; 03.11.2020
comment
Я думаю, что вы, возможно, упустили смысл моего комментария. NEHotspotHelper очень специфичен и требует заполнения анкеты, чтобы получить разрешение на его использование. Если вы попытаетесь сделать это сейчас, вы увидите Hotspot Helper Request Thank you for your interest in the NEHotspotHelper API. The NEHotspotHelper interface allows Wi-Fi network implementers to facilitate connections to the large-scale wireless networks that they manage. For a complete explanation of all Wi-Fi management APIs available on iOS, see Technical Q&A QA1942: iOS Wi-Fi Management APIs. Это не мой вариант использования. - person Dom Bryan; 03.11.2020

Пока это четко не задокументировано. Вам не нужно специальное разрешение от NEHotspotHelper. Тебе нужно:

  • Доступ к информации о WiFi = ДА (в правах добавьте ее вручную или с помощью подписи xcode и возможностей вашей цели)
  • Конфиденциальность — местоположение всегда и описание использования при использовании (в Info.plist)
  • Конфиденциальность — местоположение при использовании Описание использования (в Info.plist)
  • Location access granted via
    • locationManager = CLLocationManager()
      locationManager?.requestAlwaysAuthorization()
      
person Burtan    schedule 03.01.2021