iOS 获取Wi-Fi的ssid和bssid

释放双眼,带上耳机,听听看~!

首先介绍一下概念

  • ssid Wi-Fi名称
  • bssid Mac地址
    这两个概念我是网上搜来的,如果不对的话还请大佬指正

ssid的设置比较简单,设置Wi-Fi的时候就可以直接设置,修改起来也比较容易;
简单粗暴的代码:

 

NSArray *ifs = CFBridgingRelease(CNCopySupportedInterfaces());
    id info = nil;
    for (NSString *ifnam in ifs) {
        info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);
        if (info && [info count]) {
            break;
        }
    }
    NSDictionary *dic = (NSDictionary *)info;
    NSString *ssid = [[dic objectForKey:@"SSID"] lowercaseString];
    NSString *bssid = [dic objectForKey:@"BSSID"];

因为公司的app是需要提交AppStore审核的,所以首先考虑到有没有涉及到私有api到问题
拒原文大佬记载:

刚开始写demo的时候,在网上查了很多资料,说是ios拿到WiFi名字的方法自从ios9出来以后就被苹果屏蔽,如果需要使用这个框架的方法需要向苹果申请资料!但是但是 其实苹果屏蔽的是属于NetworkExtension框架中的关于VPN开发的方法 如果仅仅手机使用简单的拿到WiFi的方法是可以不用申请的!

第一印象就是这么写应该是可以上架的,于是继续往下看;

 

CFArrayRef __nullable
CNCopySupportedInterfaces   (void)          __OSX_AVAILABLE_STARTING(__MAC_10_8,__IPHONE_4_1);

/*!
 @constant kCNNetworkInfoKeySSIDData
 @discussion NetworkInfo Dictionary key for SSID in CFData format
 */
extern const CFStringRef kCNNetworkInfoKeySSIDData  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);

/*!
 @constant kCNNetworkInfoKeySSID
 @discussion NetworkInfo Dictionary key for SSID in CFString format
 */
extern const CFStringRef kCNNetworkInfoKeySSID      __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);

/*!
 @constant kCNNetworkInfoKeyBSSID
 @discussion NetworkInfo Dictionary key for BSSID in CFString format
 */
extern const CFStringRef kCNNetworkInfoKeyBSSID     __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);

如果要拿到WiFi 名字和WiFi 的 mac 地址我们只需要用到CNCopySupportedInterfaces CNCopyCurrentNetworkInfo 这两个大类 而我们可以看到这两个类没有常见的被画上红色横线 更没有红色字体提示该方法或该类目已经被替换不可使用的 而在xcode7中同样如此 不信大家可以试试 那么为什么网上几乎所有的帖子都说这个方法被屏蔽了呢 包括我之前在QQ群里问了很多人 都说需要向苹果申请权限 不然会被拒 我在想 之所以说这话的人应该是用了以下方法来获得WiFi名字

 

for (NEHotspotNetwork *hot in [NEHotspotHelper supportedNetworkInterfaces]) {
        double signalStrength = hot.signalStrength;
        NSLog(@"singnalStrength : %f",signalStrength);
    }



NS_CLASS_AVAILABLE(NA, 9_0)
@interface NEHotspotHelper : NSObject
/*!
 * @method registerWithOptions:queue:handler
 * @abstract
 *   Register the application as a HotspotHelper.
 * @discussion
 *   Once this API is invoked successfully, the application becomes
 *   eligible to be launched in the background and participate in
 *   various hotspot related functions.
 *
 *   This function should be called once when the application starts up.
 *   Invoking it again will have no effect and result in FALSE being returned.
 *
 *   The 'options' dictionary may be nil, or contain the single property
 *   kNEHotspotHelperOptionDisplayName.
 *
 * @param options If not nil, 'options' is an NSDictionary containing
 *   kNEHotspotHelperOption* keys (currently just
 *   kNEHotspotHelperOptionDisplayName).
 * @param queue The dispatch_queue_t to invoke the handle block on.
 * @param handler The NEHotspotHelperHandler block to execute to process
 *   helper commands.
 * @return
 *   YES if the registration was successful, NO otherwise.
 * @note Notes
 * @note 1
 *   The application's Info.plist MUST include a UIBackgroundModes array
 *   containing 'network-authentication'.
 * @note 2
 *   The application MUST set 'com.apple.developer.networking.HotspotHelper'
 *   as one of its entitlements. The value of the entitlement is a boolean
 *   value true.
 */

大家可以看到 在这个类目的使用下面有两个注意点 1、plist文件必须包括一个UIBackgroundModes数组,里面含有“网络身份验证”信息 2、应用程序必须设置“com.apple.developer.networking.HotspotHelper”*作为其权利之一。而这两点 就是提醒我们如果要使用这个类 必须向苹果申请开发权限 否则不可使用该类 。 其实,如果我们只是做简单的拿到手机所连接的WiFi名字和mac地址 是可以用另外的方法的,也就不需要想苹果申请权限 ,而苹果公司给我的被拒的邮件中也充分说明了这一点 ,我估计是因为网上很多人都以为只要是使用NetworExtension这个类的方法就一定要申请开发权限 ,其实不是的 ,苹果只是禁止了部分权限而已,大家还是以官方文档作为唯一参考吧!!!

参考地址:http://www.jishudog.com/6905/html

 

人已赞赏
iOS文章

IOS获取WiFi名字和mac地址一点心得(CNCopySupportedInterfaces() 的方法只是部分废弃,依旧可以用来获取SSID)

2019-12-20 13:21:38

iOS文章

iOS开发代码规范

2019-12-20 17:18:54

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索