25

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 13CNCopyCurrentNetworkInfo总是返回 nil。

我的应用程序设置了访问 WiFi 信息功能。

谢谢你的帮助!

4

10 回答 10

14

正如我在Apple Developer ForumsCNCopyCurrentNetworkInfo上所说,现在使用受到限制。

查看WWDC 19 会议 713,网络进步,第 2 部分(可能是演示文稿的 75%)。CNCopyCurrentNetworkInfo现在仅在以下三种情况下可供您的应用使用:

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

更新:从 iOS 13 Developer Beta 6 开始,Apple 终于更新了文档以记录更改

于 2019-06-18T00:34:41.840 回答
4

如果有人尝试CNCopyCurrentNetworkInfo通过案例使用Apps with permission to access location(通过 CoreLocation API 和 CLLocationManager),请不要忘记启用访问 WiFi 信息功能(另请参阅此处的答案)。从 iOS 12 开始,这应该是强制性的,但我需要更新在 iOS 12 之前最后一次测试的应用程序。另请参阅此处的讨论部分:

重要的

要使用此功能,与 iOS 12 或更高版本关联的应用必须在 Xcode 中启用 Access WiFi Information 功能。有关更多信息,请参阅访问 WiFi 信息权利。在与 iOS 12 或更高版本链接时,在没有权利的情况下调用此函数始终返回 NULL。

于 2019-08-19T16:18:49.277 回答
4

我的应用程序中有类似的问题。我已向 Apple 提交了一份反馈表,并得到了回复:

确定的潜在修复 - 用于未来的操作系统更新

所以希望这将在最终版本之前得到解决(但不是在 iOS 13 Beta 4 中)。

对于解决方法,您可以joinOnce = falseNEHotspotConfiguration. 在我的应用程序中,它允许我访问CNCopySupportedInterfaces,但每次我的应用程序关闭时都要求我删除配置。

希望能帮助到你!

编辑:

似乎在 iOS 13 beta 5 中问题不再存在。在我的应用程序中,我可以CNCopyCurrentNetworkInfo再次访问(从而确认 Wi-Fi 已连接),无论NEHotspotConfiguration.joinOnceflag 是否设置为truefalse

于 2019-07-29T10:58:15.583 回答
1

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

1:有权访问位置的应用程序

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

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

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

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

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

2:如果可用,请更新操作系统。

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

Apple 的另一个好消息是他们在 iOS 13.3 测试版上解决了这个问题

于 2019-11-26T12:02:07.613 回答
1

必须验证

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

被添加到Entitlements-Release.plist,大部分只是添加到Entitlements -Debug.plist

于 2019-09-26T10:00:30.947 回答
0

看起来很傻,但在某些情况下,即使在 iOS 13 Beta 更新之前它运行良好,也必须重新启动才能使其正常工作。

另见: https ://forums.developer.apple.com/thread/123244

于 2019-12-18T17:53:02.317 回答
0

我花了几个小时试图找出一种方法让CNCopyCurrentNetworkInfoiOS 13 上的工作没有任何结果,无论位置权限状态还是我的应用程序配置了设备当前正在使用的当前 Wi-Fi 网络NEHotspotConfiguration。它只是行不通

我终于想出了可靠的解决方案,getConfiguredSSIDsWithCompletionHandler:通过NEHotspotConfigurationManager.

这是一个简单的例子:

static func retrieveCurrentSSID(  callback: @escaping ( String? ) -> Void ){
    NEHotspotConfigurationManager.shared.getConfiguredSSIDs { ( networkSSIDs ) in
        callback( networkSSIDs.first )
    }
}

于 2019-11-19T16:45:29.987 回答
0

从 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 测试版上测试您的应用,以确保其正常运行。如果您的应用程序需要有效的 Wi-Fi SSID 和 BSSID 信息才能运行,您可以执行以下操作: 对于配件设置应用程序,使用 NEHotSpotConfiguration API,它现在可以选择传递您的应用程序期望连接到的 SSID 热点的前缀. 对于其他类型的应用,请使用 CoreLocation API 请求用户同意访问位置信息。

于 2019-08-07T20:23:47.903 回答
0

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

手机操作系统是 13.1.3 在我的个人资料中启用了访问 WiFi 信息它在 iOS 12 中工作

于 2019-11-18T00:54:36.100 回答
0

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

于 2020-01-20T18:12:00.800 回答