Secara terprogram menambahkan acara khusus di Kalender iPhone


Jawaban:


166

Berdasarkan Dokumentasi Apple , ini telah sedikit berubah pada iOS 6.0.

1) Anda harus meminta akses ke kalender pengguna melalui "requestAccessToEntityType: completion:" dan jalankan penanganan acara di dalam blok.

2) Anda perlu mengkomit acara Anda sekarang atau meneruskan param "komit" ke save / remove call Anda

Segala sesuatu yang lain tetap sama ...

Tambahkan kerangka EventKit dan #import <EventKit/EventKit.h>ke kode Anda.

Dalam contoh saya, saya memiliki properti instance NSString * SavedEventId.

Untuk menambahkan acara:

    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
    }];

Hapus acara:

    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];
        }
    }];

Ini menambahkan acara ke kalender default Anda, jika Anda memiliki beberapa kalender maka Anda akan mengetahui yang mana

Versi cepat

Anda perlu mengimpor kerangka kerja EventKit

import EventKit

Tambahkan acara

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
    }
}

Hapus acara

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
        }
    }
}

6
tidak bekerja untuk saya, semuanya berjalan tanpa kesalahan tetapi tidak ada acara di kalender
Boris Gafurov

Semuanya menyimpan dalam objek ekevent tetapi tidak menyimpan di dalam kalender hlp me

1
@ William T: Dapatkah saya menampilkan layar Tambah Acara pada aplikasi Kalender (menggunakan Skema URL) dan meneruskan info acara sehingga ketika layar Tambahkan Acara muncul, itu akan memiliki data yang sudah terisi sebelumnya. Pengguna hanya perlu menekan tombol tambah acara. Dalam contoh acara Anda ditambahkan tanpa indikasi kepada pengguna.
Ans

1
jika semua tampaknya berfungsi namun tidak ada kalender yang muncul, periksa untuk melihat apakah kalender Cloud VS Local adalah masalahnya. Jika Anda memiliki campuran Cloud dan Kalender Lokal, kalender Cloud dapat memaksa kalender lokal untuk disembunyikan.
zonabi

2
@ReddyBasha saat Anda menambahkan acara, Anda harus menyimpan eventIdentifier dan menyimpannya untuk digunakan di masa mendatang. Anda harus menggunakan id acara itu ketika Anda pergi untuk menghapusnya.
William T.

154

Anda bisa melakukan ini menggunakan kerangka Event Kit di OS 4.0.

Klik kanan pada grup FrameWorks di Groups and Files Navigator di sebelah kiri jendela. Pilih 'Tambah' lalu 'FrameWorks Yang Ada' lalu 'EventKit.Framework'.

Maka Anda harus dapat menambahkan acara dengan kode seperti ini:

#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

18
Terima kasih telah memposting ini. Sekadar pengingat bagi semua yang membaca ini: berhati-hatilah dengan kebocoran memori. Ada pasangan dalam contoh kode ini. Juga, praktik terbaik akan menentukan bahwa Anda memeriksa nilai 'err' setelah saveEvent: span: error dan menangani hal-hal yang sesuai.
David Carney

Apakah Anda tahu cara menambahkan acara berulang? suka acara untuk setiap Senin?
Jay Vachhani

5
Tambahkan acara pengulangan secara terprogram: lihat ini developer.apple.com/library/ios/#documentation/EventKit/… . Opsi lain adalah menggunakan pengendali tampilan yang disediakan kerangka kerja untuk menambahkan / mengedit acara (seperti aplikasi Calendar At-A-Glance bit.ly/cJq4Bh ). Untuk opsi ini, lihat developer.apple.com/library/ios/#documentation/EventKitUI/…
DenTheMan

Untuk menambahkan kerangka kerja di XCode 4 lihat pertanyaan SO ini: stackoverflow.com/questions/3352664/…
Nate

1
4.0? tidak akan terbang dalam 6 lihat jawaban di atas
Boris Gafurov

13

Ya masih belum ada API untuk ini (2.1). Tapi sepertinya di WWDC banyak orang sudah tertarik dengan fungsionalitas (termasuk saya) dan rekomendasinya adalah pergi ke situs di bawah ini dan membuat permintaan fitur untuk ini. Jika ada cukup minat, mereka mungkin akhirnya memindahkan ICal.frework ke SDK publik.

https://developer.apple.com/bugreporter/


5
jawabannya sudah ketinggalan zaman, pertimbangkan untuk menghapus ini
Jasper


5

Anda dapat menambahkan acara menggunakan API Acara seperti yang diuraikan Tristan dan Anda juga dapat menambahkan acara Kalender Google yang muncul di kalender iOS.

menggunakan Google API Objective-C Client 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];
                }
              }];
}

5

Implementasi Swift 4.0:

gunakan impor di bagian atas halaman oleh import EventKit

kemudian

@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 !")
            }
        }
    })
}

dapatkah saya membantu saya dengan kalender google mengenai jawaban yang sama @Dashrath
Dilip Tiwari

4

Perbarui untuk swift 4 untuk jawaban 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.
    }


}

juga jangan lupa menambahkan izin untuk penggunaan kalender gambar untuk pengaturan pribadi


2

Kode kerja di 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)

            }
        }


       })
    }

}

Sekarang kita akan mendapatkan layar acara dan di sini Anda juga dapat mengubah pengaturan Anda:

masukkan deskripsi gambar di sini

Sekarang tambahkan metode delegasi untuk menangani Batal dan menambahkan aksi tombol layar acara acara:

    extension viewController: EKEventEditViewDelegate {

    func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
        controller.dismiss(animated: true, completion: nil)

    }
}

Catatan: Jangan lupa menambahkan kunci NSCalendarsUsageDescription ke info plist.


1

Ingatlah untuk mengatur endDate ke acara yang dibuat, itu wajib.

Kalau tidak, ia akan gagal (hampir tanpa suara) dengan kesalahan ini:

"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"

Kode kerja lengkap untuk saya adalah:

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
}];

1
Dan juga ingat bahwa tanggal akhir harus sama atau lebih besar dari tanggal mulai. Jika tidak, Anda akan mendapatkan kesalahan lain.
murung

0

Gagasan Google bagus, tetapi memiliki masalah.

Saya dapat berhasil membuka layar acara kalender Google - tetapi hanya pada versi desktop utama, dan itu tidak ditampilkan dengan benar di iPhone Safari. Kalender seluler Google, yang ditampilkan dengan benar di Safari, tampaknya tidak berfungsi dengan API untuk menambah acara.

Untuk saat ini, saya tidak bisa melihat jalan keluar yang bagus untuk ini.


0

Sederhana .... gunakan perpustakaan tapku .... Anda dapat google kata itu dan menggunakannya ... open source ... nikmati ..... tidak perlu mengganggu dengan kode-kode itu ....



Dapatkah Tapku Library menyinkronkan kalender dengan acara aplikasi kalender
coder1010

Yang saya tahu adalah bahwa perpustakaan Tapku adalah kontrol komponen kalender yang memiliki opsi bernama Sumber data. Jadi logikanya untuk menulis di mana sumber yang Anda ambil dari ... Selamat Coding :)
Rajesh_Bangalore
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.