前戏

苹果iOS 14针对本地局域做了一些权限限制,详情见链接:https://developer.apple.com/videos/play/wwdc2020/10110/

wwdc翻译过来凑字数的

什么是本地网络?

这里的本地网络其实就是我们常说的局域网,是将设备接入路由器以后形成的网络,设备可以通过这张网络互相通信,如我们的设备发现、设备绑定、局域网优先等功能都是使用的本地网络。

从 iOS 13 开始,应用想要获得当前连接到的 Wi-Fi 名称,那就必须要获得定位权限。因为通过识别 Wi-Fi 名称, 应用就能轻松地在你和周围的人之间建立大数据网络。但是不给定位权限不代表应用就没有办法跟踪你了,因为应用可以通过本地网络里的设备进行跟踪。

为什么需要向用户申请权限?

和iOS 13获取WiFi名称需要通过定位权限类似,苹果加强了对用户隐私安全权限,这里也是类似的问题。在过去的 iOS 版本中,应用可以随意扫描本地网络中的设备,因此应用就可以很轻松地得到本地网络里所有设备的名称和 MAC 地址。MAC 地址是一种确认网络设备位置的地址,每个网卡都有一个唯一的 MAC 地址,加上 MAC 地址也具有唯一性,设备厂商会按照一定的规律分配 MAC,所以不同的局域网都是独一无二可以识别的。比方说,你从线下渠道买了个新相机,拍完照片利用相机自带的 Wi-Fi 将照片导入到手机上。这时候带有某个推广模块的应用对局域网发起了一次扫描,识别到了一个新的设备,推广模块会将相机的 MAC 地址上传了云端,进行简单的识别对比以后,很容易知道这个 MAC 地址属于相机。这样带有推广模块的应用都会在画像里给你加上「相机用户」这样的标签,当你下次打开带有同一个推广模块的购物应用时,你就会看到推荐了一堆和相机有关的东西。

那些应用需要使用本地网络?

  • 利用本地网络进行设备发现
  • 利用本地网络进行数据传输
  • 网络调试工具

影响范围

主要影响无法使用Socket或者Bonjour做一些局域网的发现,数据传输。

对局域网应用如:智能家居类,局域网游戏,网络测试工具等等。本人测试了下其实也没有那么大,因为发现这个开关,App下次启动后可能不会生效,暂时未定位原因。

怎么解决?

相信很多人都很奇怪为什么不整个权限申请或状态查询的接口,在翻了一些资料后发现,居然真的没有。 链接:https://developer.apple.com/forums/tags/wwdc20-10110

很无奈!

大部分应用使用局域一般使用Socket或者Bonjour做一些局域的发现,数据传输。说在调用的时候会出现code:65 desc:no route to host。这是其实就是所谓的无本地网络权限。但是我在测试时发现有时候即使是关掉本地网络权限的开关,也能正常的使用UDP、TCP。简直不敢信!难道iOS 14也会想iOS 13一开始出来一样各种坑满天飞?

这里的思路是

  • 通过接口获取本机的IP地址
  • 使用(SimplePing)来ping手机的IP

整个流程的大概耗时在0.13-0.2秒之间,大部分在0.17秒左右。可能耗时还能接受。但是不知道某些路由器是否可以设置禁止ping。如果有那就炸裂了。 下面上简单的代码

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view.
  NSDictionary *router = [LDSRouterInfo getRouterInfo];
  pinger = [[SimplePing alloc] initWithHostName:router[@"ip"]];
  pinger.delegate = self;
  [self->pinger start];
  
}
- (void)simplePing:(SimplePing *)pinger didStartWithAddress:(NSData *)address {
  if (timer) {
    return;
  }
  timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
  dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
  dispatch_source_set_event_handler(timer, ^{
    [pinger sendPingWithData:nil];
  });
  dispatch_resume(timer);
}

- (void)simplePing:(SimplePing *)pinger didSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber {
  NSLog(@"可以使用局域网");
}

- (void)simplePing:(SimplePing *)pinger didFailToSendPacket:(NSData *)packet sequenceNumber:(uint16_t)sequenceNumber error:(NSError *)error {
  if (error.code == 65) {//no route to host
    NSLog(@"不可以使用局域网");
  }
}

友情提示

  • 调上面接口可以触发首次启动本地网络权限的系统弹窗
  • 不知道某些路由器是否可以设置禁止ping
  • 整理流程在iPhone 6sp耗时130-200毫秒之间。平均值在160毫秒左右
  • 上面代码未正式上线,本人也在测试中,请酌情使用。

demo

到此这篇关于浅谈关于如何检测iOS14本地网络权限的一些思路的文章就介绍到这了,更多相关检测iOS14本地网络权限内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

浅谈关于如何检测iOS14本地网络权限的一些思路的更多相关文章

  1. java封装及四种权限修饰符详解

    这篇文章主要介绍了java封装及四种权限修饰符详解,对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值

  2. 解决npm管理员身份install时出现权限的问题

    下面小编就为大家分享一篇解决npm管理员身份install时出现权限的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  3. iOS10 权限崩溃问题详解及解决方案

    这篇文章主要介绍了iOS10 权限崩溃问题详解及解决方案的相关资料,需要的朋友可以参考下

  4. 解决修复npm安装全局模块权限的问题

    今天小编就为大家分享一篇解决修复npm安装全局模块权限的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  5. 详解适配iOS10 的相关权限设置

    在最新版本的iOS10系统中,如果你的项目中访问了隐私数据,比如:相机、相册、录音、定位、联系人等等。涉及到权限问题,本篇文章主要介绍了适配iOS10 的相关权限设置,有兴趣的可以了解一下。

  6. springboot集成shiro权限管理简单实现

    这篇文章主要介绍了springboot集成shiro权限管理简单实现,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  7. Android6.0获取动态权限代码示例

    这篇文章主要介绍了Android6.0以上获取动态权限代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  8. 快速解决PHP调用Word组件DCOM权限的问题

    下面小编就为大家分享一篇快速解决PHP调用Word组件DCOM权限的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  9. SpringBoot结合JWT登录权限控制的实现

    本文主要介绍了SpringBoot结合JWT登录权限控制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. Android 版本、权限适配相关总结

    针对 Android 6.0 (API 23)已以上版本,Google 增强全新的权限,应用程序在使用敏感权限(如拍照、查阅联系人或存储)时需要先征求用户必须赢得用户同意。

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部