CNCopyCurrentNetworkInfo с iOS 13
Apple изменила некоторые вещи, касающиеся Wi-Fi с iOS 13. Если вы хотите использовать CNCopyCurrentNetworkInfo, ваше приложение должно иметь одно из следующих
- Приложения с разрешением доступа к местоположению
- Ваше приложение в настоящее время включено приложение VPN
- Ваше приложение настроило сеть Wi-Fi, которую устройство в настоящее время использует через NEHotspotConfiguration
Источник: WWDC 19, сессия 713
Я настраиваю сеть с помощью NEHotspotConfiguration, но не могу больше получить текущий SSID после этого.
Следующий код отлично работал с iOS 12:
/// retrieve the current SSID from a connected Wifi network
private func retrieveCurrentSSID() -> String? {
let interfaces = CNCopySupportedInterfaces() as? [String]
let interface = interfaces?
.compactMap { [weak self] in self?.retrieveInterfaceInfo(from: $0) }
.first
return interface
}
/// Retrieve information about a specific network interface
private func retrieveInterfaceInfo(from interface: String) -> String? {
guard let interfaceInfo = CNCopyCurrentNetworkInfo(interface as CFString) as? [String: AnyObject],
let ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
else {
return nil
}
return ssid
}
С iOS 13 CNCopyCurrentNetworkInfo
всегда возвращает ноль.
Мое приложение имеет возможность доступа к информации Wi-Fi.
Спасибо за вашу помощь!
4 ответа
Как я уже говорил на форумах разработчиков Apple, использование CNCopyCurrentNetworkInfo
сейчас ограничено.
Посмотрите сессию 713 WWDC 19, Достижения в области сетей, часть 2 (возможно, 75% пути через презентацию). CNCopyCurrentNetworkInfo
теперь доступно для вашего приложения только в трех случаях:
- Приложения с разрешением доступа к местоположению
- Ваше приложение в настоящее время включено приложение VPN
- Ваше приложение настроило сеть Wi-Fi, которую устройство в настоящее время использует через NEHotspotConfiguration
Если вы не выполняете хотя бы одно из этих условий CNCopyCurrentNetworkInfo
всегда вернется nil
в iOS 13.
ОБНОВЛЕНИЕ: Начиная с iOS 13 Developer Beta 6, Apple наконец обновила документацию, чтобы отметить изменения.
У меня есть похожая проблема в моем приложении. Я отправил форму обратной связи в Apple и получил ответ о том, что:
Обнаружено потенциальное исправление - для будущего обновления ОС
Так что, надеюсь, это будет решено до финального релиза (но не в iOS 13 Beta 4, хотя).
Для обходного пути вы можете установить joinOnce = false
в вашей NEHotspotConfiguration
, В моем приложении это позволило мне получить доступ CNCopySupportedInterfaces
, но потребовал, чтобы я удалял конфигурацию каждый раз, когда мое приложение было закрыто.
Надеюсь, это поможет!
Редактировать:
Похоже, что в iOS 13 бета 5 проблема больше не сохраняется. В моем приложении я могу получить доступ CNCopyCurrentNetworkInfo
снова (подтверждая, что Wi-Fi был подключен), независимо от того, NEHotspotConfiguration.joinOnce
флаг установлен в true
или же false
,
Если кто-то пытается использовать CNCopyCurrentNetworkInfo
через дело Apps with permission to access location
(через API-интерфейс CoreLocation и CLLocationManager) не забудьте включить возможность доступа к информации Wi-Fi (см. также этот ответ здесь). Это должно быть обязательным, начиная с iOS 12, но мне нужно было обновить приложение, которое в последний раз тестировалось до iOS 12. См. Также раздел "Обсуждение" здесь:
Важный
Чтобы использовать эту функцию, приложение, связанное с iOS 12 или более поздней версией, должно включить возможность доступа к информации Wi-Fi в XCode. Для получения дополнительной информации см. Доступ к информации о правах доступа к WiFi. Вызов этой функции без разрешения всегда возвращает NULL, если он связан с iOS 12 или более поздней версией.
Необходимо убедиться, что
<key>com.apple.developer.networking.wifi-info</key>
<true/>
добавляется Entitlements-Release.plist, в основном, его просто добавляют к Entitlements-Debug.plist только
Я считаю, что вы соответствуете одному из следующих условий, предложенных Apple:
1. Приложения с разрешением на доступ к местоположению
2. Ваше приложение является активным в данный момент приложением VPN.
3. Ваше приложение настроило сеть Wi-Fi, которую устройство в настоящее время использует, через NEHotspotConfiguration.
В моем случае даже у меня включены службы определения местоположения, когда я столкнулся с проблемой.
После некоторого обходного пути я нашел два решения, которые вы можете попробовать:
1: Перезагрузите устройство. Это работает для меня!!.
2: Обновите ОС, если возможно.
Я не уверен, что это поможет вам, но в некоторых случаях это должно сработать, мало кто предлагает перезагрузку 2-3 раза, чтобы у них получилось.
Еще одна хорошая новость от Apple, что они исправляют эту проблему в бета-версии iOS 13.3.
Начиная с iOS 13, CNCopyCurrentNetworkInfo API больше не будет возвращать действительную информацию о SSID и BSSID Wi-Fi. Вместо этого по умолчанию будет возвращена следующая информация:
SSID: "Wi-Fi" или "WLAN" ("WLAN" будет возвращен для китайского SKU) BSSID: "00:00:00:00:00:00"
Если ваше приложение использует этот API, Apple теперь рекомендует вам применять альтернативные подходы, которые не требуют информации о Wi-Fi или сети. Действительная информация SSID и BSSID из CNCopyCurrentNetworkInfo по-прежнему будет предоставляться приложениям VPN, приложениям, которые использовали NEHotspotConfiguration для настройки текущей сети Wi-Fi, и приложениям, которые получили разрешение на доступ к местоположению пользователя через службы определения местоположения.
Вы можете протестировать свое приложение на последней бета-версии iOS 13, чтобы убедиться, что оно работает правильно. Если вашему приложению для работы требуются действительные данные SSID и BSSID Wi-Fi, вы можете сделать следующее: Для приложений настройки аксессуаров используйте API NEHotSpotConfiguration, который теперь имеет возможность передавать префикс точки доступа SSID, к которой ваше приложение ожидает подключиться.. Для других типов приложений используйте CoreLocation API, чтобы запросить у пользователя согласие на доступ к информации о местоположении.
У меня была такая же проблема с iOS 13.0, но похоже, что яблоко исправлено в 13.3 Требование в документе, что это должна быть либо сеть, добавленная приложением, либо это местоположение должно быть включено, или это приложение имеет активный VPN, не работает для 13.1 13.1 13,2
Я часами пытался придумать, как позволить CNCopyCurrentNetworkInfo
работает на iOS 13 без каких-либо результатов, независимо от статуса разрешений на местоположение или того факта, что мое приложение настроило текущую сеть Wi-Fi, которую устройство в настоящее время использует через NEHotspotConfiguration
. Это просто не работает.
Наконец-то я нашел надежное решение для получения SSID. getConfiguredSSIDsWithCompletionHandler:
метод NEHotspotConfigurationManager
.
Вот простой пример:
static func retrieveCurrentSSID( callback: @escaping ( String? ) -> Void ){
NEHotspotConfigurationManager.shared.getConfiguredSSIDs { ( networkSSIDs ) in
callback( networkSSIDs.first )
}
}
Кажется глупым, но в некоторых случаях необходимо перезагрузить компьютер, чтобы это работало должным образом, даже если это работало нормально до бета-обновления iOS 13.
Для меня TryCopyCurrentNetworkInfo всегда возвращает nil, даже если сеть настроена с NEHotspotConfiguration. Я попробовал рекомендацию Матеуша с установкой для параметра JoinOne значения false или true, но это не решило проблему.
Операционная система телефона - 13.1.3 Доступ к информации по Wi-Fi включен в моем профиле Работает в iOS 12