[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 上的多點觸控事件以及相關的使用方法,還請各位讀者敬請期待!

參考資源


用 Line 視訊太久會致癌?別再污名化手機通訊,謠言比電磁波更有害!

「聽說 LINE 通話會讓電磁波飆高 6 萬倍」、「手機通話的電磁波可以爆爆米花」…這些如同都市傳說的網路文章,你是否也曾閱讀過呢?
評論
Photo Credit:Unsplash
評論

茶水間內,兩位 OL 正在一邊加熱中午的便當一邊閒聊著,「最近有一件事情讓我有點擔心⋯」今年剛滿三十歲的北漂族 A小姐說道,「因為疫情我跟我男友已經好幾個月沒有見面了,但我們還很熱戀呀,所以常常每晚都開著 Line 視訊電話聊到睡著。」

「這樣很甜蜜啊,有什麼好煩惱的?」B 小姐盯著微波爐內旋轉著的便當盒答。A 小姐吞了吞口水,「還不是最近看到一些網路文章,說電子產品用太多,那個什麼⋯電磁波會影響大腦,聽說會致癌耶!太可怕了,害我這陣子都怕怕的⋯⋯」

Photo Credit:unsplash

Q:聽說LINE通話會讓電磁波飆高 6 萬倍,恐導致癌症,這是真的嗎?

答案是錯的喔,台大電機系教授陳士元表示,手機的電磁波並不會因為你現在在用何種 APP,就會發出不同的電磁波。只要在一樣的通訊情境下,不管是滑臉書、看 YouTube,還是用 Line 講視訊電話,電磁波都不會大幅改變的。

當然還是會有輕微變動的狀況,通常發生於手機開機與接通電話的瞬間,電磁波會稍微增強,不過正常使用和通話期間電磁波反而強度會削弱,不過這些電磁波的數值都符合國家及國際規範。

你可能會問,但用 Line 講電話的時候,手機都會變得比較燙呀?陳士元教授解釋,這與電磁波無關,純粹就是手機用電量增加而熱度提高,大家毋須擔心。

這裡補充一個小知識——根據國際非游離輻射防護委員會規定,手機電磁波高低判定,是看每一款手機的電磁波能量比吸收率(Specific Absorption Rate ,簡稱 SAR 值),也就是指生物體在每單位公斤所吸收到的輻射量功率,當 SAR  值越低,代表人體所接收到的輻射量越少。

如果你和 A 小姐一樣,很好奇或擔心自己的手機到底會釋放多少 SAR值,可以到 NCC 網站中,點擊「型式認證查詢網頁」(https://nccmember.ncc.gov.tw/Application/Fun/Fun016.aspx),輸入手機的「廠牌」、「型號」或「型式認證號碼」等資訊,最後再輸入確認碼後就可以看到相對應的資料囉。網頁中也列出不符 NCC 所定技術規範的電子設備,也趁機檢查看看家中是否有這些帶有風險的裝置吧。

Q:之前曾在網路上看過手機通話時的電磁波可以爆爆米花的影片,看起來好危險喔,這是真的嗎?

這個在網路上流傳的影片,乍看之下好像很嚇人沒錯,但其實是美國的廣告影片,所以即使看起來很真實,但裡面的效果都是假象喔,大家可千萬別信以為真。

仔細想想,中午熱便當所使用的微波爐,也至少要花一分鐘才有可能將玉米變成爆米花,更何況是平均輸出功率更低的手機,簡直是不可能的任務。所以影片中應是在桌下藏了瞬間加熱器的裝置,才能在幾秒間將玉米變成爆米花呢。

Photo Credit:Unsplash

基地台太近對健康有害?答案並非你想的那樣!

民眾可能會有個迷思:離通訊基地台越近,信號越強電磁波應該也越強,對健康會造成危害?

事實上,手機發射的訊號與基地台電磁波的強度,兩者是反比關係喔。距離基地台越近,手機訊號越好,手機電磁波的強度越弱;反之,距離基地台越遠,訊號越差,手機電磁波反而強度越強。

此外,現在的通訊基地台皆採用「蜂巢式通訊系統」的架構來建造,將服務區域切割成小塊小塊的範圍,透過大數量基地台所組成的「蜂巢」來涵蓋所有通訊區域的範圍。也因此,每座基地台的電磁波強度皆不高,且都在人體可接受的範圍內,因此不會對健康有所危害。

 別再污名化電磁波,好好相處才是長久之道

今天我們簡單洗刷了「電磁波」的冤屈,還它個清白——A 小姐不需要再擔心使用 Line 通話會被電磁波影響健康了,如果你想認識更多相關資訊,歡迎至國家通訊傳播委員會的行動通訊電磁波官網(https://memf.ncc.gov.tw/),查看更多延伸閱讀。

除此之外,如果你對家中或手機的電磁波曝露量很有疑慮,也歡迎撥打基地臺電磁波量測服務專線 0800-580-010(0800,我幫您,量一量),讓專業人士到府服務來替你排除疑慮,停止被謠言迷惑心智!

國家通訊傳播委員會 廣告