【问题标题】:CNCopyCurrentNetworkInfo with iOS 13CNCopyCurrentNetworkInfo 与 iOS 13
【发布时间】:2019-10-28 05:37:03
【问题描述】:

Apple 在 iOS 13 中更改了有关 WiFi 的一些内容。如果您想使用 CNCopyCurrentNetworkInfo,您的应用需要具备以下条件之一

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

来源:WWDC 19 session 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 信息功能。

感谢您的帮助!

【问题讨论】:

  • 这里有同样的问题,似乎位置权限不足以获取 SSID 名称。你找到解决办法了吗?
  • 对我来说同样的问题,但仍未解决。非常随机的事情是,如果我只是简单地关闭电话并打开电话,病房后一切正常;但是如果我以某种方式最终无法从CNCopyCurrentNetworkInfo 获取信息,无论我更改了多少次位置权限,我都不会从那里获取 ssid...
  • 我仍然面临同样的问题,有人解决了吗?

标签: ios swift captivenetwork ios13 nehotspothelper


【解决方案1】:

看起来很傻,但在某些情况下,必须重新启动才能使其正常工作,即使在 iOS 13 测试版更新之前它工作正常。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为您符合 Apple 建议的以下条件之一:

      1 : 有权访问位置的应用

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

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

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

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

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

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

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

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

      【讨论】:

      • 我在安装 iOS 14.0.1 安全更新后遇到了同样的问题,CNCopySupportedInterfaces 总是返回 nil。按照专家的建议重新启动设备后,问题消失了,CNCopySupportedInterfaces 再次工作。
      【解决方案4】:

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

      我终于想出了可靠的解决方案,通过NEHotspotConfigurationManagergetConfiguredSSIDsWithCompletionHandler:方法获取SSID。

      这是一个简单的例子:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          必须验证

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

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

          【讨论】:

            【解决方案7】:

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

            重要

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

            【讨论】:

              【解决方案8】:

              从 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 请求用户同意访问位置信息。

              【讨论】:

                【解决方案9】:

                正如我在Apple Developer Forums 中所说,CNCopyCurrentNetworkInfo 的使用现在受到限制。

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

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

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

                更新:从 iOS 13 Developer Beta 6 开始,Apple has finally updated the documentation to note the changes

                【讨论】:

                • 感谢您的回复。但这正是我上面提到的。我确实满足其中一项要求。我使用 NEHotspotConfiguration 连接到网络。成功后,我开始使用上面发布的代码检查当前的 SSID。我这样做是因为我需要知道加入过程是否成功,因为我们没有收到来自 NEHotspotConfiguration 的回调来告诉我们这一点。检查时我重试调用retrieveCurrentSSID 几次,如果我没有找到要连接的预期网络则超时
                • ....我不知道我是如何完全错过你引用我的帖子的。对于那个很抱歉!我的猜测是目前通过NEHotspotConfiguration 使用CNCopyCurrentNetworkInfo 存在错误。也许尝试(作为临时修复/确保您的其余代码是好的)启用核心位置以查看您是否能够访问?
                • 这是个好主意。我会尝试这样做,以确保我的代码没有错。不过,我不想在我的生产代码中要求位置权限:D
                • 我遇到了同样的问题。我遇到了Apps with permission to access location(如果这意味着核心位置总是授权),但仍然从电话中得到nil。我刚刚意识到我错过了Access Wi Fi information capability,如developer.apple.com/documentation/systemconfiguration/… 中所述。
                • 尽管将 位置权限 设置为 始终 并且开启了 Wi-Fi 信息功能...直到iOS 13 完美运行
                【解决方案10】:

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

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

                因此,希望这会在最终版本发布之前得到解决(但不是在 iOS 13 Beta 4 中)。

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

                希望对你有帮助!

                编辑:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-16
                  • 2019-11-16
                  • 1970-01-01
                  • 2015-05-13
                  • 2012-10-25
                  相关资源
                  最近更新 更多