最近我在更新我的個人專案,準備在 App Store 上架。這個專案最初是在 iOS 17 發布之前開發的。在 iOS 17 中,存取 Apple Calendar 的權限方式有了改變,所以我花了一些時間對程式碼進行調整。這邊記錄下在不同 iOS 版本中存取行事曆權限的方法。
在 iOS 17 之前,要使用 Apple Calendar 需要遵循以下步驟:
在 Info.plist 新增取用權限鍵值,方法如下:
Privacy - Calendars Usage Description
這個鍵值。或者使用 source code 模式開啟 Info.plist,並新增以下字段:
<key>NSCalendarsUsageDescription</key>
<string>這個 App 想要取用行事曆</string>
// ViewController.swift
import UIKit
import EventKit
class 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 的設定有所調整。根據所需的存取權限類型,你可以使用下列兩種設定之一:
完整取用(讀寫):使用 Privacy - Calendars Full Access Usage Description
。
或以 source code 形式添加:<key>NSCalendarsFullAccessUsageDescription</key>
僅建立行程(只寫):使用 Privacy - Calendars Write Only Usage Description
。
或以 source code 形式添加:<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
在 iOS 17 中,你需要使用新的 API 方法來請求存取權限:
requestFullAccessToEvents(completion:)
requestWriteOnlyAccessToEvents(completion:)
// ViewController.swift
import UIKit
import EventKit
class 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:)