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

前戏

苹果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本地网络权限内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • iOS 本地视频和网络视频流播放实例代码

    需求:最近公司需要做一个楼宇对讲的功能:门口机(连接WIFI)拨号对室内机(对应的WIFI)的设备进行呼叫,室内机收到呼叫之后将对收到的数据进行UDP广播的转发,手机(连接对应的WIFI)收到视频流之后,实时的展示视频数据(手机可以接听,挂断,手机接听之后,室内机不展示视频,只是进行转发.) 简单点说就是手机客户端需要做一个类似于直播平台的软件,可以实时的展示视频,实时的播放接收到的声音数据,并且实时将手机麦克风收到的声音回传给室内机,室内机负责转发给门口机. 之前从来做过视频播放都是本地文件的

  • 浅谈关于如何检测iOS14本地网络权限的一些思路

    前戏 苹果iOS 14针对本地局域做了一些权限限制,详情见链接:https://developer.apple.com/videos/play/wwdc2020/10110/ wwdc翻译过来凑字数的 什么是本地网络? 这里的本地网络其实就是我们常说的局域网,是将设备接入路由器以后形成的网络,设备可以通过这张网络互相通信,如我们的设备发现.设备绑定.局域网优先等功能都是使用的本地网络. 从 iOS 13 开始,应用想要获得当前连接到的 Wi-Fi 名称,那就必须要获得定位权限.因为通过识别 Wi

  • 浅谈C#手机号换成111XXXX1111 这种显示的解决思路

    如下所示: String subStr=phone.Substring(3,4); oldcellphone.Text = phone.Replace(subStr,"****"); /// <summary> /// 替换手机号中间四位为* /// </summary> /// <param name="phoneNo"></param> /// <returns></returns> pro

  • 浅谈基于SpringBoot实现一个简单的权限控制注解

    注解是 JDK 5.0 引入的一种注释机制.注解可以作用在类型(类.接口.枚举等).属性.方法.参数等不同位置,具体的 JDK 版本所支持的注解位置可参考 java.lang.annotation.ElementType .此外还有注解的策略,也就是 RetentionPolicy ,这里不加赘述. 注解可以实现很多功能,其中最主要的就是进行代码标注,所以有时候注解也叫做标注.使用起来也基本顾名思义,就是对代码进行标注,简化部分代码的逻辑. 下面我们就着手实现一个简单的权限控制注解,来对注解有一

  • 浅谈Emergence.js 检测元素可见性的 js 插件

    Emergence.js 是一个轻量级,高性能的 JS 插件,用于检测和操作浏览器中的元素. 这个插件被设计为允许根据浏览器中的可见性对元素进行操作.它使开发人员可以自由使用自己的 CSS 或JS 来查看动画还是状态的改变.它利用 HTML5 数据属性而不是类来简化开发.Emergence.js 是同类型中最轻,最兼容的插件之一. emergence.js 的特点 无需依赖其他组件 支持IE8 +和所有现代浏览器 压缩后只有1kb 安装 Emergence.js 的安装非常的简单.npm的安装方

  • 浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)

    我们通过前篇:<浅谈web上存漏洞及原理分析.防范方法(安全文件上存方法)>,已经知道后端获取服务器变量,很多来自客户端传入的.跟普通的get,post没有什么不同.下面我们看看,常见出现漏洞代码.1.检测文件类型,并且用用户上存文件名保存 复制代码 代码如下: if(isset($_FILES['img'])){    $file = save_file($_FILES['img']); if($file===false) exit('上存失败!'); echo "上存成功!&qu

  • 浅谈jQuery为哪般去掉了浏览器检测

    由于做HTML5相关的项目,许多前卫时髦的前端技术就需要考虑一下IE是否支持.要是在以前,可以很方便地调用jQuery的jQuery.browser来实现. If(jQuery.browser.msie) alert("DIE IE!") 但这一便利在jQuery 1.9之后就不复存在了.突然觉得像失去了一个最亲密的战友,一个我一搞开发就离不开的好基友,一个我离开了就 无法写出跨浏览器的前端代码的好工具.一下子我竟不知道该如何是好. 然后每次需要考虑IE的时候,我就会去google一下

  • 浅谈java运用注解实现对类中的方法检测的工具

    创建自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test { } 建立测试类 public class UserTest { @Test public void testInsert() { User user = null; System.out.println(user.getUsername()); } @Test public void testQuery(

  • 浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

    步骤如下: 1.图片灰化: 2.中值滤波 去噪 3.求图片的光影(自动光学检测) 4.除法去光影 5.阈值操作 6.实现了三种目标检测方法 主要分两种连通区域和findContours 过程遇到了错误主要是图片忘了灰化处理,随机颜色的问题.下面代码都已经进行了解决 这是findContours的效果 下面是连通区域的结果 #include <opencv2\core\utility.hpp> #include <opencv2\imgproc.hpp> #include <o

  • 浅谈JAVA 类加载器

    类加载机制 类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个 java.lang.Class 实例.一旦一个类被载入 JVM 中,同个类就不会被再次载入了.现在的问题是,怎么样才算"同一个类"? 正如一个对象有一个唯一的标识一样,一个载入 JVM 中的类也有一个唯一的标识.在 Java 中,一个类用其全限定类名(包括包名和类名)作为标识:但在 JVM 中,一个类用其全限定类名和其类加载器作为唯一标识.例如,如果在 pg 的包中有一个名为 Person 的类,被类加载器 Cl

  • 浅谈Python爬虫原理与数据抓取

    通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为通用爬虫和聚焦爬虫两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 通用搜索引擎(Search Engine)工作原理 通用网络爬虫从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果. 第一步:抓取网页

随机推荐