0Pricing
Swift Academy · 课时

请求位置授权

正确处理权限和隐私。

请求位置授权 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 请求位置授权
  2. 获取用户位置
  3. 在 SwiftUI 中显示地图
  4. 地理编码与区域
← 返回 Swift Academy