我有兴趣知道如何在设备中添加日历事件,但使用swift.我知道在Objective-C中有一些例子,但目前没什么好快的.非常感谢.
我正在开发日历应用程序.我正在尝试使用指定的EKCalender保存EKEvent.但是,当我尝试运行以下代码时,它给了我错误.请帮忙
-(BOOL)createEventWithTitle:(NSString *)paramTitle startDate:(NSDate *)paramStartDate endDate:(NSDate *)paramEndDate inCalendar:(EKCalendar *)paramCalendar inEventStore:(EKEventStore *)paramStore notes:(NSString *)paramNotes
{
BOOL result = NO;
//paramCalendar = [self.eventStoreiReportShifts defaultCalendarForNewEvents];
if (self.eventsAccessGranted) {
NSArray *caledars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];
self.selectedCalendarEventKitIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"eventkit_cal_identifiers_string"];
for(EKCalendar *aCal in caledars){
if([aCal.calendarIdentifier isEqualToString:self.selectedCalendarEventKitIdentifier]){
paramCalendar = [self.eventStore calendarWithIdentifier:[[NSUserDefaults standardUserDefaults] objectForKey:@"eventkit_cal_identifiers_string"]];
}
}
for (EKSource *source in self.eventStore.sources) {
if (source.sourceType == EKSourceTypeCalDAV) {
paramCalendar.source = source;
break;
} else if(source.sourceType == EKSourceTypeLocal){
paramCalendar.source = source;
break;
}
}
}else{
return NO;
}
/* …
Run Code Online (Sandbox Code Playgroud) 在我的iOS应用程序中,我曾使用以下方法访问日历:
EKCalendar* cal = [eventStore calendarWithIdentifier:[calendarIDs objectAtIndex:i]];
Run Code Online (Sandbox Code Playgroud)
通过以下方式向用户询问权限:
eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError* error){}
Run Code Online (Sandbox Code Playgroud)
现在这在iOS 7上工作正常,但在iOS 8上,每次调用方法calendarWithIdentfier时我都会遇到以下错误:
Error getting shared calendar invitations for entity types 3 from daemon:
Error Domain=EKCADErrorDomain Code=1013
"The operation couldn’t be completed. (EKCADErrorDomain error 1013.)"
Run Code Online (Sandbox Code Playgroud)
我可以写\读日历没有问题,但我不明白为什么会引发这个异常.我已经尝试了一些这里提出的方法,但在这种情况下它们似乎都没有.
我意识到我在游戏中有点迟到准备好沙箱,但事实就是如此.
我正在为OS X 10.9开发.该应用程序显示日历事件数据,但不允许编辑,因此我启用了日历功能.
当我从Xcode运行它时,该应用程序可以很好地启用沙盒,但是当我使用开发者ID导出它时,应用程序会运行,但无法访问日历数据.更重要的是,系统永远不会要求我允许该应用访问日历数据.
当我运行应用程序时,它会启动,但不会显示任何数据.在Console中,sandboxd会抛出一堆如下所示的错误:
sandboxd: ([54]) appleeventsd(54) deny file-read-metadata /Library
和
sandboxd: ([54]) appleeventsd(54) deny mach-lookup com.apple.ocspd
我已经检查了应用程序的权利codesign -d --entitlements
,并确认它是沙盒并具有日历权利.但是,当我在应用程序中检查它是否有权访问[EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]
时,不出所料,因为它从未问过,返回EKAuthorizationStatusNotDetermined
.
我觉得我遗漏了一些关于权利,代码签名或部署的非常基本的东西,但我不知道它是什么.所以我把自己放在你的集体怜悯和智慧上.
我正在实现从我的应用程序中添加和删除iOS日历中用户创建的事件的功能.我已经为用户创建活动时编写了访问日历的权限请求,并且它运行良好.我将事件保存在服务器上,我允许它们稍后删除事件,当发生这种情况时,我也会从日历中删除事件.有人可以在此应用程序之外创建事件,打开应用程序,然后删除从服务器获取的约会.在这种情况下,日历中没有事件存储,但它仍然需要查看是否存在尝试删除它的事件,并且它失败了,因为在这种情况下我没有要求用户允许访问日历.
但我不想在删除时要求用户提供权限,因为用户不知道应用程序为什么要访问日历,因为他们从来不知道它可以将约会保存到日历 - 他们在网站上创建了它,并且他们没有理由在那个时候批准它,因为它无论如何都不会做任何事情.
因此,我的问题是,是否可以确定您的应用当前是否可以访问日历而不提出请求,这将导致在未授予权限的情况下向用户显示自动警报 - 请参阅下面的请求代码?我只是想搜索事件,试图删除它只有我已经有权访问日历,如果我没有,我不会尝试删除任何东西.
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (granted) {
//already have access or user tapped on Allow in popup
}
...
Run Code Online (Sandbox Code Playgroud) 阅读Apple的文档,我仍然对EKCalenderItem的calendarItemExternalIdentifier和EKEvent的eventIdentifier之间的差异感到困惑,我们应该使用哪一个来识别不同设备上的日历事件.特别:
EKCalendarItem calendarItemExternalIdentifier 日历服务器提供的日历项的外部标识符.(只读)
和
EKEvent eventIdentifier:事件的唯一标识符.(只读)
EKCalendarItem calendarItemExternalIdentifier是在iOS6中添加的,我原本认为这将是我需要保存的标识符,以便稍后调用,EKEventStore eventWithIdenfier:
因为它声称:
此标识符允许您跨多个设备访问相同的事件或提醒.
但是在我自己的测试中,似乎当我创建并保存一个新的EKEvent时,我从EKEvent对象获得的eventIdenifier是唯一且有用的,而我得到的calendarItemExternalIdentifier似乎不适用于 EKEventStore eventWithIdenfier:
如果有人有确凿的答案,我很想知道.
这看起来非常简单,但我已经挣扎了几天才能访问OSX上的日历.我已经打开了App Sandbox功能,并在App Data中勾选了"日历"框.我用以下视图控制器类创建了非常简单的应用程序:
import Cocoa
import EventKit
class ViewController: NSViewController {
var eventControl = EKEventStore()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我添加的唯一代码行是导入EventKit并初始化eventControl.
当我在调试中运行它时,我在eventControl初始化行中收到错误
2016-10-28 15:02:00.056521 calendarTest[4105:847101] CoreData: XPC: Unable to load metadata: Error Domain=NSCocoaErrorDomain Code=134070 "An error occurred in the persistent store." UserInfo={Problem=request failed, insufficient permission}
2016-10-28 15:02:00.057742 calendarTest[4105:847101] [error] error: -addPersistentStoreWithType:NSXPCStore configuration:(null) URL:file:///Users/patrickramsden/Library/Calendars/Calendar%20Cache …
Run Code Online (Sandbox Code Playgroud) 如何将事件添加到用户的日历中,然后允许用户选择日历等.我有此代码可用,但这会将事件添加到用户的默认日历.如何允许用户更改日历,自定义警报等?我见过其他应用程序打开日历应用程序并预先填写字段.
//add to calendar
let eventStore : EKEventStore = EKEventStore()
eventStore.requestAccessToEntityType(EKEntityType.Event, completion: { (granted, error) in
if granted && error == nil {
let event:EKEvent = EKEvent(eventStore: eventStore)
event.title = "My event: " + self.event.name
event.startDate = self.event.startTime
event.endDate = self.event.endTime
event.notes = self.event.description
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.saveEvent(event, span: .ThisEvent, commit: true)
self.dismissViewControllerAnimated(true, completion: {})
} catch {
self.dismissViewControllerAnimated(true, completion: {})
}
} else {
self.dismissViewControllerAnimated(true, completion: {})
}
})
Run Code Online (Sandbox Code Playgroud) 我编写了Android应用程序,用于侦听传入的Calendar事件,并在后台应用程序时触发我的流程.
现在我尝试为iOS做同样的事情.
我阅读了很多内容并运行了一些使用EKEventStore
和后台获取的演示.
然而,这种方法并不能满足我.
还有其他办法吗?
[编辑]
应用程序仅使用公共API.
谢谢,
如何添加位置不仅仅是NSString而且还有纬度和经度,所以它在日历中也显示了一个地图?
<EKCalendarItem>
Run Code Online (Sandbox Code Playgroud)
@property(nonatomic, copy) NSString *location;
Run Code Online (Sandbox Code Playgroud)
代码:
EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = @"Event Title";
event.startDate = [NSDate date]; //today
event.endDate = [event.startDate dateByAddingTimeInterval:60*60]; //set 1 hour meeting
event.notes=@"Note";
event.location=@"Eiffel Tower,Paris"; //how do i add Lat & long / CLLocation?
event.URL=[NSURL URLWithString:shareUrl];
[event setCalendar:[store defaultCalendarForNewEvents]];
NSError *err = nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
NSString *savedEventId = event.eventIdentifier; //this is …
Run Code Online (Sandbox Code Playgroud) ekeventstore ×10
ios ×6
ekevent ×4
objective-c ×4
swift ×3
ekeventkit ×2
iphone ×2
macos ×2
xcode ×2
calendar ×1
code-signing ×1
entitlements ×1
eventkit ×1
ios8 ×1
sandbox ×1
swift2 ×1