iOS 12中无法获取WiFi的SSID了?别慌看这里!

前言

SSID全称Service Set IDentifier, 即Wifi网络的公开名称.在IOS 4.1以上版本提供了公开的方法来获取该信息.

但是最近,Apple于北京时间9月17日晚在官网发布了Xcode 10正式版,QiShare团队成员于9月18日中午统一升级以对现有项目做适配。期间,作者发现某项目使用Xcode 10编译出的App在iOS 12中无法获取WiFi的SSID。

敲黑板:获取WiFi的SSID是智能硬件App中配网模块的常用功能,各大厂商要针对iOS 12适配一波了(@huawei.com; @mi.com; @360.com; @jd.com; @baidu.com; @orvibo.com; @scinan.com; ...)。

获取WiFi的SSID的方法如下:

+ (NSString *)wifiSSID {

 NSString *ssid = nil;
 NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
 for (NSString *ifnam in ifs) {
  NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
  if (info[@"SSID"]) {
   ssid = info[@"SSID"];
  }
 }
 return ssid;
}

在iOS 12中,经断点调试发现info为nil。猜测是CNCopyCurrentNetworkInfo方法在iOS 12中有了变化。通过查看官方文档,发现文档中增加了Important字样的描述:

CNCopyCurrentNetworkInfo文档

Important
To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID.

重要描述
在iOS 12+中使用此方法需要在Xcode中为应用授权获取WiFi信息的能力。授权后,Xcode会自动在App ID和应用的权限列表中增加获取WiFi信息的权限。

解决方法

看到这里,解决方案就有了:Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON

解决方案步骤图示

按照上述方案操作完毕后,会发现工程的.entitlements文件中多了一对Key-Value:

.entitlements文件

至此,就能在iOS 12+中正常获取到WiFi的SSID了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

级别: ★☆☆☆☆

标签:「iOS 12」「SSID」「Access WiFi Information」「CNCopyCurrentNetworkInfo」

作者: Xs·H

审校: QiShare团队

(0)

相关推荐

  • 快速解决iOS10不能跳转系统WiFi列表的问题

    第一种方式: 在iOS10更新后,系统设置跳转被禁用,只能跳转App设置,但是最近发现苹果又更新了URLscheme,亲测可用,建议iOS10已下,还用原来的scheme #define iOS10 ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0) NSString * urlString = @"App-Prefs:root=WIFI"; if ([[UIApplication sharedApplic

  • iOS获取当前连接的wifi信息

    本文实例为大家分享了iOS获取当前连接wifi信息的具体代码,供大家参考,具体内容如下 导入框架CaptiveNetwork #import <SystemConfiguration/CaptiveNetwork.h> 获取当前连接的wifi信息 // 只能获取当前的SSID - (id)fetchSSIDInfo { NSString *currentSSID = @""; CFArrayRef myArray = CNCopySupportedInterfaces();

  • iOS获取当前设备WiFi信息的方法

    前言 最近项目有个需求,获取当前连接的wifi的信息,通过努力终于实现了,现在分享给大家,有需要的可以一起来看. 注意:本文是以Swift代码为例 1.添加模块引用 首先我们在需要获取 WiFi 信息的地方引用需要的模块: import SystemConfiguration.CaptiveNetwork 2.添加获取代码 接下来编写获取 WiFi 信息的代码,如下: //获取 WiFi 信息 func getWifiInfo() -> (ssid: String, mac: String) {

  • iOS获取当前连接的WiFi以及IP地址

    导入头文件 #import <ifaddrs.h> #import <arpa/inet.h> #import <SystemConfiguration/CaptiveNetwork.h> 核心代码: + (nullable NSString*)getCurrentLocalIP { NSString *address = nil; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL;

  • IOS 获取已连接的wifi信息的实现代码

    IOS 获取已连接的wifi信息的实现代码 首先需要   #import <SystemConfiguration/CaptiveNetwork.h> + (id)fetchSSIDInfo { NSArray *ifs = (id)CNCopySupportedInterfaces(); NSLog(@"%s: Supported interfaces: %@", __func__, ifs); id info = nil; for (NSString *ifnam in

  • iOS 12中无法获取WiFi的SSID了?别慌看这里!

    前言 SSID全称Service Set IDentifier, 即Wifi网络的公开名称.在IOS 4.1以上版本提供了公开的方法来获取该信息. 但是最近,Apple于北京时间9月17日晚在官网发布了Xcode 10正式版,QiShare团队成员于9月18日中午统一升级以对现有项目做适配.期间,作者发现某项目使用Xcode 10编译出的App在iOS 12中无法获取WiFi的SSID. 敲黑板:获取WiFi的SSID是智能硬件App中配网模块的常用功能,各大厂商要针对iOS 12适配一波了(@

  • iOS 12+ 中检测网络访问的方法

    我最近写了一篇文章,来介绍 iOS 在连接新的 Wi-Fi 网络时,如何在弹出一个 web view 以让用户登录或注册之前,检测 Captive Portals (强制网络门户).如果你连接过诸如酒店.酒吧或咖啡店等地的公共 Wi-Fi 网络,对这个应该会比较熟悉.如果你不熟悉 iOS 中 Captive Portals 的工作方式,可以查看 Solving the Captive Portal Problem on iOS 这篇文章,以了解一些背景知识. 多年来,Apple 的 Reacha

  • Android编程获取Wifi名称(SSID)的方法

    本文实例讲述了Android编程获取Wifi名称(SSID)的方法.分享给大家供大家参考,具体如下: 可以使用WifiManager和WifiInfo来获取当前Wifi连接信息 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); Log.d("wifiInfo", wifiInfo.toSt

  • 解决iOS13 无法获取WiFi名称(SSID)问题

    升级到iOS13以后,发现之前获取WiFi名称的接口失效了,返回的都是固定值"WLAN".这里可能是因为苹果对用户隐私保护问题,因为通过wifi信息可以定位到用户地理位置.所以iOS13以后如果想要继续获取WiFi名称,需要在调用接口前判断用户是否同意app使用地理位置信息. 我这里只在第一次使用时提示: NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; CGFloat version = [phone

  • iOS开发之如何获取视图在屏幕中显示的位置

    前言 相信大家在iOS开发中经常会遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可是,如果按钮是在UITableView的cell上呢?随着UITableView的滚动,按钮可能在顶部,也可能在底部,还可能在中间,左侧.右侧都有可能,那么,这个时候,怎么去计算按钮所在的位置呢?如果按钮所在的UITabelView是在另外一个UIScrollView的一个cell上呢?如果

  • Android获取wifi列表的方法

    本文实例为大家分享了Android获取wifi列表的具体代码,供大家参考,具体内容如下 接着上篇的获取蓝牙列表,这次我们来获取android设备的wifi列表,话不多少直接上代码! 1.首先我们先获取wifi权限 <!-- 以下是使用wifi访问网络所需的权限 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission and

  • 详解iOS开发中Keychain的相关使用

    一.Keychain 基础 根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等.它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的. 开发者通常会希望能够利用操作系统提供的功能来保存凭证(credentials)而不是把它们(凭证)保存到NSUserDefault

  • 如何利用python和DOS获取wifi密码

    CMD命令获取电脑里配置过的wifi信息 设定一个场景,假如我忘记了自家的wifi密码,这时候小伙伴来家里跟我开黑,问我wifi密码是多少?我就抓住了这个小秀一波的机会. 上才艺: 按下win+R键,输入CMD打开DOS窗口,然后输入以下命令查看电脑里配置过的wifi. netsh wlan show profiles 这是电脑连过的wifi,假设我家里的wifi是CMCC-CMCC,接下来我需要查看CMCC-CMCC的信息,上代码: netsh wlan show profiles CMCC-

  • 详解IOS开发中生成推送的pem文件

    详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

  • iOS实现封装一个获取通讯录的工具类详解

    前言 本文给大家介绍了关于iOS如何封装一个获取通讯录工具类的相关内容,iOS获取通讯录一共有4个framework: AddressBook, AddressBookUI, Contacts, ContactsUI; 其中 AddressBook 和 AddressBookUI 已经被iOS9时 deprecated 了, 而推出了Contacts 和 ContactsUI 取代之. 其中 AddressBookUI 和 ContactsUI 是picker出一个界面提供选择一条联系人信息并且

随机推荐