请求位置授权
正确处理权限和隐私。
请求位置授权 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
为什么定位需要权限
在 Apple 平台上,访问用户的位置属于隐私敏感操作。在 Core Location 提供任何坐标之前,您的应用必须明确请求授权。系统会在您首次请求时显示权限对话框。
- 授权由用户按应用分别授予。
- 您无法通过编程绕过授权。
import CoreLocation
let manager = CLLocationManager()Info.plist 使用说明键
请求授权之前,您必须在 Info.plist 中添加一个使用说明字符串。这些字符串会显示在权限对话框中。最重要的两个键是:
NSLocationWhenInUseUsageDescription— 用于仅在前台访问。NSLocationAlwaysAndWhenInUseUsageDescription— 也用于后台访问。
省略相关键会导致请求静默失败或应用崩溃。
<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>创建 CLLocationManager
CLLocationManager 是协调定位服务的核心对象。请创建一个实例,保持对它的强引用,并设置代理以接收回调。
final class LocationService: NSObject {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
}
}请求使用期间授权
调用 requestWhenInUseAuthorization() 来请求前台访问权限。系统只会显示一次对话框;之后会记住您的选择。如果授权状态已经确定,调用不会执行任何操作。
func requestPermission() {
manager.requestWhenInUseAuthorization()
}请求始终授权
对于后台更新(地理围栏、持续跟踪),请调用 requestAlwaysAuthorization()。Apple 要求您先获得使用期间授权,然后再提升为始终授权。请谨慎使用,并在使用说明中说明理由。
func requestAlways() {
manager.requestAlwaysAuthorization()
}读取授权状态
当前权限状态保存在 manager.authorizationStatus 中(这是 iOS 14 及更高版本中的实例属性)。可能的值包括 .notDetermined、.denied、.restricted、.authorizedWhenInUse 和 .authorizedAlways。
let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}CLLocationManagerDelegate
授权变化会通过代理异步传递。请实现 locationManagerDidChangeAuthorization(_:),以便在用户做出选择时作出响应。调用请求方法后,绝不要假设权限会立即获得。
extension LocationService: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
manager.startUpdatingLocation()
default:
print("Not authorized")
}
}
}处理被拒绝或受限制的情况
如果用户拒绝访问,您无法再次请求。相反,请检测 .denied,并引导用户前往设置。.restricted 表示访问受到家长控制或 MDM 配置文件阻止,在应用内同样无法恢复。
func handle(_ status: CLAuthorizationStatus) {
if status == .denied {
// Deep-link the user to Settings > Privacy > Location
print("Open Settings to enable location")
}
}精度授权(精确与降低)
从 iOS 14 开始,用户可以只授予降低(近似)精度。请检查 manager.accuracyAuthorization。如果确实需要精确数据(例如逐向导航),请使用 Info.plist 中定义的键调用 requestTemporaryFullAccuracyAuthorization(withPurposeKey:)。
if manager.accuracyAuthorization == .reducedAccuracy {
manager.requestTemporaryFullAccuracyAuthorization(
withPurposeKey: "PreciseForNavigation"
)
}检查定位服务是否已启用
除了按应用授予的权限之外,设备级别的定位服务开关也可能处于关闭状态。请在后台队列中检查 CLLocationManager.locationServicesEnabled()(在主线程调用可能会造成阻塞)。如果已停用,任何应用都无法接收位置。
DispatchQueue.global().async {
if CLLocationManager.locationServicesEnabled() {
print("System location is on")
} else {
print("System location is off")
}
}完整的授权流程
将这些步骤结合起来:创建 manager,设置代理,请求使用期间授权,然后在授权回调中开始更新。这是任何基于定位的功能都适用的规范模式。
final class LocationService: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
if m.authorizationStatus == .authorizedWhenInUse {
m.startUpdatingLocation()
}
}
}快速检查:授权
测试您对授权流程的理解。
回顾:请求授权
您已经学会如何安全地请求定位权限:
- 将
NSLocationWhenInUseUsageDescription(以及需要时的始终授权版本)添加到 Info.plist。 - 创建
CLLocationManager,保持强引用,并设置其代理。 - 调用
requestWhenInUseAuthorization(),仅在确有需要时再提升为始终授权。 - 在
locationManagerDidChangeAuthorization(_:)中作出响应,并处理被拒绝、受限制和降低精度的情况。
常见问题解答
「请求位置授权」课时是免费的吗?
是的 — 「请求位置授权」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「请求位置授权」这节课中我会学到什么?
正确处理权限和隐私。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「请求位置授权」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。