[CS193P] 第十三堂課摘要及心得筆記

在這一堂的課程中,我們將學到如何在Cocoa Touch上使用Core Foundation和AddressBook這兩個Framework將我們的應用程式與iPhone OS上的通訊錄做結合,創造出更多有趣的應用程式。就讓我們一起來看看吧!
評論
評論

在這一堂的課程中,我們將學到如何在 Cocoa Touch 上使用 Core Foundation 和 AddressBook 這兩個 Framework 將我們的應用程式與 iPhone OS 上的通訊錄做結合,創造出更多有趣的應用程式。就讓我們一起來看看吧!

Core Foundation

Core Foundation 是 Cocoa Touch 底層的 Framework,以 C 語言為主。其所提供的功能就如同我們常常使用的 Foundation Framework 一般,一樣有提供 Array、String、Dictionary 等 API。例如:

  • NSArray => CFArrayRef
  • NSString => CFStringRef
  • retain = CFRetain
  • release = CFRelease

事實上,大多數的 Foundation Framework API 底層也是透過 Core Foundation 實做的。因此,幾乎兩個 Framework 的函式和物件都可以通用,如下方程式片段:

CFArrayRef array = ABAddressBookCopyPeopleWithName(...); NSLog(@“%d”, [(NSArray *)array count]); NSMutableArray *mutableArray = [(NSArray *)array mutableCopy]; [mutableArray release]; if (array) {     CFRelease(array); }

而在記憶體管理上,Core Foundation 所提供的物件也都有 retain count 的概念,物件一樣在使用完畢後也得 release 才行。在 Core Foundation 的命名慣例上,所有以 Create 結尾的函式都會回傳已經 retain 過的物件。

值得注意的是,C 語言並不像 Objective-C 一樣可以對 nil 物件呼叫函式,在 C 語言中,所有的函式呼叫都要先檢查是否不等於 NULL:

CFStringRef string = CreateSomeCFString...; if (string != NULL) {     DoSomethingWith(string);     CFRelease(string); }

當然我們也可以使用 Foundation Framework 來操作,方便許多:

NSString *string = (NSString *)CreateSomeCFString...; NSLog(@“%@”, [string lowercaseString]); [string autorelease]; // autorelease 也可以使用

那 為什麼我們要談 Core Foundation 呢?原因是 AddressBook Framework 也是以 C 語言為基礎,所回傳的物件也都是 Core Foundation 的物件,所以在我們使用 AddressBook 的 API 之前,必須要先熟悉 Core Foundation 的一些使用方法。

AddressBook

在這次的課程中,講者透過打造一個社群網路的網站作為主軸,向大家示範 AddressBook 的使用方式。而這個應用程式的運作流程為如下:

  1. 從網路下載資料
  2. 搜尋本機中是否已經有對應的聯絡人
  3. 更新資料
  4. 顯示資料

在進行後續步驟之前,我們必須先建立 AddressBookRef 的物件,這個物件會協助我們連接通訊錄所儲存的資料庫,而這個資料庫是全系統共通的,換句話說,我們可以建立很多 AddressBookRef,但最後都是存取同一份資料。如下段程式碼所示:

ABAddressBookRef ab = ABAddressBookCreate();

而在 AddressBook 中,每一筆聯絡人的資料就是 ABRecordRef,這裡面包含了聯絡人的所有 properties,像是姓名、電話或是頭像等等。每個 property 會有不同的型別,像是 CFString、CFDate 等等。而有些 property 會有多重 value,像是 E-mail 就又可以分成工作的 E-mail 和私人的 E-mail。這些 properties 都被定義在 ABPerson.h 裡面,有興趣的讀者還可以參考。

對於只有單一 value 的 property,可以使用以下程式片段:

CFStringRef first = ABRecordCopyValue(person, kABPersonFirstNameProperty); // 獲得 property CFDateRef date = CFDateCreate(...); ABRecordSetValue(person, kABPersonBirthdayProperty, date, &error); // 設定 property

ABMultiValueRef 則是用來處理多重 value 的 property 類別,以一個樹狀的結構呈現,每個不同的 value 都會有相對應的 label,如下圖所示:

而我們可以透過以下 API 來取得資料:

  • CFIndex count = ABMultiValueGetCount(multiValue); // 有多少不同 value
  • CFTypeRef value = ABMultiValueCopyValueAtIndex(mv, index); // 取得 value
  • CFStringRef label = ABMultiValueCopyLabelAtIndex(mv, index); // 取得 label
  • CFIndex identifier = ABMultiValueGetIdentifierAtIndex(mv, index); // 取得 identifier

也可以透過以下 API 儲存資料,除了設定聯絡人的 property 之外,我們也需要將整個 AddressBook 存回系統:

ABMultiValueRef urls = ABRecordCopyValue(person, kABPersonURLProperty); // 取得原有的 URL property ABMutableMultiValueRef urlCopy = ABMultiValueCreateMutableCopy(urls); // 建立新的 URL property ABMultiValueAddValueAndLabel(urlCopy, "the url", "social", NULL); // 加入新的 value 和 label ABRecordSetValue(person, urlCopy, kABPersonURLProperty); // 將新的 URL property 存回聯絡人 ABAddressBookSave(ab, &err); // 將整個 AddressBook 存回系統資料庫

而當完成更新資料後,下一個動作就是要在畫面上顯示聯絡人,而在顯示之前,可以先做排序:

CFMutableArrayRef people = // 取得存放聯絡人的 array CFRange fullRange = CFRangeMake(0, CFArrayGetCount(people)); ABPersonSortOrdering sortOrdering = ABPersonGetSortOrdering(); CFArraySortValues(people, fullRange, ABPersonComparePeopleByName, (void*)sortOrdering);

也可以透過 Objective-C 的 Framework:

[people sortUsingFunction:ABPersonComparePeopleByName context: (void*)sortOrdering];

而最後,AddressBook 也提供了 ABRecordCopyCompositeName(person); 以取得使用者的名稱。

以上大概就是簡單的 AddressBook 操作流程。

PersonViewController

當我們需要顯示 ABPerson 的詳細資料時,ABPesonViewController 就會提供很好的幫助,如下圖:

而 ABPersonViewController 有以下幾種 Property:

  • displayedPerson -- 顯示的 person
  • displayedProperties -- 顯示的 properties
  • allowsEditing -- 是否允許修改

而當我們要新增聯絡人資料時,則可以使用 ABUnknownPersonViewController,當使用者編輯完成之後,會呼叫 delegate 的方法:

- (void)unknownPersonViewController:(ABUnknownPersonViewController *) unknownCardViewController didResolveToPerson:(ABRecordRef)person

透過以上這兩個 View Controller,我們就可以完成 AddressBook 中 Person 的顯示和新增,更多資料請參考 AddressBook Programming Guide for iPhone OS

ABPeoplePickerNavigationController

除了顯示 AddressBook 的 Person 之外,有時我們也得提供使用者一個選擇的清單,而這個介面就可以透過 ABPeoplePickerNavigationController 來完成,如下圖:

想必大家在 iPhone 平台上開發也有一段時間了,自然可以猜想到這個類別也提供了很多 delegate 方法,像是當使用者選擇了聯絡人或者是取消時,都會呼叫對應的 delegate 方法。

更多的內容請參考 ABPeoplePickerNavigationController Class Referecne

結論

在這一次的課程中,我們獲得了許多關於 Core Foundation 和 AddressBook 的基本觀念,透過這兩個 Framework 我們可以將 iPhone 的通訊錄整合到我們的應用程式中,而不需要另外自行建立資料庫及相關程式。在下一次的課程中,內容將會轉移到 iPhone 上的多點觸控事件以及相關的使用方法,還請各位讀者敬請期待!

參考資源


台灣人偏好的威士忌風味?甜美風味是大宗,帶果香、蜜香風味威士忌男女皆愛

台灣每人一年平均品飲 2.3 瓶威士忌。不過,隨著女性愛好者逐年增加、族群年輕化的全球趨勢,威士忌的喜好風向正默默地變化著,更同時影響著國際酒廠推出熱門酒品的未來計劃。TNL Research 關鍵議題研究中心針對普羅大眾進行了威士忌的品飲喜好調查。
評論
評論

每年近 800 億元規模的台灣酒類市場中,威士忌最是一大重點。然而,近年來品醇族群結構的變化,加上酒友們對風味的求新求變,不少品牌開始尋覓下一個令人沈醉的風味。未來台灣威士忌市場主流,將吹向哪種風味的酒品呢?TNL Research 關鍵議題研究中心針對普羅大眾進行了威士忌的品飲喜好調查。

根據蘇格蘭威士忌協會公佈的 2021 年國際出口市場表現報告,台灣這個僅 2300 萬總人口的市場,一年竟進口了將近新台幣 85 億元的蘇格蘭威士忌,在全球排名第三。若再加上日本、美國等其他產地的酒品,統計資料也顯示全年威士忌市場消費總金額約 550 億新台幣,台灣每人一年平均品飲 2.3 瓶威士忌。不過,隨著女性愛好者逐年增加、族群年輕化的全球趨勢,威士忌的喜好風向正默默地變化著,更同時影響著國際酒廠推出熱門酒品的未來計劃。

三分之一女性愛好者  有力影響威士忌市場風潮

根據TNL Research關鍵議題研究中心於 7 月 11~12 日,針對年齡分布於 30 歲以上 ShareParty 會員所進行的「威士忌品飲習慣調查」,分析 376 份有效回收問卷之後發現,40.9% 受訪者有品飲威士忌的習慣,且男女比例已達逼近 2:1 之譜,顯見女性在威士忌同好族群中已成長至三分之一的比例,其風味喜好必將更具市場聲量。

Photo Credit:TNL Brand Studio

然而,再進一步詢問關於威士忌風味的偏好,倒是能從中一窺在男女族群上的異同處。台灣民眾近年來普遍偏好風味較為甜美、順口易入喉的威士忌,而兼具有果香者獲得最多受訪者的喜愛(57.4%),其次則是帶有蜂蜜風味之酒品(36.3%)。至於較具獨特個性的煙燻風味,訪問後倒是出現了35.9%男性喜愛,但僅有 14.5% 女性能夠接受的明顯差異。

提到風味甜美的威士忌,深諳威士忌的酒友們,腦海中必然會浮現百富單一麥芽威士忌。百富的傳奇首席調酒師大衛史都華(David C. Stewart),運用將近 60 年的經驗和深厚的製酒工藝,讓標誌性的「香甜蜂蜜」風味在每一款百富威士忌中都有一致但又獨特的展現。而大衛史都華更令人讚賞不已的,是他於 1980 年代所發明的「過桶」(Cask Finish)工藝:先將威士忌置於傳統橡木桶中熟成若干年後,再移至另一種橡木桶進行第二次的熟成,而二次熟成的時間並非定數,全靠大衛史都華帶領團隊的耐心定期監控,直到他滿意其風味之後,方才進行裝瓶。40 年來運用「過桶」工藝,百富將酒廠經典的蜂蜜、香草基調,變幻出多樣的迷人風貌,因而廣受全球消費者歡迎。

私聊聚會  最是品飲威士忌的好時機

Photo Credit: 百富

關於最適合享飲威士忌的生活情境,則有近七成(68.8%)受訪者鍾意於私人會所或家庭聚餐時,與三五好友共享黃金酒液,其次還有「商務應酬場合」(35.9%)及「餐廳等公開場合聚會」(35.6%)成為品飲威士忌的常見場景;也有超過三成(32.8%)受訪者鍾愛與另一伴在家中親密啜飲。

若要在私聚餐會上品飲明顯具有果香風味的威士忌,百富 12 年雙桶 DoubleWood 是威士忌愛好者的首選之一。百富首席調酒師大衛史都華精選首次裝桶之 Oloroso 雪莉桶,陳放 9 個月過桶的百富 12 年雙桶單一麥芽威士忌,從 1993 年販售迄今已近 30 年,為百富的最經典酒款。此外,百富酒廠歷史上推出的第二種過桶酒款:百富 21 年波特酒桶 PortWood 威士忌,經長時間窖藏熟成,醞釀極具深度的風味,是百富獲得首獎最多,也是首席調酒師大衛史都華個人最愛的酒款之一。

首創過桶工藝  讓百富威士忌在甜美蜂蜜風味上  更增添多變的層次

Photo Credit: 百富

最後,綜合分析威士忌市場的主流風味,果香、蜂蜜、煙燻和花香是台灣民眾鍾愛的四大風味。然而,想要品飲這四種風味,藉由百富首創的過桶工藝,體驗品牌經典的香甜蜂蜜風味之餘,如果想要體驗熱帶水果的果香,就可選擇百富 14 年加勒比海蘭姆桶單一麥芽威士忌。過桶加勒比海蘭姆酒桶(Rum)的金黃酒液,先帶來熱帶水果、熱帶香料及太妃糖的香氣,再引出香草、橡木桶甜味,口感濃厚圓潤,餘韻柔和且綿長。

若是喜歡煙燻泥煤風味,百富故事系列 14 年泥煤週威士忌是個很好的選擇,溫和的煙燻泥煤融合著細緻奶油蜂蜜氣息與淡雅花香調,品飲時還能感受到些微的柑橘和橡木氣息,猶如天鵝絲絨般的滑順飽滿口感,加上引出水果香氣的尾韻層次變化,怎會不讓人念念難忘。

Photo Credit:百富

近來領先全球、在台首發上市的百富 16 年法國皮諾甜酒桶單一麥芽威士忌,是百富首席調酒師大衛史都華的最新傑作,先在美國橡木桶陳年 16 年,再經由法國皮諾甜酒桶二次熟成,讓百富的蜂蜜甜香層疊出更多層次感,不僅讓品飲者能嗅聞到美妙平衡的蓮花與天竺葵花香,更有蜂蜜基調和細緻蜜餞、嫩薑辛香,加上清爽順口的尾韻,豐富感受、很是令人著迷。

一心一藝,百富持續以「過桶工藝」在標誌性的香甜蜂蜜風味之上,尋找新的可能。相信只要曾感受過桶工藝的魔幻般奧妙,肯定會為台灣日益增長的威士忌愛好者族群,開拓出更為寬廣多元的嗅味覺體驗疆域。