บันทึกกิจกรรม (Event) ลงปฏิทิน ง่ายๆด้วย Event Kit UI — Swift 2.0 iOS9

ibankstory
Swifty Coffee

--

พอดีแอพที่ผมพัฒนานั้น มีการทำงานสำหรับแจ้งเตือนผู้ใช้เมื่อถึงเวลาของกิจกรรมนั้นๆ ซึ่งปกติแล้วผมจะใช้ UILocalNotification เพื่อให้แอพแจ้งเตือน ขึ้นมา และผู้ใช้จะต้องเปิดแอพขึ้นมาดูรายละเอียดเวลาถึงวันเวลาที่กำหนด

แต่ข้อจำกัดของ UILocalNotification คือจะแจ้งเตือนแค่เครื่อง iPhone หรือ iPad ที่ลงแอพของเราเครื่องเดียวเท่านั้น ครั้งนี้ผมอยากให้ข้อมูล และเวลา ของกิจกรรมนั้นแจ้งเตือนไปยังเครื่องอื่นๆที่ผู้ใช้มี เช่น iPhone, iPad และ Mac ทำยังไงดีหละ?

คำตอบคือ บันทึกกิจกรรม (Event) ลงบน แอพ ปฏิทิน (Calendar) ที่มาพร้อมกับ iOS และ OSX อยู่แล้ว และ ปฏิทิน ก็จะถูกเชื่อมข้อมูลกันระหว่างเครื่องของผู้ใช้ผ่าน บริการ iCloud ทำให้เราไม่จำเป็นจะต้องมี Sever เพื่อ Sync ข้อมูลหากันเลยปล่อยให้ iCloud จัดการไป

ภาพจาก : https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004759-SW1

เริ่มต้นมารู้จัก Framework ที่จะช่วยจัดการเรื่องเหล่านี้ให้เราก่อน นั่นคือ Event Kit Framework และ EventKit UI

Event Kit นั้น เป็นตัวช่วยให้แอพของเราสามารถเข้าถึงแอพ Calendar และ แอพ Reminders ที่มาพร้อมกับ iOS Devices ของเรา โดยแอพเราสามารถ แสดง แก้ไข หรือแม้แต่ สร้างกิจกรรม และ การแจ้งเตือน ใหม่ไปยัง Calendar และ Reminder แอพ ได้โดยตรงจากแอพเราเลย

Event Kit UI จะคล้ายกับ Event Kit แต่จะใช้ View Controller มาการแสดงผล ให้ผู้ใช้สามารถแก้ไข ข้อมูลก่อนที่จะทำการบันทึกกิจกรรมไปยัง แอพปฏิทิน

เรามาสร้าง กิจกรรม เพื่อบันทึกไปยัง ปฏิทิน กันดีกว่า

เริ่มแรก import EventKitUI มายัง ViewController ที่เราต้องการเรียกใช้งานกันก่อน ในที่นี้คือ ViewController.swift

import EventKitUI

ก่อนที่จะทำการเข้าถึงข้อมูลในแอพ Calendar ได้ แอพของเราจะต้องทำการขออนุญาตผู้ใช้เสียก่อน

Code ด้านบนเป็นการตรวจสอบสถานะการเข้าถึงข้อมูล โดย .Authorized หมายถึงผู้ใช้ได้อนุญาตให้เข้าถึงข้อมูลปฏิทินแล้ว สมารถดำเนินการกับข้อมูลได้เลย ส่วน .NotDetermined หมายถึง ยังไม่มีการร้องขอ ให้ทำการเขียน Code เพื่อร้องขอก่อน และ .Denied หมายถึง ผู้ใช้ไม่อนุญาตให้เข้าถึงข้อมูลปฏิทิน T_T

เรามาดู Code การร้องขอการเข้าถึงข้อมูลปฏิทินกันก่อน

จาก Code ด้านบน EKEventStore class จะเป็นตัวกลางคอยจัดการให้เราเข้าถึงข้อมูลของปฏิทิน (พูดง่ายๆ มันคือ Database)

สำหรับ method requestAccessToEntityType() เป็นการร้องขอการเข้าถึง โดยต้องระบุด้วยว่า เราต้องการจะเข้าถึงอะไร โดย EKEntityType จะมีสองแบบ คือ

.Event ซึ่งก็คือกิจกรรมแอพ Calendar และ .Reminder คือ การแจ้งเตือนสำหรับแอพ Reminders ในที่นี้เราใช้ .Event ครับ

เมื่อ requestAccessToEntityType() ทำงาน จะมี Popup มาถามผู้ใช้เพื่อขออนุญาตเข้าถึงข้อมูล หากผู้ใช้ยินยอม แอพเราก็สามารถเข้าถึงข้อมูลปฏิทินได้เลย เย้

ได้เวลาสร้างกิจกรรมจริงๆสักที หวัดดี EKEvent

EKEvent class ชื่อก็บอกตรงๆเลยว่ามันคือ “กิจกรรม” เราสามารถสร้างมันและกำหนดรายละเอียดต่างๆให้มันได้ เช่น title, start_date, end_date etc.

ก่อนอื่น มาดูกันก่อนว่า Event ที่ผมต้องการจะบันทึกลง ปฏิทินนั้นมีรายละเอียดอะไรบ้าง

  1. ชื่อกิจกรรมคือ “วันกินกาแฟและปิ้งย่างและกรึ๊บๆ
  2. วัน และเวลา “19 ตุลาคม 2558 เวลา 09.00–21.00
  3. สถานที่จัดกิจกรรม “ร้าน วิทยา Brew Specialty Coffee
  4. ผมมี ตำแหน่ง GPS ของร้าน “7.79903,98.33504” (อันนี้จะหามาจากไหนก็แล้วแต่)
  5. และ Notes สำหรับกิจกรรมนั้นๆ “ใครอยากกินอะไรเป็นพิเศษพามาด้วย เรามีเตา เรามีแก้ว เรามีน้ำแข็ง และอุปกรณ์ ชงกาแฟเพียบบบ
  6. ผมอยากได้การแจ้งเตือน ก่อนถึงเวลากิจกรรม 1 วัน และ เตือนอีกครั้งก่อนถึงเวลา 1 ชั่วโมง

ทีนี้เรามาสร้าง และกำหนดค่าให้กิจกรรมกัน

ต่อไป ก็มากำหนด Location ของ กิจกรรมกัน

สุดท้าย กำหนดการแจ้งเตือน

การกำหนดการแจ้งเตือนนั้น เราต้องสร้าง object จาก EKAlarm class เพื่อกำหนดเวลาสำหรับแจ้งเตือน ในที่นี้ ผมได้กำหนดเวลาเป็น 2 ช่วง คือ 1 วันก่อนถึงเวลากิจกรรม กับ 1 ชั่วโมงก่อนถึงเวลากิจกรรม relativeOffset นั้นชนิดของมันจะเป็น NSTimeInterval หรือ วินาที ดังนั้นผมจึงกำหนด 60*60*24 เท่ากับ 86,400 วินาที ก็จะเท่ากับ 1 วันพอดี และจัดการ *(-1) เข้าไปจะเป็น -86,400 วินาที จะหมายความว่า ก่อนหน้าเวลาจัดกิจกรรม 1 วันครับ

เมื่อกำหนดรายละเอียดของกิจกรรมเสร็จหมดแล้วจะได้ Code ประมาณนี้

ได้กิจกรรมแล้วต่อไปทำอะไรต่อหละ?

ต่อไปก็จะเป็นขั้นตอนสุดท้ายคือ การบันทึก กิจกรรม ที่เราได้สร้างไว้ ไปยังแอพ Calendar โดยจะแสดงผลรายละเอียดข้อมูลให้ผู้ใช้เห็นก่อน โดยใช้ EKEventEditViewController class ซึ่งรูปแบบการแสดงผล ก็จะเป็นเหมือนกับตอนที่เราสร้างกิจกรรบนหน้าแอพ Calendar เลย จะมีแบบฟอร์มให้ผู้ใช้กรอก แก้ไข รายละเอียดต่างๆได้

เมื่อกดหนด EKEventEditViewController แล้ว อย่าลืม conform protocol delegate เพราะถ้าไม่ทำ เมื่อหน้าจอแบบฟอร์แสดงผลขึ้นมา ผู้ใช้จะไม่สามารถกดปิดได้

เสร็จแล้ว เมื่อ เราเรียกใช้งาน ฟังก์ชั่น addEventToCalendar() ผู้ใช้ก็จะพบหน้าจอแบบนี้

ภาพหน้าจอ : ที่เห็นคือ EKEventEditViewController

เมื่อผู้ใช้กดบันทึก กิจกรรมที่เราเพิ่งสร้างนั้นก็จะไปแสดงผลอยู่บนแอพปฏิทิน ตามภาพ

ภาพหน้าจอ : Event ที่เราสร้าง อยู่ด้านล่างสุด
ภาพหน้าจอ : เมื่อเปิดดูรายละเอียดของ Event

จะเห็นได้ว่า ข้อมูลที่เราสร้างด้วย EKEvent class ถูกแสดงผลตามที่เราได้กำหนดไว้ ไม่ว่าจะเป็นชื่อ เวลา และสถานที่จัดกิจกรรม พร้อมแสดงเป็น Mini Map ที่ผู้ใช้สามารถกดเพื่อเปิด Map นำทางไปได้เลย อีกทั้ง ยังมีการแจ้งเตือน ตามที่ต้องการ

ผมขอยกตัวอย่างคร่าวๆแค่นี้นะครับ Event Kit และ Event Kit UI ยังทำอะไรได้มากกว่านี้อีกเยอะ ลองศึกษาเพิ่มเติมดูนะครับที่ Apple Documantation

หากใครมีข้อสงสัย หรือติ ในส่วนไหน ผมยินดีครับ มาแชร์กันเยอะๆนะครับ ขอบคุณครับ

iBankstory

--

--

ibankstory
Swifty Coffee

iOS Developer, iPhonetographer, Runner, Love Coffee, I live in Phuket, Thailand