当前位置: 首页 > news >正文

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)。 特别是,使用反映应用需求的值配置 distanceFilterdesiredAccuracy 属性。

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 可以获取的授权。

OptionAuthorization
Allow While Using AppWhen In Use authorization that does not expire.
Allow OnceTemporary When In Use authorization that expires when the app is no longer in use.
Don’t AllowDenied; 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 的字符串授予权限。 用户提示显示以下选项,这些选项确定您的应用程序可以获得的授权:

OptionAuthorization
Keep Only While UsingCore Location leaves the authorization as When In Use. The delegate doesn’t receive any updates.
Change to Always AllowCore Location grants your app Always authorization. The delegate recieves CLAuthorizationStatus.authorizedAlways.
Request Always Authorization Directly

如果您的应用程序的当前状态为 CLAuthorizationStatus.notDetermined 并且您调用了 requestAlwaysAuthorization(),则 Core Location 在完全启用 Always 授权之前会使用两个提示。

第一个提示立即显示 NSLocationWhenInUseUsageDescription 中的字符串。 用户提示显示以下选项,这些选项确定您的应用程序收到的授权:

OptionAuthorization
Allow While Using AppCore Location grants your app a Provisional Always authorization. The delegate receives CLAuthorizationStatus.authorizedAlways.
Allow OnceCore 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 AllowCore Location marks your app with Denied authorization. The delegate receives CLAuthorizationStatus.denied.

当 Core Location 准备向需要 CLAuthorizationStatus.authorizedAlways 的应用程序传递事件时,会显示第二个提示。 如果应用程序处于 Provisional Always 状态,系统会显示第二个提示,其中包含来自 NSLocationAlwaysUsageDescription 的字符串。 当您的应用未运行时,Core Location 通常会显示第二个提示。

如果用户在临时始终状态下出现第二个提示时选择授予权限,您的应用程序将获得永久始终授权。 当用户响应时,您的应用会收到位置事件或使用修改后的授权调用您的委托。

当显示第二个提示时,用户会看到以下选项之一:

OptionAuthorization
Keep Only While UsingCore Location changes the authorization to When In Use. The delegate receives CLAuthorizationStatus.authorizedWhenInUse.
Change to Always AllowCore 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 源码中我们可以发现&#xff0c;HashMap的初始化有一下四种方式 //HashMap默认的初始容量大小 16&#xff0c;容量必须是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寄存器的父为标志位和备份区域中的寄存器以外&#xff0c;系统复位 将复位所有寄存器至它们的复位状态。 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a; 1.NRST引脚上的 低 电平&#xff0c;即 外部复位&#xff1b;2…...

javaSE系列之方法与数组的使用

[TOC] javaSE系列之方法与数组的使用 方法的定义 方法类似于C语言中的"函数"。 方法的种类 这里方法分为有参方法也分为无参方法&#xff0c; 形参和实参是两个实体&#xff08;这里相当于函数的传值调用和传址调用&#xff09; 1.非静态方法&#xff1a;普通方法/…...

常用命令总结

将常用命令汇集于此&#xff0c;以便在忘记的时候查询&#xff0c;持续更新…… Git Local changes 添加名字&#xff1a; git config --global user.name "<你的名字>"添加邮件&#xff1a; git config --globa user.email "<你的邮箱>"…...

【Linux:程序地址空间--原来操作系统也喜欢画大饼】

目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析&#xff1a; 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实现简单信号滤波实战

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

Java(110):非对称加密RSA的使用(KeyPair生成密钥)

Java(110)&#xff1a;非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥&#xff0c;即公钥 私钥&#xff0c;将公钥提供给调用方&#xff0c;调用方使用公钥对数据进行加密后&#xff0c;服务方根据私钥进行解密。 1、RSA生…...

(Mybatis 学习【1】)整合 Mybatis 开发流程

Mybatis 整合流程 ① 添加MyBatis的依赖 ② 创建数据库表 ③ 编写pojo实体类 ④ 编写映射文件UserMapper.xml ⑤ 编写核心文件mybatis-config.xml ⑥ 编写测试类** 编写 pojo 实体类 (设计相应的数据库&#xff09; Data AllArgsConstructor NoArgsConstructor public class…...

一文搞懂Kerberos

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

Go爬虫学习笔记(三)

day3 ‍ 04&#xff5c;敏捷之道&#xff1a;大型Go项目的开发流程是怎样的&#xff1f; 瀑布模式 流程&#xff1a; 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景&#xff1a; 需求在规划和设计阶段就已经确定了&#xff0c;而且在项目开发周期内&…...

CASTEP参数设置(2)

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

浅谈对Promise的理解以及在工作中的应用

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

开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航

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

Java多线程系列--synchronized的原理

原文网址&#xff1a;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开发板&#xff08;针对ARM-32bit的有另一篇文…...

Linux->进程程序替换

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

最强分布式锁工具:Redisson

1 Redisson概述1.1 什么是Redisson&#xff1f;Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...

Java9-17新特性

Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员&#xff1a; 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员&#xff1a; 私有的方法 为什么JDK1.9要允许接口定义私有方法呢&#xff1f;因为我们说接口是规范&#xff0c;规范时需要公开…...

电脑开机找不到启动设备怎么办?

电脑正常开机&#xff0c;却提示“找不到启动设备”&#xff0c;这时我们该怎么办呢&#xff1f;本文就为大家介绍几种针对该问题的解决方法&#xff0c;一起来看看吧&#xff01;“找不到启动设备”是什么意思&#xff1f;可引导设备&#xff08;又称启动设备&#xff09;是一…...

使用langchain打造自己的大型语言模型(LLMs)

我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知&#xff0c;无所不能&#xff0c;但是由于有机器人所学习到的是截止到2021年9月以前的知识&#xff0c;所以当用户询问机器人关于2021年9月以后发送的事情时&#xff0c;它无法给出正确的答案&#x…...

assert()宏函数

assert()宏函数 assert是宏&#xff0c;而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression&#xff0c; 如果其值为假&#xff08;即为0&#xff09;&#xff0c;那么它会打印出来assert的内容…...

Docker圣经:大白话说Docker底层原理,6W字实现Docker自由

说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群&#xff08;50&#xff09;中&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#…...

Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑

目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0…...

C#和.net框架之第一弹

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录C# 简介一、微软平台的编程二、使用VS创建第一个c#程序1、第一步2、第二步3、第三步4、第四步5、第五步C# 简介 C# 是一个现代的、通用的、面向对象的编程语言&…...

C++---背包模型---潜水员(每日一道算法2023.3.12)

注意事项&#xff1a; 本题是"动态规划—01背包"和"背包模型—二维费用的背包问题"的扩展题&#xff0c;优化思路不多赘述&#xff0c;dp思路会稍有不同&#xff0c;下面详细讲解。 题目&#xff1a; 潜水员为了潜水要使用特殊的装备。 他有一个带2种气体…...

C++类的成员变量和成员函数详解

类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类…...

(枚举)(模拟)(位运算)116. 飞行员兄弟

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 116. 飞行员兄弟 - AcWing题库 我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦…...

详解Array.prototype.shift.call(arguments)

经常看到如下代码&#xff1a; function foo() {let k Array.prototype.shift.call(arguments);console.log(k) } foo(11,22) //11 Array.prototype.shift.call(arguments)的作用是&#xff1a; 取 arguments 中的第一个参数 一、为啥要这么写&#xff0c;不直接使用argume…...

Tina_Linux_Wi-Fi_开发指南

Tina Linux Wi-Fi 开发指南 1 前言 1.1 文档简介 介绍Allwinner 平台上Wi-Fi 驱动移植&#xff0c;介绍Tina Wi-Fi 管理框架&#xff0c;包括Station&#xff0c;Ap 以及Wi-Fi 常见问题。 1.2 目标读者 适用Tina 平台的广大客户和对Tina Wi-Fi 感兴趣的同事。 1.3 适用范…...

微网站开发用什么软件/南宁网络推广培训机构

修改工程名/包名&#xff0c;也是我们在开发中经常遇到的问题&#xff0c;比如我们在开发过程中突然觉得项目名不合适&#xff0c;或者根包名不合适想修改一下怎么办&#xff1f; 如上图所示工程&#xff0c;我想改变一下我的项目名&#xff0c;如把zzz改成xxx&#xff0c;把我…...

做网站的相关教程/百度云登录首页

原标题&#xff1a;3个基本语法&#xff01;轻松搞定R语言01. R语言所处理的工作层&#xff1a;解释一下&#xff1a;最下面的一层为数据源&#xff0c;往上是数据仓库层&#xff0c;往上是数据探索层&#xff0c;包括统计分析&#xff0c;统计查询&#xff0c;还有就是报告。再…...

服装定制属于什么行业/广州seo网络推广员

题目1&#xff1a; 查找最晚入职员工的所有信息 CREATE TABLE ‘employees’ ( ‘emp_no’ int(11) NOT NULL, ‘birth_date’ date NOT NULL, ‘first_name’ varchar(14) NOT NULL, ‘last_name’ varchar(16) NOT NULL, ‘gender’ char(1) NOT NULL, ‘hire_date’ date N…...

织梦做英文网站/seo网站技术培训

Atitit .h5文件上传 v3 1. 上传原理1 2. V3版新特性1 3. Html1 4. Js2 5. uploadV2.js2 6. upServlet &#xff06;  FileUploadService {3 7. 注意&#xff1a;&#xff1a;去除struts的干扰3 8. 参考4 1. 上传原理 FormData apache io 2. V3版新特性 组件化 &#xff0…...

盐城大丰建设局网站/郑州网站建设

前言&#xff1a;反射库&#xff08;reflection library&#xff09;是Java组件的体系结构&#xff0c;提供了一个精心设计的丰富的工具集&#xff0c;以便能够编写动态操纵Java代码的程序。反射被大量应用于JavaBeans中&#xff0c;使Java可以支持Visual Basic用户习惯使用的工…...

网站做专题/夫唯seo教程

1. 当元素失去焦点时发生 blur 事件。 $("input").blur(function(){ alert("This input field has lost its focus."); }); http://www.runoob.com/jquery/event-blur.html 2. 当输入框获取焦点的时候&#xff0c;触发的事件。 $("input").focus…...