swift获取app网络和本地网络权限

请求蓝牙权限:

 //蓝牙if #available(iOS 13.1, *) {let autostate = CBManager.authorizationif(autostate == .notDetermined){print("")self.manager = CBCentralManager(delegate: nil, queue: DispatchQueue.main,options: [CBCentralManagerOptionShowPowerAlertKey:false])
//                    manager.state}} else {let manager = CBCentralManager(delegate: nil, queue: DispatchQueue.main)let state:CBManagerAuthorization = manager.authorizationswitch(state){case .notDetermined:
//                    KdBLEService.shared().requestBleToothPermission()breakcase .restricted:breakcase .denied:breakcase .allowedAlways:break@unknown default:break}}

无线网权限:

CTCellularData().cellularDataRestrictionDidUpdateNotifier = {state inswitch state {case .restrictedStateUnknown://未知item.pstate = .unknownlet reachAbility:Reachability = Reachability.forInternetConnection()let wifiState:NetworkStatus = reachAbility.currentReachabilityStatus()switch(wifiState){case NotReachable:item.serviceState = falsebreakdefault:break}case .restricted://受限制if(item.pstate != .stricted){item.pstate = .strictedself.stateAsyncUpdate?()}item.pstate = .strictedcase .notRestricted://Reachability库文中尾部放入//不受限制print("第一次进来也会显示这个状态,第一次进来需要")let reachAbility:Reachability = Reachability.forInternetConnection()let wifiState:NetworkStatus = reachAbility.currentReachabilityStatus()switch(wifiState){case NotReachable:item.serviceState = falsebreakdefault:break}if(item.pstate != .on){item.pstate = .on}self.stateAsyncUpdate?()item.pstate = .on@unknown default:print("")}

本地网络权限:

class LocalNetworkPermissionTester {var connection: NWConnectionvar success = falsevar semaphore: DispatchSemaphoreinit(semaphore: DispatchSemaphore) {self.semaphore = semaphorelet dispatchQueue = DispatchQueue(label: "LocalNetworkPermissionTester")self.connection = NWConnection(host: "127.255.255.255", port: 9, using: .udp)self.connection.stateUpdateHandler = { state inswitch state {case .ready:self.success = truesemaphore.signal()case .waiting(_):
//                if #available(iOS 14.2, *) {
//                    print("reason: \(self.connection.currentPath?.unsatisfiedReason)")
//                    if case .localNetworkDenied? = self.connection.currentPath?.unsatisfiedReason {
//                        self.success = false
//                        semaphore.signal()
//                    }
//                } else {print("status: \(self.connection.currentPath?.status)")self.success = falsesemaphore.signal()
//                }default:break}}connection.start(queue: dispatchQueue) // this will trigger the prompt if necessary}
}
 public func getLocalNetPermission(item:KdPermissionItem){
//        Task.init {
//            do{
//                let isOK = try await  KdLocalNetworkManager().requestAuthorization()
//                print("ok")
//                if(!isOK){
//                    item.pstate = .stricted
//                }else{
//                    item.pstate = .unknown
//                }
//                self.stateAsyncUpdate?()
//            }catch{
//                print("exception")
//
//                item.pstate = .unknown
//                self.stateAsyncUpdate?()
//            }
//        }
//        item.pstate = .onlet semaphore = DispatchSemaphore(value: 0)let tester = LocalNetworkPermissionTester(semaphore: semaphore)semaphore.wait()print("success: \(tester.success)")if(tester.success){if(item.pstate != .on){item.pstate = .onself.stateAsyncUpdate?()}item.pstate = .on}else{if(item.pstate != .stricted){item.pstate = .strictedself.stateAsyncUpdate?()}item.pstate = .stricted}item.isNeedGet = true}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LabVIEW学习篇 - 5】:数据类型——数值、字符串

文章目录 数值枚举下拉列表控件 字符串字符串与十六进制截取字符串连接字符串 字符串与数值间的转换字符串转为数值数值转为字符串 数值 如下图所示,各种数值型数据的不同之处在于存储和表示数据时所使用的位置不同。 浮点型 整型 在LabVIEW中,想要改…

JavaScript中的LHS和RHS

LHS和RHS之前我们先来回忆一下最简单的赋值操作! var test100; console.log(test); 以上代码的意思简单我们理解为把右边的值赋值给左边的test变量,然后输出打印结果。 可是我们要是深入理解你就会发现在这个过程当中,还发生了一些其他的事情 而这些事情就是今天…

C语言 printf函数缓冲机制

printf不立即打印到stdout的原因 printf函数使用了缓冲机制。当我们调用printf时,输出通常不会立即显示在屏幕上,而是先存储在一个缓冲区中。这是为了提高I/O操作的效率。 缓存数据输出的原理 stdio库维护了一个缓冲区。当缓冲区满了,或者在特定条件下,缓冲区的内容会被刷新…

前端如何让网页页面完美适配不同大小和分辨率屏幕

推荐使用postcss插件,它会自动将项目所有的px单位统一转换为vw等单位(包括npm安装的第三方组件),从而实现适配,具体配置规则可参考官网或npm网站介绍。 另外对于大屏的适配,需要缩放网页,可使用…

欧姆龙安全PLC及周边产品要点指南

电气安全、自动化设备作业安全,向来是非常非常之重要的!越来越多的客户在规划新产线、改造既有产线的过程中,明确要求设计方和施工方将安全考虑进整体方案中进行考虑和报价!作为一名自动化电气工程师,尤其是高级工程师…

养宠经验分享猫咪经常掉毛怎么办?最值得买的宠物空气净化器分享

身为资深铲屎官,深知若偷懒不打扫,家中便成猫毛纷飞、异味缭绕的战场,尤其换季时,更是雪上加霜。长期处于这样的环境,不仅我们头疼眼涩、咳嗽气喘,对老人、小孩、孕妇等敏感群体更是健康大敌。 幸运的是&a…

Vagrant配合VirtualBox搭建虚拟机

目录 前言一、软件下载及安装1.下载2.安装扩展: 二、创建一个虚拟机1.Vagrant官方镜像仓库 三、使用远程工具连接虚拟机1.修改相关配置文件 四、虚拟机克隆及使用1.通用配置2.简单搭建一个java环境3.克隆虚拟机1.重命名虚拟机(可选)2.打包指定…

靶场练习 手把手教你通关DC系列 DC1

DC1靶场通关教程 文章目录 DC1靶场通关教程前言一、信息收集1.主机存活2.端口收集3.网页信息收集4.目录收集4.1 Nikto4.2 Dirb 信息收集总结 二、漏洞发现与利用1. 发现2. 利用 三、FlagFlag1Flag2Flag3Flag4Flag5(提权) 前言 本次使用的kali机的IP地址为192.168.243.131 DC1的…

机器学习 - 比较检验

列联表 列联表(Contingency Table)是一种用于显示两个或多个分类变量之间关系的表格。它广泛应用于统计学中的分类数据分析,尤其在独立性检验和关联性分析时。列联表的每个单元格展示了相应分类变量组合的频数(或比例&#xff09…

【2024_CUMCM】LINGO入门+动态规划

目录 什么是动态规划 怎么使用动态规划? 例题:最短路线问题 2020b-问题一 稳定性分析 灵敏度分析 什么是动态规划 基本想法:将原问题转换为一系列相互联系的子问题,然后通过逐层递推求得最后的解 基本思想:解决…

X12端口配置指南:ISA ID、测试指示符与997

通过知行之桥EDI系统实现X12 & 标准XML之间的格式转换时,需要完善交换头ISA ID及其限定符、测试标识符以及997的相关配置。 在X12文件中有两组EDI ID对,分别是发送方 ID 限定符 及发送方ID ,接收方 ID 限定符及接收方ID。 比如&#xf…

STM32Cubemx配置生成 Keil AC6支持代码

文章目录 一、前言二、AC 6配置2.1 ARM ComPiler 选择AC62.2 AC6 UTF-8的编译命令会报错 三、STM32Cubemx 配置3.1 找到stm32cubemx的模板位置3.2 替换文件内核文件3.3 修改 cmsis_os.c文件3.4 修改本地 四、编译对比 一、前言 使用keil ARM compiler V5的时候,编译…

RK3568 buildroot 使用dropbear实现ssh远程的方法

RK3568 buildroot 使用dropbear实现ssh远程的方法 文章目录 RK3568 buildroot 使用dropbear实现ssh远程的方法前言一、创建S99dropbear.sh脚本二、创建sshd_config三、添加root账户密码到系统验证登录前言 rk3568 linux 的sdk中,buildroot已经集成了dropbear的所需的lib库环境…

交替打印-GO

1 两个channel 版本 package mainimport ("fmt""sync")var wg sync.WaitGroup var c1 chan int var c2 chan intfunc A(){defer wg.Done()for i:0;i<10;i {<-c1fmt.Println(2*i)c2<-1 //牵引协程} } func B(){defer wg.Done()for i:0…

Java内存区域与内存溢出异常(自动内存管理)

序言&#xff1a;Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。 1.1概述 对于从事C、C程序开发的开发人员来说&#xff0c;在内存管理领域&#xff0c;他们既是拥有最高权力的“皇帝”&#xff0c…

使用OpenCV在按下Enter键时截图并保存到指定文件夹

使用OpenCV在按下Enter键时截图并保存到指定文件夹 在这篇博客中&#xff0c;我们将介绍如何使用OpenCV库来实现一个简单的功能&#xff1a;在按下Enter键时从摄像头截图并保存到指定的文件夹中。这个功能可以用于各种应用&#xff0c;例如监控系统、视频捕捉等。 前置条件 …

在FPGA程序中Handshake(握手)和Register(寄存器)区别

在FPGA程序中&#xff0c;Handshake&#xff08;握手&#xff09;和Register&#xff08;寄存器&#xff09;是两种不同的通信和数据传输机制。它们各有特点和适用场景。以下是它们的区别和应用场景的详细解释&#xff1a; Register&#xff08;寄存器&#xff09; 特点&#…

SQLServer用户们,你们摊上大事了!

最近一段时间&#xff0c;我们经常会收到了许多用户的咨询&#xff0c;问我们何时能纳管SQLServer&#xff1f;耐不住小伙伴们的猛烈催促及热切期待&#xff0c;本不想纳管SQLServer的研发团队也抓紧将这项需求提上日程。并在DBdoctor v3.2.2版本中成功实现了对SQLServer的纳管…

班级录取查询系统如何制作

在教育的长河中&#xff0c;我们每位老师都曾面临过这样一个问题&#xff1a;如何高效、准确地完成班级录取查询的任务&#xff1f;记得在以往&#xff0c;每当新学期伊始&#xff0c;我们不得不手忙脚乱地整理学生名单&#xff0c;然后逐一通知他们所在的班级。这个过程不仅耗…

谷歌Google Ads新账号推广方案

第一阶段重点 推广地区优化&#xff1a;分析投放国家的数据&#xff0c;剔除高花费低转化的国家&#xff0c;将预算重新分配给高性价比的国家&#xff0c;从而降低询盘成本并增加询盘数量。关键词优化&#xff1a;识别并暂停或降价高成本低回报的关键词&#xff0c;减少询盘成本…