最近公司项目增加了一个需求,就是做一个类似于钉钉的打卡功能,通过判断员工手机所连接的wifi是不是公司内网从而判断员工是否在办公室内打卡,并且同归不同的权限,管理员是可以设置APP的WiFi mac地址的。刚开始拿到这个需求的时候就想,苹果公司对于个人隐私这一块要求这么严格,能拿到用户手机所连接WiFi列表么。。。。。。通过各种实验之后,果然 这是个坑啊。。。。。
刚开始写demo的时候,在网上查了很多资料,说是ios拿到WiFi名字的方法自从ios9出来以后就被苹果屏蔽,如果需要使用这个框架的方法需要向苹果申请资料!但是但是 其实苹果屏蔽的是属于NetworkExtension框架中的关于VPN开发的方法 如果仅仅手机使用简单的拿到WiFi的方法是可以不用申请的!
详见代码 以下代码是完全可用的

这份代码就是之前写demo的时候看到网上几乎所有人都说这个NetworkExtension 的方法被屏蔽了 需要申请权限才能用 不然上传代码会被拒,于是乎我开始了申请权限的漫长之路。。。。步骤详情可见“http://www.jianshu.com/p/ee038189f373”。。。。 然后大概过了两三天后苹果给回复 说我的申请被拒了 。。。。。被拒的原因就是我这个需求所用的方法并没有被屏蔽 详见下图

被拒的时候急的我呀。。。。 我刚开始也以为会影响开发进度之类的。。。。后来仔细研究以后发现网络消息也不可全信啊。。。。 为什么 请看下图

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

大家可以看到在上面这个方法里面是通过 NEHotspotHelper 这个类来拿到WiFi名字的 ,而这个类就是VPN开发的必要类,并且被禁止使用了!!!如下图:

大家可以看到 在这个类目的使用下面有两个注意点 1、plist文件必须包括一个UIBackgroundModes数组,里面含有“网络身份验证”信息 2、应用程序必须设置“com.apple.developer.networking.HotspotHelper”*作为其权利之一。而这两点 就是提醒我们如果要使用这个类 必须向苹果申请开发权限 否则不可使用该类 。 其实,如果我们只是做简单的拿到手机所连接的WiFi名字和mac地址 是可以用另外的方法的,也就不需要想苹果申请权限 ,而苹果公司给我的被拒的邮件中也充分说明了这一点 ,我估计是因为网上很多人都以为只要是使用NetworExtension这个类的方法就一定要申请开发权限 ,其实不是的 ,苹果只是禁止了部分权限而已,大家还是以官方文档作为唯一参考吧!!!
网友评论
上代码,上代码,上代码,不要上图片
{
NSMutableString *completeStr = [[NSMutableString alloc] init];
NSArray *array = [infor componentsSeparatedByString:@":"];
for (int i = 0 ; i<array.count; i++) {
if ([array[i] length] != 2 && !(i == (array.count - 1))) {
[completeStr appendString:[NSString stringWithFormat:@"0%@:",array[i]]];
}else if ([array[i] length] != 2 && (i == (array.count - 1))){
[completeStr appendString:[NSString stringWithFormat:@"0%@",array[i]]];
}else{
[completeStr appendString:[NSString stringWithFormat:@"%@:",array[i]]];
}
}
return completeStr;
}
2. xx-xx-xx-xx 可能是这两种格式,你是怎样比较当前链接的wifi是不是公司设置的wifi呢?
- (NSDictionary *)SSIDInfo {
NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();
NSDictionary *info = nil;
for (NSString *ifnam in ifs) {
info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info && [info count]) {
break;
}
}
return info;
}
我查了下,好像获取iphone的mac地址最适合做这个ID.
你那获取mac地址的工具类文件可以发我吗?
邮箱:335089101@qq.com