为什么 EKEventStore().requestFullAccessToEvents() 适用于模拟器,但不适用于真实设备?

mat*_*una 4 calendar ios eventkit swift swiftui

我正在构建一个 iOS 应用程序,它可以在 iOS 日历中以编程方式创建事件。我的代码在任何 iOS 模拟器中运行时都可以完美运行。但当安装在任何物理设备中时,它根本就不会。我究竟做错了什么?

当调用 requestAccess() 函数时,无论是在 onAppear 方法上还是在按钮内,它都不起作用。这似乎是一个身份验证问题,但没有理由它在模拟器中工作而不是在物理设备中工作。

有人遇到过同样的问题吗?有什么想法吗?或者推荐?

import Foundation
import EventKit

class EventModel {
    
    let eventStore  = EKEventStore()
    let todayDate : Date = Date()
    
    func requestAccess() {
        let status = EKEventStore.authorizationStatus(for: .event)
        if status == .authorized {
            print("Access is already granted.")
        } else {
            print(status.rawValue)
            eventStore.requestFullAccessToEvents { success, error in
                if success && error == nil {
                    print("Access has been granted.")
                } else {
                    print(error)
                    print("Access request failed with error: \(error?.localizedDescription ?? "Unknown error")")
                }
            }
        }
    }
    
    //more code and other stuff

    }
Run Code Online (Sandbox Code Playgroud)

小智 8

我能够在我们的应用程序中解决同样的问题 - 对我们来说,原因是我们没有更新我们的info.plist.

我们需要为 iOS 17 中的新日历权限添加条目。根据您的具体情况,您需要添加以下一项/两项:

<key>NSCalendarsFullAccessUsageDescription</key>
<string>YOUR DESCRIPTION</string>
<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
<string>YOUR DESCRIPTION</string>
Run Code Online (Sandbox Code Playgroud)

请注意,您可能还需要保留旧NSCalendarsUsageDescription条目,以便在旧版本的 iOS 上仍然可以使用。

希望这可以帮助!

  • 当您使用 ios17 SDK 将 Xcode 更新到 15 时,就会发生这种情况。也咬我。 (2认同)