มีวิธีใดบ้างที่จะเพิ่มกิจกรรม iCal ในปฏิทิน iPhone จากแอพที่กำหนดเอง
มีวิธีใดบ้างที่จะเพิ่มกิจกรรม iCal ในปฏิทิน iPhone จากแอพที่กำหนดเอง
คำตอบ:
จากเอกสารของ Appleสิ่งนี้เปลี่ยนไปเล็กน้อยเมื่อเทียบกับ iOS 6.0
1) คุณควรร้องขอการเข้าถึงปฏิทินของผู้ใช้ผ่านทาง "requestAccessToEntityType: complete:" และดำเนินการจัดการเหตุการณ์ภายในบล็อก
2) คุณต้องกระทำกิจกรรมของคุณตอนนี้หรือส่ง "มอบหมาย" พารามิเตอร์เพื่อบันทึก / ลบการโทรของคุณ
ทุกสิ่งทุกอย่างยังคงเหมือนเดิม...
เพิ่มกรอบงาน EventKit และ#import <EventKit/EventKit.h>
รหัสของคุณ
ในตัวอย่างของฉันฉันมีคุณสมบัติอินสแตนซ์ NSString * saveEventId
ในการเพิ่มกิจกรรม:
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];
}
}];
สิ่งนี้จะเพิ่มกิจกรรมในปฏิทินเริ่มต้นของคุณหากคุณมีปฏิทินหลายปฏิทินคุณจะพบว่าเป็นปฏิทินใด
รุ่นที่รวดเร็ว
คุณต้องนำเข้ากรอบงาน 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
}
}
}
คุณสามารถทำได้โดยใช้เฟรมเวิร์กชุดกิจกรรมใน OS 4.0
คลิกขวาที่กลุ่ม FrameWorks ใน Groups and Files Navigator ทางด้านซ้ายของหน้าต่าง เลือก 'เพิ่ม' จากนั้น 'เฟรมเวิร์กที่มีอยู่' จากนั้นเลือก 'EventKit.Framework'
จากนั้นคุณควรจะสามารถเพิ่มกิจกรรมด้วยรหัสดังนี้:
#import "EventTestViewController.h"
#import <EventKit/EventKit.h>
@implementation EventTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
EKEventStore *eventStore = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
event.title = @"EVENT TITLE";
event.startDate = [[NSDate alloc] init];
event.endDate = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
NSError *err;
[eventStore saveEvent:event span:EKSpanThisEvent error:&err];
}
@end
ใช่ยังไม่มี API สำหรับสิ่งนี้ (2.1) แต่ดูเหมือนว่าที่ WWDC ผู้คนจำนวนมากสนใจฟังก์ชั่น (รวมถึงตัวฉันเอง) อยู่แล้วและคำแนะนำก็คือไปที่ไซต์ด้านล่างและสร้างคำขอคุณลักษณะสำหรับสิ่งนี้ หากมีความสนใจเพียงพอพวกเขาอาจสิ้นสุดการย้าย ICal.framework ไปยัง SDK สาธารณะ
กำลังเพิ่มการเข้าถึงปฏิทินใน iPhone OS 4.0 :
แอพAccess Calendarสามารถสร้างและแก้ไขเหตุการณ์ได้โดยตรงในแอพ Calendar ด้วย Event Kit
สร้างกิจกรรมที่เกิดซ้ำตั้งค่าเวลาเริ่มต้นและสิ้นสุดและกำหนดให้กับปฏิทินใด ๆ บนอุปกรณ์
คุณสามารถเพิ่มกิจกรรมโดยใช้ Event API เช่น Tristan ที่ระบุไว้และคุณยังสามารถเพิ่มกิจกรรม Google ปฏิทินที่แสดงในปฏิทิน iOS
ใช้ไคลเอนต์ API Objective-C ของ Google
- (void)addAnEvent {
// Make a new event, and show it to the user to edit
GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
newEvent.summary = @"Sample Added Event";
newEvent.descriptionProperty = @"Description of sample added event";
// We'll set the start time to now, and the end time to an hour from now,
// with a reminder 10 minutes before
NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
timeZone:[NSTimeZone systemTimeZone]];
GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
timeZone:[NSTimeZone systemTimeZone]];
newEvent.start = [GTLCalendarEventDateTime object];
newEvent.start.dateTime = startDateTime;
newEvent.end = [GTLCalendarEventDateTime object];
newEvent.end.dateTime = endDateTime;
GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
reminder.minutes = [NSNumber numberWithInteger:10];
reminder.method = @"email";
newEvent.reminders = [GTLCalendarEventReminders object];
newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];
// Display the event edit dialog
EditEventWindowController *controller = [[[EditEventWindowController alloc] init] autorelease];
[controller runModalForWindow:[self window]
event:newEvent
completionHandler:^(NSInteger returnCode, GTLCalendarEvent *event) {
// Callback
if (returnCode == NSOKButton) {
[self addEvent:event];
}
}];
}
การติดตั้ง Swift 4.0:
ใช้การนำเข้าที่ด้านบนของหน้าโดย import EventKit
แล้วก็
@IBAction func addtoCalendarClicked(sender: AnyObject) {
let eventStore = EKEventStore()
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
if (granted) && (error == nil) {
print("granted \(granted)")
print("error \(error)")
let event = EKEvent(eventStore: eventStore)
event.title = "Event Title"
event.startDate = Date()
event.endDate = Date()
event.notes = "Event Details Here"
event.calendar = eventStore.defaultCalendarForNewEvents
var event_id = ""
do {
try eventStore.save(event, span: .thisEvent)
event_id = event.eventIdentifier
}
catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
if(event_id != ""){
print("event added !")
}
}
})
}
อัปเดตสำหรับ swift 4 สำหรับคำตอบ Dashrath
import UIKit
import EventKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let eventStore = EKEventStore()
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
if (granted) && (error == nil) {
let event = EKEvent(eventStore: eventStore)
event.title = "My Event"
event.startDate = Date(timeIntervalSinceNow: TimeInterval())
event.endDate = Date(timeIntervalSinceNow: TimeInterval())
event.notes = "Yeah!!!"
event.calendar = eventStore.defaultCalendarForNewEvents
var event_id = ""
do{
try eventStore.save(event, span: .thisEvent)
event_id = event.eventIdentifier
}
catch let error as NSError {
print("json error: \(error.localizedDescription)")
}
if(event_id != ""){
print("event added !")
}
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
รหัสการทำงานใน Swift-4.2
import UIKit
import EventKit
import EventKitUI
class yourViewController: UIViewController{
let eventStore = EKEventStore()
func addEventToCalendar() {
eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
DispatchQueue.main.async {
if (granted) && (error == nil) {
let event = EKEvent(eventStore: self.eventStore)
event.title = self.headerDescription
event.startDate = self.parse(self.requestDetails.value(forKey: "session_time") as? String ?? "")
event.endDate = self.parse(self.requestDetails.value(forKey: "session_end_time") as? String ?? "")
let eventController = EKEventEditViewController()
eventController.event = event
eventController.eventStore = self.eventStore
eventController.editViewDelegate = self
self.present(eventController, animated: true, completion: nil)
}
}
})
}
}
ตอนนี้เราจะได้รับหน้าจอกิจกรรมและที่นี่คุณสามารถแก้ไขการตั้งค่าของคุณ:
ตอนนี้เพิ่มวิธีการมอบหมายเพื่อจัดการยกเลิกและเพิ่มการกระทำปุ่มเหตุการณ์ของหน้าจอกิจกรรม:
extension viewController: EKEventEditViewDelegate {
func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
controller.dismiss(animated: true, completion: nil)
}
}
หมายเหตุ:อย่าลืมเพิ่มคีย์NSCalendarsUsageDescriptionลงในตัวจัดการข้อมูล
จำไว้ว่าให้ตั้งค่า endDate เป็นเหตุการณ์ที่สร้างขึ้น
มิฉะนั้นจะเกิดข้อผิดพลาด (เกือบจะเงียบ) ด้วยข้อผิดพลาดนี้:
"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"
รหัสการทำงานที่สมบูรณ์สำหรับฉันคือ:
EKEventStore *store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (!granted) { return; }
EKEvent *calendarEvent = [EKEvent eventWithEventStore:store];
calendarEvent.title = [NSString stringWithFormat:@"CEmprendedor: %@", _event.name];
calendarEvent.startDate = _event.date;
// 5 hours of duration, we must add the duration of the event to the API
NSDate *endDate = [_event.date dateByAddingTimeInterval:60*60*5];
calendarEvent.endDate = endDate;
calendarEvent.calendar = [store defaultCalendarForNewEvents];
NSError *err = nil;
[store saveEvent:calendarEvent span:EKSpanThisEvent commit:YES error:&err];
self.savedEventId = calendarEvent.eventIdentifier; //saving the calendar event id to possibly deleted them
}];
แนวคิดของ Google เป็นแนวคิดที่ดี แต่มีปัญหา
ฉันสามารถเปิดหน้าจอกิจกรรม Google ปฏิทินได้สำเร็จ - เฉพาะในเวอร์ชันเดสก์ท็อปหลักเท่านั้นและไม่สามารถแสดงได้อย่างถูกต้องบน iPhone Safari ปฏิทินมือถือของ Google ซึ่งแสดงอย่างถูกต้องบน Safari ดูเหมือนจะไม่ทำงานกับ API เพื่อเพิ่มกิจกรรม
ในขณะนี้ฉันไม่สามารถเห็นวิธีที่ดีจากหนึ่งในนี้
ง่าย ๆ .... ใช้ไลบรารี tapku .... คุณสามารถ google คำนั้นและใช้มัน ... โอเพ่นซอร์ส ... เพลิดเพลินไปกับ ..... ไม่จำเป็นต้องมีการดักฟังรหัสเหล่านั้น ....