将位置添加到 EKEvent IOS 日历

Posted

技术标签:

【中文标题】将位置添加到 EKEvent IOS 日历【英文标题】:Add location to EKEvent IOS Calendar 【发布时间】:2014-11-13 07:53:20 【问题描述】:

如何不仅添加 NSString 的位置,还添加纬度和经度,以便在日历中也显示地图?

<EKCalendarItem>  

https://developer.apple.com/LIBRARY/ios/documentation/EventKit/Reference/EKCalendarItemClassRef/index.html#//apple_ref/occ/instp/EKCalendarItem/location

@property(nonatomic, copy) NSString *location;

代码:

 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 so you can access this event later
];

【问题讨论】:

尝试做ans ***.com/questions/16647996/…中给出的操作 找到解决方案了吗?我在同一条船上 @jsetting32 仍然没有解决方案,我认为这可能是不可能的:P 好吧,我在想,因为您在苹果日历应用程序中创建事件时只需输入位置,因此位置字段只是一个字符串。仅此而已。 @jsetting32 是的,我认为日历应用程序使用的字符串可能有某种格式,我们需要在以编程方式创建事件时创建一个格式与纬度、经度和地名相同的字符串 【参考方案1】:

structuredLocation 属性在 iOS 9 上可用,虽然 EKEvent 文档没有提到它(更新:终于是 here),但 structuredLocation 确实存在于 EKEvent 公共头文件中,您可以在 Xcode 中查看它。 iOS 9 后无需使用 KVC 设置。

Swift 版本如下:

let location = CLLocation(latitude: 25.0340, longitude: 121.5645)
let structuredLocation = EKStructuredLocation(title: placeName)  // same title with ekEvent.location
structuredLocation.geoLocation = location
ekEvent.structuredLocation = structuredLocation

【讨论】:

【参考方案2】:

很奇怪,没有相关文档,但这是您将地理位置添加到日历事件的方式。

EKStructuredLocation* structuredLocation = [EKStructuredLocation locationWithTitle:@"Location"]; // locationWithTitle has the same behavior as event.location
CLLocation* location = [[CLLocation alloc] initWithLatitude:0.0 longitude:0.0];
structuredLocation.geoLocation = location;

[event setValue:structuredLocation forKey:@"structuredLocation"];

【讨论】:

我不怀疑这行得通。但是文档提到使用 EKStructuredLocation 专门用于设置地理围栏位置。此解决方案可能会出现任何问题? @spacyRicochet - 我对这种方法没有任何问题。从我玩过的情况来看,这是将地图添加到您的日历事件的唯一解决方案。我真的认为问题在于文档需要更新。要么他们实现了这个功能并且这是一个错误,要么他们只是忘记在他们的文档中包含这个功能。无论如何,它有效。 对我来说似乎无法正常工作,尽管这可能是模拟器不喜欢它。稍后将在设备上试用。 @SpacyRicochet 它适用于 iPhone 5。我还没有在其他设备上测试过。【参考方案3】:

您也许可以在创建 EKStructuredLocation 后在 EKEvent 上使用 setValue:ForKey:,键是 'structuredLocation'

【讨论】:

以上是关于将位置添加到 EKEvent IOS 日历的主要内容,如果未能解决你的问题,请参考以下文章

iOS EKEvent Store 在循环中重新创建 iCloud 日历,不会保存本地。

访问 EKevent 和 EKReminder

在 Swift 中从 EKEvent 获取日历颜色

将事件添加到日历时,NSDateFormatter 未正确格式化日期

同时在 CoreData 中工作

iOS - 无法使用 EventKit 将日历事件添加到 Gmail 日历