为了测试授予iOS日历的访问权限,我需要重置测试设备上的隐私设置.
但是,每次我在设备上安装它时,它都会记住旧的隐私设置,并且不会显示警报视图,询问我是否授予访问权限.删除应用程序并重新安装它并不会改变这一事实.
有没有办法让iOS忘记它知道我的应用程序并再次问我?
我希望在我的应用中获取特定日历中的所有活动.我在我的应用程序中创建了日历和测试事件(需要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) 我正在开发日历应用程序.我正在尝试使用指定的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) 我只是想在设备的日历中添加一个事件.
我正在使用:
__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) 任何想法,为什么我会在调用"pushViewController"时看到"无法加载源:6"控制台消息?新观点似乎没问题.代码是:
代码除外:
EKEventViewController *eventViewController = [[EKEventViewController alloc] init];
eventViewController.event = event;
eventViewController.allowsEditing = YES;
eventViewController.delegate = self;
[self.navigationController pushViewController:eventViewController animated:YES]; // <== OCCURS HERE
Run Code Online (Sandbox Code Playgroud) 我有一个EKCalendarChoosere
允许我选择日历的.我看到日历和委托方法(EKCalendarChooserDelegate
)被调用.但是,当我访问日历选择器的选定日历属性时,它们始终为空.是否需要手动添加它们或选择器处理它?提前致谢
我在我的应用程序中使用EKEventStore.我抓住默认商店并注册,以便在EKEventStoreChangedNotification
对日历进行更改时收到通知.但是,当进行更改时,通知的发件人会被调用几次(5-10)次,有时在每次调用之间最多会有15秒.这会弄乱我的代码并使事情变得更加困难.我能做些什么吗?
谢谢
iOS7编辑:似乎就像iOS7的发布一样,这个问题已经消失了.现在,无论对CalendarStore所做的更改如何,只会EKEventStoreChangedNotification
发送一个.
如何添加位置不仅仅是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) 我正在尝试使用特定事件打开日历,我已经以编程方式添加了事件,并且这些事件的所有ID都是持久的.
这是我添加事件的方式
-(IBAction)addEvent:(id)sender{
EKEventStore *store = [[EKEventStore alloc]init];
[store requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
EKEvent *event = [EKEvent eventWithEventStore:store];
event.title = @"Demo Title";
NSDateComponents *comps=[[NSDateComponents alloc]init];
[comps setDay:4];
[comps setMonth:10];
[comps setYear:2016];
[comps setHour:12];
[comps setMinute:1];
NSDate *date=[[[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian] dateFromComponents:comps];
_date=date;
event.startDate = date;
event.endDate=date;
event.notes=@"This is event description";
EKAlarm *alarm=[EKAlarm alarmWithAbsoluteDate:date];
[event addAlarm:alarm];
event.calendar = [store defaultCalendarForNewEvents];
NSError *err=nil;
[store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
}];
}
Run Code Online (Sandbox Code Playgroud)
该事件已成功添加,我也可以打开日历应用程序但事情是我无法在日历中的事件详细信息中导航
这是我打开日历的方式
-(IBAction)openCalender:(id)sender{
NSInteger interval = [_date …
Run Code Online (Sandbox Code Playgroud) 我想允许我的用户在我的应用中接受/拒绝会议邀请.
我认为我需要的是以某种方式更新EKParticipantStatus,但看起来它无法更新.
Apple Docs:Event Kit无法将参与者添加到活动中,也无法更改参与者信息
在这个stackOverflow问题中有人建议带来本机EventKitUI,我试过这样:
class CalendarViewController: UIViewController, EKEventViewDelegate {
// .....
let eventController = EKEventViewController()
guard let eventWithIdentifier = MeetingsFetcher.eventStoreClass.event(withIdentifier: meeting.UUID) else {
return nil
}
eventController.delegate = self
eventController.event = eventWithIdentifier
eventController.allowsEditing = true
eventController.allowsCalendarPreview = true
let navCon = UINavigationController(rootViewController: eventController)
// customizing the toolbar where the accept/maybe/decline buttons appear
navCon.toolbar.isTranslucent = false
navCon.toolbar.tintColor = .blueGreen
navCon.toolbar.backgroundColor = .coolWhite10
// customizing the nav bar where the OK button appears
navCon.navigationBar.callinAppearence()
present(navCon, animated: true, completion: …
Run Code Online (Sandbox Code Playgroud) ekeventkit ×10
ios ×9
objective-c ×7
ekevent ×5
iphone ×5
ekeventstore ×3
calabash ×1
cocoa-touch ×1
swift ×1
xcode ×1