有没有办法从自定义应用程序将iCal活动添加到iPhone日历?

推荐答案

Apple Documentation的基础上,从iOS 6.0开始,这一点发生了一些变化.

1)您需要通过"requestAccessToEntityType:Complete:"请求访问用户的日历,并在挡路内部执行事件处理.

2) 您需要立即提交事件,或者将"提交"参数传递给save/remove调用

其他的一切都保持不变.

将EventKit框架和#import <EventKit/EventKit.h>添加到您的代码中.

在我的示例中,我有一个NSString*savedEventId实例属性.

要添加事件,请执行以下操作:

    EKEventStore *store = [EKEventStore new];
    [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.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
        self.savedEventId = event.eventIdentifier;  //save the event id if you want to access this later
    }];

删除事件:

    EKEventStore* store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
        if (eventToRemove) {
            NSError* error = nil;
            [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
        }
    }];

这会将事件添加到您的默认日历中,如果您有多个日历,那么您必须找出哪个日历是正确的

Swift version

您需要导入EventKit框架

import EventKit

添加事件

let store = EKEventStore()
store.requestAccessToEntityType(.Event) {(granted, error) in
    if !granted { return }
    var event = EKEvent(eventStore: store)
    event.title = "Event Title"
    event.startDate = NSDate() //today
    event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
    event.calendar = store.defaultCalendarForNewEvents
    do {
        try store.saveEvent(event, span: .ThisEvent, commit: true)
        self.savedEventId = event.eventIdentifier //save event id to access this particular event later
    } catch {
        // Display error to user
    }
}

删除事件

let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
    if !granted { return }
    let eventToRemove = store.eventWithIdentifier(self.savedEventId)
    if eventToRemove != nil {
        do {
            try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
        } catch {
            // Display error to user
        }
    }
}

Ios相关问答推荐

缺少预期的键:';NSPrival yCollectedDataTypes';

Firebase SDK 10+—无法安装软件包

iPhone:iOS 17.4中没有气压数据

如何在iPhone 15上消除.NET Maui中状态栏和页面之间的差距

在相机动作之前快速防止场景视点重置

由于已存在同名项目,因此无法将Mapbox.xcframework-ios.sign复制到Signature中

如何使用Swift以编程方式更改SVG文件中某些元素的 colored颜色

SwiftUI 故障/错误 - 在 LazyVStack 和 ScrollView 中使用 AVPlayer 时状态栏不显示

如何在字段包含字典数组的firestore上查询?

如何在不支持并发的自动关闭中修复'async'调用?

UICollectionView 添加 UICollectionCell

在 Xcode 5 中为超级视图添加间距约束

Xcode 11 向后兼容性:UIWindowScene 仅在 iOS 13 或更高版本中可用

UIButton 事件.有什么不同?

cocoapods中~>的用法是什么

iOS:以编程方式制作屏幕截图的最快、最高效的方法是什么?

Sierra 中的安全/协同设计: keys 串忽略访问控制设置和 UI 提示权限

Swift:如何在设备旋转后刷新 UICollectionView 布局

UICollectionView:必须用非零布局参数初始化

NSURL 到带有 XCTest 的测试包中的文件路径