gpt4 book ai didi

ios - 检测 EKStore 是否允许创建日历

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:43 26 4
gpt4 key购买 nike

我正在开发一个需要将数据发布到用户的 calDAV 日历(iCloud 或其他)的应用程序。为此,我需要检测该来源是否允许创建日历和提醒。

EKSource 在检测任何方面没有提供太多,除了为您提供源类型(本地、calDAV、Exchange...)

我想到的检测这是否可行的唯一方法是实际尝试编写一个新日历并查看任何错误消息,如下所示:

 -(BOOL)ekSourceWritesToEvents:(EKSource *)ekSource {
BOOL writesToEvents = NO;
//Try to write a calendar to it if it fails, return NO
//If you succeed, return YES, since this is uncommitted, no damage done
NSError *error = nil;
EKCalendar *testCalendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];
testCalendar.title = @"TestCalendar";
testCalendar.source = ekSource;

BOOL result = [self.eventStore saveCalendar:testCalendar commit:NO error:&error];
if (result) {
NSLog(@"This Source can create calendars: %@",ekSource.title);

//Now check if one can create an event
EKEvent *newEvent = [EKEvent eventWithEventStore:self.eventStore];
newEvent.title = @"TestEvent";
newEvent.startDate = [NSDate date];
newEvent.endDate = [NSDate date];
newEvent.calendar = testCalendar;

NSError *eventCreateError = nil;
[self.eventStore saveEvent:newEvent span:EKSpanThisEvent commit:NO error:&eventCreateError];

if (eventCreateError) {
NSLog(@"Cannot Create EKEvent in test Calendar %@",eventCreateError.localizedDescription);
writesToEvents = NO;
} else {
writesToEvents = YES;
//Delete it even if uncommitted or it seems to get commited at some point
NSError *eventDeleteError = nil;
[self.eventStore removeEvent:newEvent span:EKSpanThisEvent commit:YES error:&eventDeleteError];
if (eventDeleteError) {
NSLog(@"Error removing event: %@",eventDeleteError.localizedDescription);
}

}
NSError *calendarDeleteError = nil;
[self.eventStore removeCalendar:testCalendar commit:YES error:&calendarDeleteError];
if (calendarDeleteError) {
NSLog(@"Error removing test calendar: %@",calendarDeleteError.localizedDescription);
}

} else {
NSLog(@"Cannot Save Calendar: %@.", error);
}
return writesToEvents;
}

我发现这是一种笨拙的做事方式……难道没有办法正确检测到这一点吗?我希望用户在选择目标源之前知道会发生什么,这就是为什么我想在实际尝试之前这样做。

谢谢!

更新:似乎检查日历创建是不够的。然后您还必须测试创建的日历是否允许写入...我正在调查。为什么一个人可以创建一个日历但不允许它写我无法理解...

更新 2:似乎即使我们不提交,测试日历也会以某种方式创建。所以我添加了代码以删除测试事件和日历。

更新 3:更多问题...检查日历创建功能并非全部...某些服务 (Google) 允许您在日历中创建事件,但不允许在日历中创建事件。您必须使用 Google 站点或其 API 创建日历。最重要的是,当您尝试创建 EKEvent 时,Exchange 服务器似乎存在一个错误,它实际上会给您一个日历无法创建提醒的错误。很奇怪。

最佳答案

要创建 EKCalender、EKEvent,您需要创建 EKSource(iCloud、生日、Google 帐户)的权限。如果您打印或转储 EKSource 对象,您可以看到此数据。

EKSource <0x3734900>, displayOrder:-1, isDelegate:0, isEnabledForEvents:1, isEnabledForReminders:1, ownerAddresses:{(
)}, supportsAttendeeComments:0, supportsDropBoxAttachments:0, supportsEmailValidation:0, supportsEventCalendarCreation:0, supportsFreebusy:0, supportsJunkReporting:0, supportsLikenessPropagation:0, supportsPhoneNumbers:0, supportsPrivateEvents:0, supportsManagedAttachments:0, supportsSharingScheduling:0, supportsTaskCalendarCreation:0, typeString:Birthday, supportsUnbind:1, isWritable:1, sourceIdentifier:Birthday
title : Other

我不知道为什么 Apple 文档没有描述这些属性,但是如果某些 EKSource(iCloud、生日、Google 帐户)允许创建或编辑事件日历,“supportsEventCalendarCreation”设置为 1。如果设置为 0,则失败添加 EKCalendar 和 EKEvent。(允许创建提醒的属性可能是“supportsTaskCalendarCreation”)

您需要使用此方法来访问该属性。 https://developer.apple.com/documentation/objectivec/nsobject/1412591-valueforkey?language=objc

Swift 代码如下。

func canWritesEventsToEKSource(ekSource:EKSource) -> Bool {
if let value = ekSource.value(forKey: "supportsEventCalendarCreation") as? Int,
value == 1 {
return true
} else {
return false
}
}

func canWritesRemindersToEKSource(ekSource:EKSource) -> Bool {
if let value = ekSource.value(forKey: "supportsTaskCalendarCreation") as? Int,
value == 1 {
return true
} else {
return false
}
}

关于ios - 检测 EKStore 是否允许创建日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com