七曜表と備忘録
Otemachi.swift x Kyobashi.swift #02
2018/1/29 Bitz Co., Ltd. 村上幸雄
• 埼玉県朝霞市でソフトハウスを起業。
• macOSやiOS、Androidのアプリケーション開発を主に請け負う。
• 自社アプリの製作。
• Twitter: @m_yukio
• Facebook: yukio.murakami
• GitHub: murakami
• http://www.bitz.co.jp/weblog/
BUKURO.swift
• macOS/iOS/watchOS/tvOSプログラマーのための勉強会。
初心者大歓迎。
• Cocoa勉強会 関東とMOSAの合同勉強会。
ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催。
• 申し込みは、connpassから。
https://cocoa-kanto.connpass.com/
• プログラマーが楽しくプログラミングできるようにサポートする場を
提供したい
• 勉強会に参加された方全員が学びを得られる様にサポートします!
• 勉強会に参加できない方にも学び得られるよう、勉強会の成果を可
能な限りアウトプットします!
• プログラマの拠り所となる場を目指します!
https://github.com/murakami/workbook/tree/master/ios/GettingThingsDone
リマインダー
• 何を使っていますか?
• 自分は、OmniFocus、Things → リマインダー
• OmniFocusは初代なので、最新のOSで動作しなくなりまし
た。
• 乗り越し防止アラームとして、駅ベル を利用。
• macOS/iOSのリマインダーで事足りるようになりました。
• リマインダーをGTDで活用できないか?
カレンダーとリマイン
ダー
EventKitフレームワークを利用すれば、ユーザのカレンダーやリマイ
ンダーの情報にアクセスできます。
イベント
/* イベントストアへの接続 */
let store = EKEventStore()
/* イベント追加の権限取得 */
let status = EKEventStore.authorizationStatus(for: .event)
var isAuth = false
switch status {
case .notDetermined:
isAuth = false
case .restricted:
isAuth = false
case .denied:
isAuth = false
case .authorized:
isAuth = true
}
if !isAuth {
store.requestAccess(to: .event, completion: {
(granted, error) in
if granted {
}
else {
/* 使用拒否 */
return
}
})
}
/* イベントの登録 */
let event = EKEvent(eventStore: store)
event.title = "BUKURO.swift 2017-12"
event.startDate = Calendar.current.date(from:
DateComponents(year: 2017, month: 12, day: 6, hour: 19, minute: 30, second: 00))
event.endDate = Calendar.current.date(from:
DateComponents(year: 2017, month: 12, day: 6, hour: 22, minute: 00, second: 00))
event.calendar = store.defaultCalendarForNewEvents
do {
try store.save(event, span: .thisEvent)
}
catch let error {
print(error)
}
/* イベントの検索 */
let startDate = Calendar.current.date(from:
DateComponents(year: 2017, month: 12, day: 1, hour: 00, minute: 00, second: 00))
let endDate = Calendar.current.date(from:
DateComponents(year: 2017, month: 12, day: 31, hour: 23, minute: 59, second: 59))
let defaultCalendar = store.defaultCalendarForNewEvents
let predicate = store.predicateForEvents(withStart: startDate!, end: endDate!,
calendars: [defaultCalendar!])
var events = store.events(matching: predicate)
print(events)
日付の範囲などを指定して検索できる。
/* イベントの削除 */
do {
try store.remove(event, span: .thisEvent)
}
catch let error {
print(error)
}
リマインダー
/* イベントストアへの接続 */
let eventStore = EKEventStore()
/* リマインダー追加の権限取得 */
let status = EKEventStore.authorizationStatus(for: .reminder)
var isAuth = false
switch status {
case .notDetermined:
isAuth = false
case .restricted:
isAuth = false
case .denied:
isAuth = false
case .authorized:
isAuth = true
}
if !isAuth {
eventStore.requestAccess(to: .event, completion: {
(granted, error) in
if granted {
}
else {
print("使用拒否")
return
}
})
}
/* リマインダーの登録 */
let reminder = EKReminder(eventStore: eventStore)
let calendars = eventStore.calendars(for: .reminder)
for cal in calendars {
print(cal)
}
reminder.calendar = eventStore.defaultCalendarForNewReminders()
reminder.title = "BUKURO.swift"
do {
try eventStore.save(reminder, commit: true)
}
catch let error {
print(error)
}
2018-01-28 23:05:28.331076+0900 GettingThingsDone[2151:776673] [EventKit] Error getting default calendar for new remin
2018-01-28 23:05:28.331815+0900 GettingThingsDone[2151:776673] [EventKit] No object ID provided. Will not find out if th
Error Domain=EKErrorDomain Code=1 "No calendar has been set." UserInfo={NSLocalizedDescription=No calendar has bee
/* リマインダーの検索 */
let startDate = Calendar.current.date(from: DateComponents(
year: 2018, month: 1, day: 1, hour: 00, minute: 00, second: 00))
let endDate = Calendar.current.date(from: DateComponents(
year: 2019, month: 1, day: 31, hour: 23, minute: 59, second: 59))
let defaultCalendar = eventStore.defaultCalendarForNewEvents
let predicate = eventStore.predicateForIncompleteReminders(
withDueDateStarting: startDate!, ending: endDate!, calendars: [defaultCalendar!])
eventStore.fetchReminders(matching: predicate, completion: {
(reminders) in
for reminder in reminders! {
print(reminder)
}
})
/* リマインダーの削除 */
do {
try eventStore.remove(reminder, commit: true)
}
catch let error {
print(error)
}

七曜表と備忘録

  • 1.
    七曜表と備忘録 Otemachi.swift x Kyobashi.swift#02 2018/1/29 Bitz Co., Ltd. 村上幸雄
  • 2.
    • 埼玉県朝霞市でソフトハウスを起業。 • macOSやiOS、Androidのアプリケーション開発を主に請け負う。 •自社アプリの製作。 • Twitter: @m_yukio • Facebook: yukio.murakami • GitHub: murakami • http://www.bitz.co.jp/weblog/
  • 3.
    BUKURO.swift • macOS/iOS/watchOS/tvOSプログラマーのための勉強会。 初心者大歓迎。 • Cocoa勉強会関東とMOSAの合同勉強会。 ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催。 • 申し込みは、connpassから。 https://cocoa-kanto.connpass.com/ • プログラマーが楽しくプログラミングできるようにサポートする場を 提供したい • 勉強会に参加された方全員が学びを得られる様にサポートします! • 勉強会に参加できない方にも学び得られるよう、勉強会の成果を可 能な限りアウトプットします! • プログラマの拠り所となる場を目指します!
  • 4.
  • 5.
    リマインダー • 何を使っていますか? • 自分は、OmniFocus、Things→ リマインダー • OmniFocusは初代なので、最新のOSで動作しなくなりまし た。 • 乗り越し防止アラームとして、駅ベル を利用。 • macOS/iOSのリマインダーで事足りるようになりました。 • リマインダーをGTDで活用できないか?
  • 6.
  • 7.
  • 8.
    /* イベントストアへの接続 */ letstore = EKEventStore() /* イベント追加の権限取得 */ let status = EKEventStore.authorizationStatus(for: .event) var isAuth = false switch status { case .notDetermined: isAuth = false case .restricted: isAuth = false case .denied: isAuth = false case .authorized: isAuth = true } if !isAuth { store.requestAccess(to: .event, completion: { (granted, error) in if granted { } else { /* 使用拒否 */ return } }) }
  • 9.
    /* イベントの登録 */ letevent = EKEvent(eventStore: store) event.title = "BUKURO.swift 2017-12" event.startDate = Calendar.current.date(from: DateComponents(year: 2017, month: 12, day: 6, hour: 19, minute: 30, second: 00)) event.endDate = Calendar.current.date(from: DateComponents(year: 2017, month: 12, day: 6, hour: 22, minute: 00, second: 00)) event.calendar = store.defaultCalendarForNewEvents do { try store.save(event, span: .thisEvent) } catch let error { print(error) }
  • 10.
    /* イベントの検索 */ letstartDate = Calendar.current.date(from: DateComponents(year: 2017, month: 12, day: 1, hour: 00, minute: 00, second: 00)) let endDate = Calendar.current.date(from: DateComponents(year: 2017, month: 12, day: 31, hour: 23, minute: 59, second: 59)) let defaultCalendar = store.defaultCalendarForNewEvents let predicate = store.predicateForEvents(withStart: startDate!, end: endDate!, calendars: [defaultCalendar!]) var events = store.events(matching: predicate) print(events) 日付の範囲などを指定して検索できる。
  • 11.
    /* イベントの削除 */ do{ try store.remove(event, span: .thisEvent) } catch let error { print(error) }
  • 12.
  • 13.
    /* イベントストアへの接続 */ leteventStore = EKEventStore() /* リマインダー追加の権限取得 */ let status = EKEventStore.authorizationStatus(for: .reminder) var isAuth = false switch status { case .notDetermined: isAuth = false case .restricted: isAuth = false case .denied: isAuth = false case .authorized: isAuth = true } if !isAuth { eventStore.requestAccess(to: .event, completion: { (granted, error) in if granted { } else { print("使用拒否") return } }) }
  • 14.
    /* リマインダーの登録 */ letreminder = EKReminder(eventStore: eventStore) let calendars = eventStore.calendars(for: .reminder) for cal in calendars { print(cal) } reminder.calendar = eventStore.defaultCalendarForNewReminders() reminder.title = "BUKURO.swift" do { try eventStore.save(reminder, commit: true) } catch let error { print(error) } 2018-01-28 23:05:28.331076+0900 GettingThingsDone[2151:776673] [EventKit] Error getting default calendar for new remin 2018-01-28 23:05:28.331815+0900 GettingThingsDone[2151:776673] [EventKit] No object ID provided. Will not find out if th Error Domain=EKErrorDomain Code=1 "No calendar has been set." UserInfo={NSLocalizedDescription=No calendar has bee
  • 15.
    /* リマインダーの検索 */ letstartDate = Calendar.current.date(from: DateComponents( year: 2018, month: 1, day: 1, hour: 00, minute: 00, second: 00)) let endDate = Calendar.current.date(from: DateComponents( year: 2019, month: 1, day: 31, hour: 23, minute: 59, second: 59)) let defaultCalendar = eventStore.defaultCalendarForNewEvents let predicate = eventStore.predicateForIncompleteReminders( withDueDateStarting: startDate!, ending: endDate!, calendars: [defaultCalendar!]) eventStore.fetchReminders(matching: predicate, completion: { (reminders) in for reminder in reminders! { print(reminder) } }) /* リマインダーの削除 */ do { try eventStore.remove(reminder, commit: true) } catch let error { print(error) }