CNCopyCurrentNetworkInfo与iOS 13

时间:2019-06-13 15:15:39

标签: ios swift captivenetwork ios13 nehotspothelper

Apple更改了有关iOS 13上WiFi的一些内容。如果要使用CNCopyCurrentNetworkInfo,则您的应用需要具有以下任一功能

  • 具有访问位置权限的应用
  • 您的应用是当前启用的VPN应用
  • 您的应用通过NEHotspotConfiguration配置了设备当前正在使用的WiFi网络

来源: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始终返回nil。

我的应用设置了“访问WiFi信息功能”。

感谢您的帮助!

10 个答案:

答案 0 :(得分:2)

我的应用中存在类似的问题。我已经向Apple提交了反馈表,并得到了答复:

  

已确定潜在的修补程序-用于将来的操作系统更新

因此,希望可以在最终发行版之前解决此问题(尽管不是在iOS 13 Beta 4中)。

要解决此问题,您可以在joinOnce = false中设置NEHotspotConfiguration。在我的应用程序中,它允许我访问CNCopySupportedInterfaces,但要求我每次关闭应用程序时都删除配置。

希望有帮助!

编辑:

似乎在iOS 13 beta 5中问题不再存在。在我的应用程序中,无论CNCopyCurrentNetworkInfo标志设置为NEHotspotConfiguration.joinOnce还是true,我都可以再次访问false(从而确认Wi-Fi已连接)。 / p>

答案 1 :(得分:1)

正如我在Apple Developer Forums上所述,CNCopyCurrentNetworkInfo的使用受到限制。

请查看WWDC 19 session 713,“网络的进步”,第2部分(可能是演示过程的75%)。 CNCopyCurrentNetworkInfo现在仅在以下三种情况下可用于您的应用程序:

  • 具有访问位置权限的应用
  • 您的应用是当前启用的VPN应用
  • 您的应用通过NEHotspotConfiguration配置了设备当前正在使用的WiFi网络

如果您不满足以下条件中的至少一项,CNCopyCurrentNetworkInfo将在iOS 13中始终返回nil

答案 2 :(得分:1)

从iOS 13开始,CNCopyCurrentNetworkInfo API将不再返回有效的Wi-Fi SSID和BSSID信息。相反,默认情况下返回的信息将是:

SSID:“ Wi-Fi”或“ WLAN”(对于中国SKU,将返回“ WLAN”)BSSID:“ 00:00:00:00:00:00”

如果您的应用使用的是此API,Apple现在建议您采用不需要Wi-Fi或网络信息的替代方法。来自CNCopyCurrentNetworkInfo的有效SSID和BSSID信息仍将提供给VPN应用,使用NEHotspotConfiguration配置当前Wi-Fi网络的应用以及已获得通过位置服务访问用户位置许可的应用。

您可以在最新的iOS 13 Beta中测试您的应用,以确保其正常运行。如果您的应用程序需要有效的Wi-Fi SSID和BSSID信息才能运行,则可以执行以下操作:对于附件设置应用程序,请使用NEHotSpotConfiguration API,该API现在可以选择传递您希望应用程序连接的SSID热点的前缀。对于其他类型的应用,请使用CoreLocation API征求用户的同意以访问位置信息。

答案 3 :(得分:1)

如果有人尝试通过案例CNCopyCurrentNetworkInfo(通过CoreLocation API和CLLocationManager)使用Apps with permission to access location,请不要忘记启用Access WiFi Information功能(另请参见此答案here )。自iOS 12起,这应该是强制性的,但是我需要更新一个在iOS 12之前经过测试的应用程序。另请参见讨论部分here

  

重要

     

要使用此功能,必须与iOS 12或更高版本链接的应用   在Xcode中启用“访问WiFi信息”功能。欲了解更多   信息,请参阅Access WiFi Information Entitlement。叫这个   没有权利的函数在链接时总是返回NULL   针对iOS 12或更高版本。

答案 4 :(得分:1)

我相信您符合Apple建议的以下条件之一:

  

1:具有访问位置权限的应用

     

2:您的应用是当前启用的VPN应用

     

3:您的应用配置了设备当前正在使用的WiFi网络   通过NEHotspotConfiguration

就我而言,即使在遇到问题时我也启用了定位服务。

经过一些解决方法后,我找到了可以尝试的两种解决方案:

1:重新启动设备。 这对我有用 !!

2:更新操作系统(如果可用)。

我不确定它是否对您有帮助,但是在少数情况下它应该可以工作,很少有人建议重新启动2-3次即可。

Apple的另一个好消息,他们已在iOS 13.3 beta版中解决了此问题

答案 5 :(得分:0)

必须验证

<key>com.apple.developer.networking.wifi-info</key>
<true/>

已添加到 Entitlements-Release.plist ,大​​部分仅添加到 Entitlements-Debug.plist

答案 6 :(得分:0)

对我来说,即使使用NEHotspotConfiguration配置了网络,TryCopyCurrentNetworkInfo始终返回nil。我通过将选项JoinOne设置为false或true尝试了Mateusz的建议,但是并不能解决问题。

电话操作系统为13.1.3 我的个人资料中启用了访问WiFi信息 它正在iOS 12中运行

答案 7 :(得分:0)

我花了数小时试图找出一种方法,使CNCopyCurrentNetworkInfo在iOS 13上无法正常工作,无论位置权限状态还是我的应用配置了设备当前的Wi-Fi网络当前通过NEHotspotConfiguration使用。只是不起作用

我终于找到了可靠的解决方案,可以通过getConfiguredSSIDsWithCompletionHandler:的{​​{1}}方法获取SSID。

这是一个简单的例子:

NEHotspotConfigurationManager

答案 8 :(得分:0)

看起来很傻,但是在某些设备中重新启动有故障的设备都可以解决。(以防SAME代码在更新前起作用...)

另请参见:

{{3}}

答案 9 :(得分:0)

我在iOS 13.0中遇到了同样的问题,但似乎苹果已在13.3中修复 在文档中要求应为应用程序添加的网络或应启用该位置或应用程序具有活动VPN的要求不适用于13.1 13.1 13.2