iOS 17 中存取 Apple Calendar 的权限变更
最近我在更新我的个人专案,準备在 App Store 上架。这个专案最初是在 iOS 17 发布之前开发的。在 iOS 17 中,存取 Apple Calendar 的权限方式有了改变,所以我花了一些时间对程式码进行调整。这边记录下在不同 iOS 版本中存取行事曆权限的方法。
在 iOS 17 以前的存取方法
步骤概述
在 iOS 17 之前,要使用 Apple Calendar 需要遵循以下步骤:
Info.plist 设定:在 Info.plist 中新增取用权限键值。程式码实现:在程式码中 import EventKit 并调用存取权限的 instance method。Info.plist 设定
在 Info.plist 新增取用权限键值,方法如下:
在文件左侧的档案目录中选择 Info.plist,然后新增Privacy - Calendars Usage Description
这个键值。在 Value 中描述取用权限的原因,这将在取用权限 Alert 中显示给用户。或者使用 source code 模式开启 Info.plist,并新增以下字段:
<key>NSCalendarsUsageDescription</key><string>这个 App 想要取用行事曆</string>
Sample Code
// ViewController.swiftimport UIKitimport EventKitclass ViewController: UIViewController { let eventStore = EKEventStore() override func viewDidLoad() { super.viewDidLoad() eventStore.requestAccess(to: .event) { granted, error in if let error = error { print("Error requesting access: \(error.localizedDescription)") return } if granted { print("Access granted in earlier versions of iOS") } else { print("Access not granted in earlier versions of iOS") } } }}
在 iOS 17 以后的存取方法
新的 Info.plist 设定
在 iOS 17 及以后的版本中,对 Info.plist 的设定有所调整。根据所需的存取权限类型,你可以使用下列两种设定之一:
完整取用(读写):使用 Privacy - Calendars Full Access Usage Description
。
或以 source code 形式添加:<key>NSCalendarsFullAccessUsageDescription</key>
仅建立行程(只写):使用 Privacy - Calendars Write Only Usage Description
。
或以 source code 形式添加:<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
Sample Code
在 iOS 17 中,你需要使用新的 API 方法来请求存取权限:
完整取用:调用requestFullAccessToEvents(completion:)
仅建立行程:调用 requestWriteOnlyAccessToEvents(completion:)
// ViewController.swiftimport UIKitimport EventKitclass ViewController: UIViewController { let eventStore = EKEventStore() override func viewDidLoad() { super.viewDidLoad() if #available(iOS 17.0, *) { eventStore.requestFullAccessToEvents { granted, error in if let error = error { print("Error requesting access: \(error.localizedDescription)") return } if granted { print("Granted") } else { print("Not granted") } } } else { // Fallback on earlier versions eventStore.requestAccess(to: .event) { granted, error in if let error = error { print("Error requesting access: \(error.localizedDescription)") return } if granted { print("Access granted in earlier versions of iOS") } else { print("Access not granted in earlier versions of iOS") } } } }}
参考资料:
NSCalendarsUsageDescription
NSCalendarsFullAccessUsageDescription
NSCalendarsWriteOnlyAccessUsage
requestAccess(to:completion:)
requestFullAccessToEvents(completion:)
requestWriteOnlyAccessToEvents(completion:)