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.

см. также:https://forums.developer.apple.com/thread/123244

Для меня TryCopyCurrentNetworkInfo всегда возвращает nil, даже если сеть настроена с NEHotspotConfiguration. Я попробовал рекомендацию Матеуша с установкой для параметра JoinOne значения false или true, но это не решило проблему.

Операционная система телефона - 13.1.3 Доступ к информации по Wi-Fi включен в моем профиле Работает в iOS 12

Другие вопросы по тегам