iT邦幫忙

0

iOS 17 中存取 Apple Calendar 的權限變更

  • 分享至 

  • xImage
  •  

iOS 17 中存取 Apple Calendar 的權限變更

最近我在更新我的個人專案,準備在 App Store 上架。這個專案最初是在 iOS 17 發布之前開發的。在 iOS 17 中,存取 Apple Calendar 的權限方式有了改變,所以我花了一些時間對程式碼進行調整。這邊記錄下在不同 iOS 版本中存取行事曆權限的方法。

在 iOS 17 以前的存取方法

步驟概述

在 iOS 17 之前,要使用 Apple Calendar 需要遵循以下步驟:

  1. Info.plist 設定:在 Info.plist 中新增取用權限鍵值。
  2. 程式碼實現:在程式碼中 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.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 設定

在 iOS 17 及以後的版本中,對 Info.plist 的設定有所調整。根據所需的存取權限類型,你可以使用下列兩種設定之一:

  1. 完整取用(讀寫):使用 Privacy - Calendars Full Access Usage Description

    或以 source code 形式添加:<key>NSCalendarsFullAccessUsageDescription</key>

  2. 僅建立行程(只寫):使用 Privacy - Calendars Write Only Usage Description

    或以 source code 形式添加:<key>NSCalendarsWriteOnlyAccessUsageDescription</key>

Sample Code

在 iOS 17 中,你需要使用新的 API 方法來請求存取權限:

  1. 完整取用:調用 requestFullAccessToEvents(completion:)
  2. 僅建立行程:調用 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:)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言