我有兴趣知道如何在设备中添加日历事件,但使用swift.我知道在Objective-C中有一些例子,但目前没什么好快的.非常感谢.
我的目标是添加一些被邀请者EKEvent
.我已经研究过像这样的其他问题,比如这个问题,但是所有人都说EKParticipant
以EKEvent
编程方式添加s 基本上是不可能的.我确实看到该attendees
属性是只读的,但我看到其他服务,如Sunrise在他们的移动应用程序中使用它.
我相信他们正在使用一些至少部分与EventKit集成的系统,因为他们正在从用户的iCal应用程序中提取日历.例如,从添加的Exchange帐户发送的邀请也由Exchange服务明确发送,而不是Sunrise自己的邀请(将事件直接发布到Exchange或将其发布到iCal).
任何解决方法此限制都非常有用 - 可能是Exchange上可以调用添加/删除被邀请者的端点?EventKit内部的解决方法?只要它不是私有的Apple API,我就会非常乐意尝试它.
谢谢!
我希望在我的应用中获取特定日历中的所有活动.我在我的应用程序中创建了日历和测试事件(需要iOS 5.0或更高版本才能创建自定义日历).如果我在我的设备上运行该应用程序,然后检查系统日历应用程序,那么我的日历和我创建的事件将正确显示.
现在我希望我的应用程序从这个自定义日历中读取所有这些事件.我的事件是在startDate和endDate设置为NOW(NSDate分配时没有给出timeInterval)的情况下创建的.
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 1)];
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 365 * 25];
NSArray *calendarList = [NSArray arrayWithObjects:tmpCal, nil];
NSPredicate *datePredicate = [store predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarList];
NSArray *eventList = [store eventsMatchingPredicate:datePredicate];
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在指定结果事件所必须的时间间隔.您也可以看到,结束日期是从现在开始的25年,而开始日期是4年(闰年加一天).如果我以这种方式查询EKEventstore,我将获得之前添加的事件.如果我想将开始日期放回过去一天(或多天或几年),那么棘手的部分就会开始.然后,突然间,没有返回任何事件.
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 2)];
Run Code Online (Sandbox Code Playgroud)
NSPredicate中NSTimeInterval的负值是否有限制?我没有发现任何记录的限制.我花了大约2个小时才发现为什么我没有参加任何活动(最初我想要的是过去5年和未来5年).这种好奇行为的原因是什么?任何的想法?
/编辑于04/11/2012在2012年3月31日和2012年4月20日创建一些具有开始日期的事件之后,似乎是按照从现在开始的间隔确定的日期提取事件受到间隔长度4的限制年份.在上面的给定代码中调整我的开始日期(通过设置前一天的开始日期),我能够在2012年3月31日之前获得事件,但不能更晚.删除此调整导致从03/31/2012和04/01/2012获取事件(但不是2012年4月20日的事件).经过第二次调整(20天后设置开始日期),我甚至得到了未来的事件.
我无法说明为什么会有这样的限制.可能存在一些内部计算会导致使用值存储溢出.只是一个猜测.
然后我前往Apple的例子.乍一看,我不想在Apple的EKEvent编程指南中使用给定的代码.它看起来并不像我的那么小和可爱,但在遇到这么多麻烦之后我就试了一下.
CFGregorianDate gregorianStartDate, gregorianEndDate;
CFTimeZoneRef timeZone …
Run Code Online (Sandbox Code Playgroud) 我只是想在设备的日历中添加一个事件.
我正在使用:
__weak ProgramViewController *weakSelf = self;
EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
{
if (error)
NSLog(@"EKEventStore error = %@", error);
if (granted)
{
NSLog(@"EKEvent *event ");
EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = weakSelf.program.title;
event.location = weakSelf.program.locationPublic;
event.startDate = weakSelf.program.startTime;
event.endDate = weakSelf.program.endTime;
[event setCalendar:[store defaultCalendarForNewEvents]];
NSError *err = nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
if (err)
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Calendar Error" message:err.localizedDescription delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}
else …
Run Code Online (Sandbox Code Playgroud) 我在活动开始前5分钟创建了一个带有闹钟的日历活动.
我的活动看起来像这样
EKEvent <0x7fd8ae554ba0>
{
EKEvent <0x7fd8ae554ba0>
{ title = E-Cold
1mg;
location = ;
calendar = EKCalendar <0x7fd8ae717420> {title = Medicines; type = Local; allowsModify = YES; color = #1badf8;};
alarms = (
"EKAlarm <0x7fd8ae71bd30> {triggerInterval = -300.000000}"
);
URL = (null);
lastModified = 2015-03-18 09:01:41 +0000;
startTimeZone = Asia/Kolkata (GMT+5:30) offset 19800;
startTimeZone = Asia/Kolkata (GMT+5:30) offset 19800
};
location = ;
structuredLocation = (null);
startDate = 2015-03-18 02:30:00 +0000;
endDate = 2015-04-01 02:30:00 +0000;
allDay = 0; …
Run Code Online (Sandbox Code Playgroud) 如何获得ekevent EKparticipant电子邮件?
EKParticipant类没有这样的属性.
是否可以呈现本机ios参与者控制器以显示参与者列表?
是否有可用于识别跨设备的日历的属性?
根据Apple文档,无法使用"calendarIdentifier"属性:
与日历完全同步将丢失此标识符.您应该有一个计划,通过缓存其他属性来处理标识符不再可读的日历.
我正在寻找类似于EKEvent.calendarItemExternalIdentifier的东西,它在设备上是相同且唯一的,但是对于日历.
阅读Apple的文档,我仍然对EKCalenderItem的calendarItemExternalIdentifier和EKEvent的eventIdentifier之间的差异感到困惑,我们应该使用哪一个来识别不同设备上的日历事件.特别:
EKCalendarItem calendarItemExternalIdentifier 日历服务器提供的日历项的外部标识符.(只读)
和
EKEvent eventIdentifier:事件的唯一标识符.(只读)
EKCalendarItem calendarItemExternalIdentifier是在iOS6中添加的,我原本认为这将是我需要保存的标识符,以便稍后调用,EKEventStore eventWithIdenfier:
因为它声称:
此标识符允许您跨多个设备访问相同的事件或提醒.
但是在我自己的测试中,似乎当我创建并保存一个新的EKEvent时,我从EKEvent对象获得的eventIdenifier是唯一且有用的,而我得到的calendarItemExternalIdentifier似乎不适用于 EKEventStore eventWithIdenfier:
如果有人有确凿的答案,我很想知道.
标题基本概括了所有内容.以下是我最好的猜测,但事件根本没有出现.
NSArray *items = @[string, URL, (EKEvent *)[self createCalendarEvent]];
UIActivityViewController* activity = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];
[self presentViewController:activity animated:YES completion:NULL];
Run Code Online (Sandbox Code Playgroud)
有谁知道这样做的方法?或者我是否必须创建一个ics文件并发送?
如何将事件添加到用户的日历中,然后允许用户选择日历等.我有此代码可用,但这会将事件添加到用户的默认日历.如何允许用户更改日历,自定义警报等?我见过其他应用程序打开日历应用程序并预先填写字段.
//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) ekevent ×10
ios ×7
objective-c ×6
ekeventstore ×3
eventkit ×3
ekeventkit ×2
swift ×2
calendar ×1
swift2 ×1