August 23, 2015

iOS9 Introducting the Contacts Framework

iOS9 จะมาพร้อมกับวิธีการเข้าถึง Address Book แบบใหม่ผ่าน Contacts Framework โดยจุดที่น่าสนใจก็คือ Framework ตัวนี้จะช่วยเราให้รอดพ้นจากความน่าเบื่อของ AddressBook Framework ตัวเดิมไปได้สักที ผมเชื่อว่าหลายคนต้องเบื่อ และรู้สึกว่า AddressBook Framework มันยากเย็นและดูซับซ้อน อีกทั้งวิธีการใช้งานก็ดูจะไม่เข้ากันกับ Objective-C เอาซะเลย

ดึงรายชื่อจาก Contacts ทั้งหมดที่มี
มาเริ่มลองดึงรายชื่อจากสมุดรายชื่อเลยดีกว่า โดย import Contacts ข้ามาใช้งาน จากนั้น สร้าง func listAllContacts() แบบนี้


จากโค้ดพบว่าเราจะอ้างถึง CNContactStore ก่อน โดยที่เราจะใช้ CNContactStore ในการ fetch และ save contact เป็นหลัก จากนั้นนิยาม attribute ที่ต้องการเรียกดู, สร้าง fetch request และ enumerate ค่าเพื่อเก็บไว้ในตัวแปรที่ต้องการ  โดยค่าที่ได้จะเป็น array ของ CNContact และเท่านี้เราก็จะได้รายชื่อทั้งหมดมาเก็บไว้ในมือแล้ว

อ้างถึง property และ print รายชื่อ
ขั้นตอนต่อมา เราลองเอา CNContact ที่ได้ print ออกมาดู โดยการสร้าง function func printContacts() แบบนี้


พบว่าโค้ดก็(ดูเหมือน)จะเรียบง่าย วนลูปเอาอีเมลล์ เบอร์โทรศัพท์มาต่อกัน แล้วพิมพ์ออกมา

สร้าง Contact
ต่อไปก็ลองสร้าง Contact ขึ้นมาใหม่ดู


พบว่าโค้ดก็ค่อนข้างตรงไปตรงมาอีกเช่นเคย โดยการอ้างถึง CNContactStore ก่อน สร้าง CNMutableContact และกำหนดค่าให้ property ที่ต้องการจากนั้นสั่ง save ผ่าน CNSaveRequest และอย่าลืมใช้ do-catch ด้วยนะครับ จากตัวอย่างผมใช้ try! เพื่อให้โค้ดมันดูไม่เยอะ

อีกอย่างที่สังเกตได้ก็คือการกำหนดค่าให้ email ในตัวอย่างจะใช้ CNLabeledValue เพื่อสร้างค่านี้ขึ้นมาและกำหนดลงไปใน property emailAddresses เนื่องจากว่า ปกติแล้วใน Contact มี attribute บางตัวที่เรามีได้มากกว่า 1 ค่า เช่น ที่อยู่ เบอร์โทรศัพท์ อีเมลล์ เป็นต้น และถ้าใครยังนึกภาพไม่ออก ให้ลองเปิดแอป รายชื่อ (Contacts) บน iOS ขึ้นมาดู เวลาเราสร้าง Contact เนื้อหาตรงอีเมลล์ ก็จะมีให้เราเลือกว่า อีเมลล์ที่เรากำลังสร้างนี้จะใช้ label ว่าอะไร เช่น Home, Work เป็นต้น

ค้นหารายชื่อ
ตัวอย่างสุดท้าย ก็คือการค้นหารายชื่อ ก็จะมีขั้นตอนดังโค้ดต่อไปนี้


จากโค้ด เราก็เริ่มจากการอ้างถึง CNContactStore ก่อนเหมือนเคย จากนั้นกำหนด predicate ของสิ่งที่เราต้องการหา กรณีนี้ผมใช้ตัวอักษร "D" เพียงตัวเดียว และต่อด้วยการกำหนดสิ่งที่เราต้องการ ซึ่งก็คือ given name, family name และ เบอร์โทรศัพท์ แปลว่า เรากำลังหารายชื่อของคนที่มีตัวอักษร D ใน property และเอามาเก็บไว้ในตัวแปร contacts

ขั้นตอนต่อไปคือการเอา contacts ที่ได้มา print ดูผลลัพธ์ แต่คราวนี้ผมจะไม่ใช้ function printContacts() แล้ว แต่ลองเปลี่ยนมาใช้ Function reduce, join และ map สนุกๆ ใน Swift แทน ก็จะได้โค้ดออกมาแบบนี้


และผลลัพธ์ตอน print ออกมาก็เป็นแบบนี้... ถึงตรงนี้ ลองเลื่อนกลับขึ้นไปดู function printContacts() ที่เคยเขียนไว้ และดูว่าโค้ดมันแตกต่างกันยังไง..

Daniel Higgins 555-478-7672,(408) 555-5270,(408) 555-3514
David Taylor 555-610-6679

ขอให้สนุกกับการใช้ Contacts Framework ตัวใหม่นี้ครับ :)

ปล. โค้ดที่เขียนไว้ไม่เหมาะต่อการนำไปใช้จริง เช่น การเข้าถึง contact ไม่ควรทำบน main thread
ดูรายละเอียดแบบยาวๆ ต่อได้ที่นี่ Introducing the Contacts Framework