iOS中获取WiFi的SSID(CNCopySupportedInterfaces())

获取当前设备连接WiFi:

ios5之前可以通过读取配置文件获取,ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取.
ios4:/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
ios5:/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration

iOS4.1之后 : CNCopySupportedInterfaces()
1.引用头文件<SystemConfiguration/CaptiveNetwork.h>
2.通过CNCopySupportedInterfaces获取wifi列表,实际测试中返回数组中只有一个值,即当前连接的wifi。

+ (NSString *)getWifiSSID {

    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;
}

出现问题 :

Xcode10正式版在9月17号发布, 使用最新版的Xcode编译某项目发现App在iOS 12中无法获取WiFi的SSID.
发现 : 在iOS 12中,经断点调试发现info为nil。猜测是CNCopyCurrentNetworkInfo方法在iOS 12中有了变化。通过查看官方文档,发现文档中增加了Important字样的描述:

解决方法:

注意 : WiFi信息只有在真机上才能获取下来,在模拟器上为NULL
1.开发者证书上配置ID支持Access WiFi Information的能力
2.Xcode配置 : Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON
3.出现.entitlements文件,修改为Access WiFi Information为YES



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

更新: 在iOS13之后WiFi的SSID的获取

在iOS13中, CNCopyCurrentNetworkInfo进行了更新, 不仅要在Access WiFi Information设置为YES的情况下, 还需要符合下列三项条件中的至少一项才会返回正确的 CNCopyCurrentNetworkInfo 函数值,否则仍然会返回 nil.

- The app uses Core Location, and has the user’s authorization to use location information.
- The app uses the NEHotspotConfiguration API to configure the current Wi-Fi network.
- The app has active VPN configurations installed.

即:

- 使用定位功能,并且获得了定位服务权限的应用;
- 使用NEHotspotConfiguration配置过的Wi-Fi;
- 应用程序已安装有效的VPN配置

至少要满足其一, 接下来以开启定位功能为例:

  1. 首先, 开启WiFi权限的界面稍有改动:

     

  2. 设置可获取WiFi信息:

     

  3. info.plist文件中添加定位服务权限:

     

  4. 获取地理位置信息:

     

  5. 最后通过上文提到的getWifiSSID方法就可以获取到WiFi的SSID了.

     

其实, 在想要获取WiFi的相关信息之前, 如果APP已经满足以上三点中的任意一点的话, 其实就能正常获取到info的信息了.

补充:ios14必须开始精确定位 才能获取到wifi信息!!!
补充:ios14必须开始精确定位 才能获取到wifi信息!!!
补充:ios14必须开始精确定位 才能获取到wifi信息!!!

更加详细的另看:https://www.jianshu.com/p/7f80f669b7ba



转自:https://www.jianshu.com/p/40a917a5484b
 

 

 

要在应用程序中增加一个显示WiFi SSID的功能,可以按照以下步骤进行: 1. **获取WiFi SSID**: - 对于Android设备,可以使用`WifiManager`类来获取当前连接的WiFi SSID- 对于iOS设备,可以使用`CNCopy`CurrentNetworkInfo`函数来获取WiFi信息。 2. **权限配置**: - 对于Android设备,需要在`AndroidManifest.xml`文件中添加访问WiFi状态的权限。 ```xml <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` - 对于iOS设备,需要在`Info.plist`文件中添加访问WiFi信息的权限。 ```xml <key>NSLocationWhenInUseUsageDescription</key> <string>需要访问位置信息以获取WiFi SSID</string> ``` 3. **编写代码**: - **Android示例**: ```java import android.content.Context; import android.net.wifi.WifiManager; import android.net.wifi.WifiInfo; public String getWifiSSID(Context context) { WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); if (wifiManager.isWifiEnabled()) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ssid = wifiInfo.getSSID(); return ssid; } return null; } ``` - **iOS示例**: ```swift import SystemConfiguration.CaptiveNetwork func getWiFiSsid() -> String? { if let interfaces = CNCopySupportedInterfaces() as NSArray? { for interface in interfaces { if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? { if let ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String { return ssid } } } } return nil } ``` 4. **显示SSID**: - 在UI中添加一个文本视图或标签,并将获取到的SSID显示出来。 通过以上步骤,你可以在应用程序中增加一个显示WiFi SSID的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值