CoreLocation的一切
Overview 概述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgnvehxf-1678717852996)(./blog_cover.png)]
Core Location 提供的服务可以确定设备的地理位置、高度和方向,或者它相对于附近 iBeacon 设备的位置。 该框架使用设备上的所有可用组件收集数据,包括 Wi-Fi、GPS、蓝牙、磁力计、气压计和蜂窝硬件。
core class - CLLocationManager 核心类
Declaration 声明
class CLLocationManager : NSObject
Detailed Analysis 详解
是管理应用程序与位置相关的行为的核心类 (central place), 可以借助其 实例对象 来配置、启动和停止位置服务。进而实现如下:
- Track (跟踪) large or small changes in the user’s current location with a configurable degree of accuracy (准确度/精度).
- Report heading changes from the onboard compass. (译: 从机载罗盘报告航向变化。)
- 监视感兴趣的地理区域并在有人进入或离开这些区域时生成事件。
- Report the range to nearby Bluetooth beacons. (译: 向附近的蓝牙信标报告范围。)
在您的应用程序中创建一个或多个 CLLocationManager 对象,并在需要位置数据的地方使用它们。 创建 CLLocationManager 对象后,对其进行配置,以便 Core Location 知道报告位置更改的频率 (how often to report location changes)。 特别是,使用反映应用需求的值配置 distanceFilter 和 desiredAccuracy 属性。
Receiving data from location services 数据是怎样传递的 ?
A CLLocationManager object reports all location-related updates to its delegate object, which is an object that conforms to the CLLocationManagerDelegate protocol.
译(zh_CN): CLLocationManager 对象将所有与位置相关的更新报告给它的委托对象,这是一个符合 CLLocationManagerDelegate 协议的对象。
这里有两点需要注意:
⓪. 当 CLLocationManager 对象完成自己的初始化, 会调用代理的
locationManagerDidChangeAuthorization(_:)
方法上报App的定位权限状态, 所以在配置 CLLocationManager 时要马上指定delegate.①. delegate方法回调与 CLLocationManager 实例化是同一线程.
官方原文如下
Assign the delegate immediately when you configure your location manager, because the system reports the app’s authorization status to the delegate’s locationManagerDidChangeAuthorization(_😃 method after the location manager finishes initializing itself. Core Location calls the methods of your delegate object using the RunLoop of the thread on which you initialized the CLLocationManager object. That thread must itself have an active RunLoop, like the one found in your app’s main thread.
Determining the availability of services 确定服务的可用性
// significant-change location service 上报明显的位置更新
class func significantLocationChangeMonitoringAvailable() -> Bool// 航向数据可能无法在所有基于 iOS 的设备上使用。在要求位置管理器传递航向相关事件之前,您应该检查此方法返回的值。
class func headingAvailable() -> Bool// 一个布尔值,指示小部件(widget)是否有资格接收位置更新。
var isAuthorizedForWidgetUpdates: Bool { get }// the level of location accuracy the app has permission to use (App有权使用的定位精度级别)
var accuracyAuthorization: CLAccuracyAuthorization { get }// 能否监控指定的区域(regionClass: A region monitoring class from the MapKit framework. This class must descend from the CLRegion class.)
class func isMonitoringAvailable(for regionClass: AnyClass) -> Bool// 最常用, 系统定位服务是否开启, 如下图所求
class func locationServicesEnabled() -> Bool
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QvDdIQA-1678717852996)(./locationServicesEnabled.jpeg)]
Requesting authorization for location services 权限请求
1. 请求 whenInUse 定位权限
func requestWhenInUseAuthorization()
您必须调用此方法或 requestAlwaysAuthorization() 才能接收与位置相关的信息。 只要当前授权状态未确定 (CLAuthorizationStatus.notDetermined),您就可以调用 requestWhenInUseAuthorization()。
Important
Your app must be in the foreground to show a location authorization prompt.
此方法异步运行 (runs asynchronously) 并提示用户授予应用程序使用位置服务的权限。 用户提示包含来自应用程序 Info.plist 文件中 NSLocationWhenInUseUsageDescription 键 (key) 对应的文本,调用此方法时需要存在该键, 否则会CRASH。 用户提示 (prompt alert window) 显示以下选项,这些选项确定您的 App 可以获取的授权。
Option | Authorization |
---|---|
Allow While Using App | When In Use authorization that does not expire. |
Allow Once | Temporary When In Use authorization that expires when the app is no longer in use. |
Don’t Allow | Denied; no further authorization requests are allowed. |
在用户做出选择并确定 (determines) 状态后,位置管理器 (the location manager, 即使 CLLocationManager 实例) 将结果传递给委托的 locationManager(_:didChangeAuthorization:)
方法。 如果方法调用前的初始授权状态不是 CLAuthorizationStatus.notDetermined
,则此方法不执行任何操作,也不会调用 locationManager(_:didChangeAuthorization:)
方法。
如果用户的选择向您的应用授予 When In Use 授权,则您的应用可以启动任何位置服务,并且有资格在使用时接收结果。 如果用户选择授予临时使用时授权,则当应用程序不再使用时授权将过期,恢复为未确定状态 (CLAuthorizationStatus.notDetermined)。
有关应用程序何时被视为 whenInUse 的信息,请参阅 Choosing the Location Services Authorization to Request。
前台启动定位服务 Vs 后台启动定位服务
- foreground starts: 当您的应用程序在前台启动标准位置服务时,如果您的应用程序在 Xcode 项目的功能选项卡中启用了后台位置更新,它们将继续在后台运行。当您的应用移动到具有活动位置服务的后台时 (moves to the background with active location services),系统会在状态栏中显示位置服务指示器 (indicator)。
- background starts: 当您的应用程序在后台运行时尝试启动位置更新将失败。
Note
在 iOS 16 及更高版本中,主动跟踪用户位置或最近启用核心位置的应用程序会在控制中心显示一个指示器 (在最顶部🔝)。 通过仅在必要时和用户期望时监视设备的位置,注意电池使用和用户隐私。
2. 请求 Always 权限
func requestAlwaysAuthorization()
Discussion 讨论
要调用此方法,您必须在应用的 Info.plist 文件中同时拥有 NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription 键。 当前授权状态为以下任一状态时,您才可以调用:
- Not Determined — CLAuthorizationStatus.notDetermined
- When In Use — CLAuthorizationStatus.authorizedWhenInUse
当用户做出权限选择时,使用 CLLocationManager 委托上的 locationManager(_:didUpdateLocations:) 方法接收更新。
Core Location 限制对 requestAlwaysAuthorization() 的调用。 在您的应用程序调用此方法后,进一步的调用无效。
Request Always Authorization After Getting When In Use
要获得 Always 授权,您的应用必须首先请求 When In Use 权限,然后再请求 Always 授权。
如果用户在您的应用程序调用 requestWhenInUseAuthorization() 后授予 When In Use 权限,则调用 requestAlwaysAuthorization() 会立即提示用户请求 Always 权限。 如果用户使用 Allow Once 响应 requestWhenInUseAuthorization(),则 Core Location 会由于临时授权而忽略对 requestAlwaysAuthorization() 的进一步调用。
Core Location 提示用户使用来自 NSLocationAlwaysUsageDescription 的字符串授予权限。 用户提示显示以下选项,这些选项确定您的应用程序可以获得的授权:
Option | Authorization |
---|---|
Keep Only While Using | Core Location leaves the authorization as When In Use. The delegate doesn’t receive any updates. |
Change to Always Allow | Core Location grants your app Always authorization. The delegate recieves CLAuthorizationStatus.authorizedAlways. |
Request Always Authorization Directly
如果您的应用程序的当前状态为 CLAuthorizationStatus.notDetermined 并且您调用了 requestAlwaysAuthorization(),则 Core Location 在完全启用 Always 授权之前会使用两个提示。
第一个提示立即显示 NSLocationWhenInUseUsageDescription 中的字符串。 用户提示显示以下选项,这些选项确定您的应用程序收到的授权:
Option | Authorization |
---|---|
Allow While Using App | Core Location grants your app a Provisional Always authorization. The delegate receives CLAuthorizationStatus.authorizedAlways. |
Allow Once | Core Location grants your app a Temporary When in Use authorization. The delegate receives CLAuthorizationStatus.authorizedWhenInUse. This authorization expires when your app is no longer in use, reverting to CLAuthorizationStatus.notDetermined. |
Don’t Allow | Core Location marks your app with Denied authorization. The delegate receives CLAuthorizationStatus.denied. |
当 Core Location 准备向需要 CLAuthorizationStatus.authorizedAlways 的应用程序传递事件时,会显示第二个提示。 如果应用程序处于 Provisional Always 状态,系统会显示第二个提示,其中包含来自 NSLocationAlwaysUsageDescription 的字符串。 当您的应用未运行时,Core Location 通常会显示第二个提示。
如果用户在临时始终状态下出现第二个提示时选择授予权限,您的应用程序将获得永久始终授权。 当用户响应时,您的应用会收到位置事件或使用修改后的授权调用您的委托。
当显示第二个提示时,用户会看到以下选项之一:
Option | Authorization |
---|---|
Keep Only While Using | Core Location changes the authorization to When In Use. The delegate receives CLAuthorizationStatus.authorizedWhenInUse. |
Change to Always Allow | Core Location removes the provisional status, making the Always authorization permanent. The delegate doesn’t receive a callback. |
如果用户在接近交付时间 (the time it was delivered) 响应提示并选择允许 Always 权限,则位置事件将发送到您的应用程序。
相关文章:
CoreLocation的一切
Overview 概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgnvehxf-1678717852996)(./blog_cover.png)] Core Location 提供的服务可以确定设备的地理位置、高度和方向,或者它相对于附近 iBeacon 设备的位置。 该框架使用设备上的所…...
HashMap原理
初始化 从HashMap 源码中我们可以发现,HashMap的初始化有一下四种方式 //HashMap默认的初始容量大小 16,容量必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // HashMap最大容量 static final int MAXIMUM_CAPACITY 1 <&…...

STM32入门笔记(02):独立看门狗(IWDG)和窗户看门狗(WWDG)(SPL库函数版)
1.IWDG狗简介 除了始终控制器的RCC_CSR寄存器的父为标志位和备份区域中的寄存器以外,系统复位 将复位所有寄存器至它们的复位状态。 当发生以下任一事件时,产生一个系统复位: 1.NRST引脚上的 低 电平,即 外部复位;2…...

javaSE系列之方法与数组的使用
[TOC] javaSE系列之方法与数组的使用 方法的定义 方法类似于C语言中的"函数"。 方法的种类 这里方法分为有参方法也分为无参方法, 形参和实参是两个实体(这里相当于函数的传值调用和传址调用) 1.非静态方法:普通方法/…...
常用命令总结
将常用命令汇集于此,以便在忘记的时候查询,持续更新…… Git Local changes 添加名字: git config --global user.name "<你的名字>"添加邮件: git config --globa user.email "<你的邮箱>"…...

【Linux:程序地址空间--原来操作系统也喜欢画大饼】
目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析: 1 #include<iostream>2 #include<unistd.h>3 using namespace std;4 5 int g_val100;6 7 int main()8 {9 pid_t idfork();10 if(i…...

Python实现简单信号滤波实战
在有些项目中需要对信号进行滤波处理,尤其是在医疗的设备中如心跳、脉搏等设备的采样后进行处理。滤波的目的就是除去某些频率的信号如噪声。常见的包括有低通滤波、高通滤波、带通滤波。 低通滤波指的是去除高于某一阈值频率的信号;高通滤波去除低于某…...

Java(110):非对称加密RSA的使用(KeyPair生成密钥)
Java(110):非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。 1、RSA生…...
(Mybatis 学习【1】)整合 Mybatis 开发流程
Mybatis 整合流程 ① 添加MyBatis的依赖 ② 创建数据库表 ③ 编写pojo实体类 ④ 编写映射文件UserMapper.xml ⑤ 编写核心文件mybatis-config.xml ⑥ 编写测试类** 编写 pojo 实体类 (设计相应的数据库) Data AllArgsConstructor NoArgsConstructor public class…...

一文搞懂Kerberos
Kerberos一词来源于古希腊神话中的Cerberus——守护地狱之门的三头犬,Kerberos是为TCP/IP 网络设计的可信第三方鉴别协议,最初是在麻省理工学院(MIT)为Athena 项目而开发的。Kerberos服务起着可信仲裁者的作用,可提供安全的网络鉴别ÿ…...

Go爬虫学习笔记(三)
day3 04|敏捷之道:大型Go项目的开发流程是怎样的? 瀑布模式 流程: 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景: 需求在规划和设计阶段就已经确定了,而且在项目开发周期内&…...

CASTEP参数设置(2)
虚拟试验(分子模拟) 在表征材料以及材料的相关性质时,只要是采用已有的理论加以解释 但是通常来说,需要采用已有的理论来进行设计和探索,伴随着工业软件的发展,应当选用仿真技术来缩小探索范围 传统试验V…...

浅谈对Promise的理解以及在工作中的应用
浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案:PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…...

开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航
户外机器人的定位导航相对于需要建图的场景来说,是比较简单容易实现的,因为可以借助第三方地图完成定位,并在第三方地图中完成路径规划和下发航点等操作,实现的难题在于如何控制机器人完成步行和转弯。 这些在不引进RTK高精度定位…...

Java多线程系列--synchronized的原理
原文网址:Java多线程系列--synchronized的原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的synchronized的原理。 反编译出字节码 Test.java public class Test {private static Object LOCK new Object();public static int main(String[] args) {synchro…...

QEMU启动ARM64 Linux内核
目录前言前置知识virt开发板ARM处理器家族简介安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文…...

Linux->进程程序替换
目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...

最强分布式锁工具:Redisson
1 Redisson概述1.1 什么是Redisson?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...
Java9-17新特性
Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范时需要公开…...

电脑开机找不到启动设备怎么办?
电脑正常开机,却提示“找不到启动设备”,这时我们该怎么办呢?本文就为大家介绍几种针对该问题的解决方法,一起来看看吧!“找不到启动设备”是什么意思?可引导设备(又称启动设备)是一…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...