BLOG

Blitz Gateスタッフブログ

BLOG

iOSのデフォルトカレンダーにイベントを追加する方法

書いた人:

iOS , iPhone , Swift , 技術 , 開発言語  

ios_calendar

どうも、ゆんゆんです。

 

インフルエンザが蔓延する時期ですね。
通勤にマスクは必須になってます。

 

さて、今回はiOSのデフォルトカレンダーにイベントを追加する方法を紹介します。
アプリで日付があるものは、カレンダーへの追加機能があると非常に便利です。

 

環境は以下の通りです。

 

Xcode: 8.2.1
Language: Swift 3
Target OS: iOS9, 10

 

iOSのカレンダー追加には「EventKit.framework」と「EventKitUI.framework」が必要です。
まずはプロジェクトにライブラリを追加しましょう。

 

そして、呼び出す画面のControllerは「EKEventEditViewDelegate, UINavigationControllerDelegate」の2つを継承させます。
また、ソースコードの「 eventStore:EKEventStore 」はローカルプロパティである必要があります。

 

eventkit_01

 

import UIKit

import EventKit
import EventKitUI

class ViewController: UIViewController, EKEventEditViewDelegate, UINavigationControllerDelegate {
	// Property(Private)
	private let eventStore:EKEventStore = EKEventStore()

.
.
.

}

 

続いて、カレンダー追加のボタン押下時のメソッド内に、イベント追加用のプログラムを書きましょう

 

// イベント追加ボタンタップ時メソッド
@IBAction func touchUpAddEventButton(_ sender: UIButton)
{
	let title:String = "イベントタイトル"
	let location:String = "愛知県名古屋市中区"
	let startDate:Date = Date()
	let endDate:Date = startDate.addingTimeInterval(60*60*3)
	let notes:String = "開場:10分前"
	let timezone:TimeZone = TimeZone(identifier: "Asia/Tokyo")!
		
	self.showCalendarView(title: title, location: location, startDate: startDate, endDate: endDate, notes: notes, timezone: timezone)
}

// イベント作成権限チェックのカスタムメソッド
func showCalendarView(title:String, location:String?, startDate:Date, endDate:Date, notes:String?, timezone:TimeZone)
{
	// カレンダー追加の権限ステータスを取得
	let authStatus = EKEventStore.authorizationStatus(for: .event)

	switch authStatus {
	case .authorized:
		self.openCalendarView(title: title, location:location, startDate: startDate, endDate: endDate, notes: notes, timezone: timezone)
	case .denied: break
	case .restricted: break
	case .notDetermined:
		self.eventStore.requestAccess(to: .event, completion: { (result:Bool, error:Error?) in
			if result {
				self.openCalendarView(title: title, location:location, startDate: startDate, endDate: endDate, notes: notes, timezone: timezone)
			} else {
				// 使用拒否
			}
		})
	}
}

// イベント作成画面を開くカスタムメソッド
func openCalendarView(title:String, location:String?, startDate:Date, endDate:Date, notes:String?, timezone:TimeZone)
{
	let event:EKEvent = EKEvent(eventStore: self.eventStore)
	event.title = title
	event.location = location
	event.startDate = startDate
	event.endDate = endDate
	event.notes = notes
	event.timeZone = timezone
	event.calendar = self.eventStore.defaultCalendarForNewEvents

	let eventController = EKEventEditViewController()
	eventController.delegate = self
	eventController.event = event
	eventController.editViewDelegate = self
	eventController.eventStore = self.eventStore

	self.present(eventController, animated: true, completion: nil)
}

// イベント作成画面用デリゲート
func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction)
{
	var result = -1
	
	switch action {
	case .canceled: break
	case .saved:
		do {
			try controller.eventStore.save(controller.event!, span: .thisEvent)
			
			result = 1
			
		} catch {
			// イベント追加失敗
			result = 9
		}
	case .deleted: break
	}
	
	controller.dismiss(animated: true) {
		var message = ""
		if result != -1 {
			if result == 1 {
				message = "イベント追加 完了"
			}
			else if result == 9 {
				message = "イベント追加 失敗"
			}
			
			// 結果をアラート表示
			let alert = UIAlertController(title: "Result", message: message, preferredStyle: .alert)
			alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
			self.present(alert, animated: true, completion: nil)
		}
	}
}

 

eventEditViewController が、カレンダーへのイベント追加画面から戻ってきた際のデリゲートメソッドです。
ここで登録した結果を取得し、判定しています。

 

これでカレンダーへのイベント追加ができます。
※なお、実際に作成される場合は、カレンダーへのアクセス権限がない場合などは、アラートで表示する等の処理が必要になるでしょう。

 


 

いかがでしたか?

 

カレンダーへのイベント追加ですが、iPhoneは非常にやりやすいと思います。
Androidは少々手間ですね(そのあたりも紹介出来たらします)。

 

次回もプログラムネタをお送りしたいと思います。

 

それではっ!!

  • このエントリーをはてなブックマークに追加