Secara terprogram menambahkan acara khusus di Kalender iPhone

181

Apakah ada cara untuk menambahkan acara iCal ke Kalender iPhone dari Aplikasi khusus?

Vadim
sumber

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
        }
    }
}
William T.
sumber
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
WoodenKitty
sumber
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/

keremk
sumber
5
jawabannya sudah ketinggalan zaman, pertimbangkan untuk menghapus ini
Jasper
12

Akses kalender sedang ditambahkan di iPhone OS 4.0 :


Aplikasi Akses Kalender kini dapat membuat dan mengedit acara langsung di aplikasi Kalender dengan Kit Peristiwa.
Buat acara berulang, atur waktu mulai dan akhir dan tetapkan untuk kalender apa pun di perangkat.

Chris S
sumber
1
tautan Anda rusak sekarang.
Adil Soomro
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];
                }
              }];
}
Iggy
sumber
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 !")
            }
        }
    })
}
Dashrath
sumber
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

luhuiya
sumber
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.

Alok
sumber
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
}];
halbano
sumber
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.

xgretsch
sumber
0

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

Rajesh_Bangalore
sumber
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