撰文:Ahmed Bakir
物聯(lián)網(wǎng)的定義
物聯(lián)網(wǎng)(Internet of Things,IoT)是指通過(guò)接收或記錄來(lái)自互聯(lián)網(wǎng)和其他事物的數(shù)據(jù),來(lái)推動(dòng)應(yīng)用程序、硬件設(shè)備或物朝著智能的方向發(fā)展。物聯(lián)網(wǎng)的目標(biāo)是利用這些額外的數(shù)據(jù)源,讓人們生活中的常見(jiàn)任務(wù)變得更豐富、更容易執(zhí)行。
物聯(lián)網(wǎng)早的驅(qū)動(dòng)因素之一是量化自我(Quantified Self)的運(yùn)動(dòng),這一趨勢(shì)表明,人們可以通過(guò)不斷記錄和監(jiān)控自己的飲食和鍛煉信息,以便在更可持續(xù)的水平上減肥和增進(jìn)健康。盡管這首先是從卡路里計(jì)數(shù)的日記賬和計(jì)步器中收集的數(shù)據(jù)開(kāi)始的,但在這之后開(kāi)始出現(xiàn)了諸如MyFitnessPal之類(lèi)的應(yīng)用程序(可幫助用戶查找午后零食的熱量信息)和諸如Fitbit之類(lèi)的設(shè)備,此類(lèi)設(shè)備可以將用戶的計(jì)步器數(shù)據(jù)自動(dòng)記錄到互聯(lián)網(wǎng)上,從而推動(dòng)量化自我運(yùn)動(dòng)成為一種讓很多人都熱衷的潮流。
運(yùn)行中的物聯(lián)網(wǎng)的另一個(gè)示例是智能電視。僅僅在幾年之前,電視還只是一個(gè)啞巴屏幕,僅顯示所連接的輸入設(shè)備(如機(jī)頂盒、游戲機(jī)或VCR)的輸出(這些東西你是不是都已經(jīng)快忘記了)。隨著軟硬件產(chǎn)品的快速更新迭代,如今的電視通常包括WiFi卡和智能應(yīng)用程序平臺(tái),這些平臺(tái)使用戶可以執(zhí)行一些常見(jiàn)的任務(wù),例如從Netflix播放流視頻或直接通過(guò)電視瀏覽Instagram的照片,而無(wú)須連接計(jì)算機(jī)。許多電視當(dāng)前已經(jīng)達(dá)到堪稱智能的程度(例如,當(dāng)想要看電視時(shí),可自動(dòng)打開(kāi)經(jīng)常看的節(jié)目),這是由于在PC和手機(jī)上已經(jīng)實(shí)現(xiàn)了此類(lèi)功能,因此,連接了互聯(lián)網(wǎng)的智能電視實(shí)現(xiàn)這樣的功能不過(guò)是小事一樁,有很多開(kāi)發(fā)人員為電視編寫(xiě)此類(lèi)應(yīng)用程序。
今天的物聯(lián)網(wǎng)與之前將設(shè)備連接到互聯(lián)網(wǎng)的嘗試之間的一個(gè)顯著區(qū)別是,進(jìn)入的技術(shù)壁壘已經(jīng)大大降低。以前,構(gòu)建Internet連接設(shè)備的方法是讓訓(xùn)練有素的硬件和軟件工程師團(tuán)隊(duì)構(gòu)建專(zhuān)有平臺(tái),并且可能需要幾年的時(shí)間;而如今,則可以去任何電子商店或網(wǎng)站購(gòu)買(mǎi)Arduino或Raspberry Pi,輕松將幾年前的計(jì)算機(jī)主板納入掌中,價(jià)格30美元左右。這些設(shè)備旨在為業(yè)余愛(ài)好者和學(xué)生提供一種簡(jiǎn)便的輸入電子設(shè)備的方式(以前,這是一種非常昂貴的業(yè)余愛(ài)好某個(gè)過(guò)來(lái)人的心聲),還包括構(gòu)建連接設(shè)備所需的所有核心功能能夠運(yùn)行高級(jí)編程語(yǔ)言(如Python)的CPU、WiFi卡、顯示端口(通常是HDMI)以及一系列通用輸入/輸出(General Purpose Input/Output,GPIO)引腳,這些引腳可以讓開(kāi)發(fā)人員連接電子組件,如計(jì)時(shí)器芯片和LED燈。
消費(fèi)者和生產(chǎn)企業(yè)都已經(jīng)注意到互聯(lián)設(shè)備的需求,以及進(jìn)入市場(chǎng)的便利性,這使得當(dāng)前成為學(xué)習(xí)如何為物聯(lián)網(wǎng)編程的時(shí)機(jī)!說(shuō)不定哪一天你的應(yīng)用也將推動(dòng)某一款個(gè)性化產(chǎn)品或服務(wù)成為一種潮流!
本書(shū)目標(biāo)
本書(shū)的目標(biāo)是教會(huì)讀者如何使用Apple公司的原生應(yīng)用程序編程接口(Application Programming Interface,API)在Swift中構(gòu)建iOS應(yīng)用程序,該API可連接到流行的物聯(lián)網(wǎng)(IoT)設(shè)備和服務(wù)。本書(shū)將圍繞以下4類(lèi)設(shè)備進(jìn)行敘述。
? 健身和健康追蹤器。
? Apple手表。
? 通用硬件配件。
? 認(rèn)證和支付系統(tǒng)。
上述設(shè)備系列代表了一些非常流行的IoT配件類(lèi)別,同時(shí)使我們可以教給讀者若干種不同的方法來(lái)連接IoT設(shè)備,包括原生iOS庫(kù)(如HealthKit和WatchKit)、通用硬件接口(如藍(lán)牙)、第三方數(shù)據(jù)記錄服務(wù)(如Fitbit)和本地網(wǎng)絡(luò)(通過(guò)WiFi)。當(dāng)今物聯(lián)網(wǎng)的美妙之處在于,基于廣泛采用的開(kāi)放標(biāo)準(zhǔn),有多種方法可以連接設(shè)備,從而減少了學(xué)習(xí)專(zhuān)有協(xié)議的需求。我們的目標(biāo)是通過(guò)向讀者展示連接到IoT設(shè)備的不同方式,幫助讀者掌握一個(gè)方便的技能工具箱,以滿足讀者需要實(shí)現(xiàn)的大多數(shù)用例。
本書(shū)以教程風(fēng)格進(jìn)行介紹,該教程借鑒了現(xiàn)代軟件工程實(shí)踐的經(jīng)驗(yàn),如代碼審查和敏捷編程。本書(shū)的每一章都圍繞著一個(gè)將要學(xué)習(xí)如何實(shí)現(xiàn)的項(xiàng)目而展開(kāi),將通過(guò)假想的故事和需求進(jìn)行描述,以闡述其重要之所在。以類(lèi)似的方式,我們的解釋將深入代碼中,并從Apple的規(guī)范和其他應(yīng)用程序中借鑒實(shí)踐。必要時(shí),我們將簡(jiǎn)要介紹基礎(chǔ)主題,如委托編程和OAUTH身份驗(yàn)證,因此讀者無(wú)須為了某個(gè)知識(shí)點(diǎn)而反復(fù)翻閱不同的書(shū)籍。本書(shū)的目標(biāo)是使讀者對(duì)將要實(shí)現(xiàn)的項(xiàng)目有深入的了解,而不是復(fù)制并粘貼的摘要記錄。作為經(jīng)歷過(guò)重大iOS升級(jí)(例如,從iOS 6升級(jí)到iOS 7)的開(kāi)發(fā)人員,我們可以證明,了解核心概念比記憶一次性使用的代碼段更有助于讀者修復(fù)自己的代碼。
本書(shū)適合的讀者
本書(shū)的目的是成為開(kāi)發(fā)人員在iOS中實(shí)現(xiàn)特定主題的指導(dǎo)手冊(cè)。它的結(jié)構(gòu)可以引導(dǎo)初學(xué)者和中級(jí)程序員理解他們需要的信息,同時(shí)還可以使高級(jí)讀者準(zhǔn)確地找到他們想要的內(nèi)容。換句話說(shuō),就是本書(shū)適合從初級(jí)到高級(jí)各個(gè)層次的讀者,他們均可以從本書(shū)的閱讀中受益。話雖如此,本書(shū)在撰寫(xiě)時(shí)也考慮了一些假設(shè)。
? 讀者對(duì)核心編程概念(面向?qū)ο蟮木幊、指針、函?shù)等)有扎實(shí)的基礎(chǔ)。
? 讀者具有iOS開(kāi)發(fā)基礎(chǔ)知識(shí)(使用Xcode、Interface Builder和Cocoa Touch庫(kù))。
? 讀者已有使用Swift或Objective-C編程的經(jīng)驗(yàn)。
由于Swift和Xcode是不斷發(fā)展的工具,因此本書(shū)的前兩章將介紹集成開(kāi)發(fā)環(huán)境(IDE)和語(yǔ)法基礎(chǔ)。這些章節(jié)的目的是幫助從Objective-C過(guò)渡到Swift的開(kāi)發(fā)人員,以及尚未有機(jī)會(huì)查看Apple煩瑣的API更新文檔的開(kāi)發(fā)人員。
為了擴(kuò)大對(duì)Swift編程語(yǔ)言、iOS編程和Xcode的討論,我們建議讀者閱讀表P-1中列出的圖書(shū)(這些圖書(shū)也是Apress公司出版的)。
表P-1 推薦參考書(shū)目
主 題 書(shū)名和作者
iOS開(kāi)發(fā)入門(mén) 書(shū)名為Beginning iPhone Development with Swift(用Swift開(kāi)始iPhone開(kāi)發(fā)),作者為David Mark、Jack Nutting、Kim Topley、Fredrik Olsson和Jeff LaMarche(Apress出版,2014年)
使用Xcode和調(diào)試器 書(shū)名為Beginning Xcode:Swift Edition(Xcode入門(mén):Swift版),
作者為Matthew Knott(Apress出版,2014年)
中間iOS開(kāi)發(fā) 書(shū)名為L(zhǎng)earn iOS 8 App Development(學(xué)習(xí)iOS 8 App開(kāi)發(fā)),
作者為James Bucanek(Apress出版,2014年)
Swift語(yǔ)法 書(shū)名為Swift for Absolute Beginners(Swift菜鳥(niǎo)入門(mén)教程),
作者為Gary Bennett和Brad Lees(Apress出版,2014年)
iOS編程的參考是Apple的官方iOS開(kāi)發(fā)人員庫(kù),讀者可以通過(guò)Xcode的Window(窗口)菜單中的Documentation and API Reference(文檔和API參考)命令訪問(wèn)(見(jiàn)圖P-1),也可以通過(guò)在線訪問(wèn),其網(wǎng)址如下:
https://developer.apple.com/library/ios/navigation/
圖P-1 從Xcode訪問(wèn)iOS開(kāi)發(fā)人員庫(kù)
注意:
請(qǐng)始終使用版本的iOS開(kāi)發(fā)人員庫(kù)作為你的API參考。Apple經(jīng)常進(jìn)行重大的棄用和參數(shù)更改,即使在次要版本中也是如此。
保持狀態(tài)的方法是保持的Xcode版本或訪問(wèn)iOS Developer Library網(wǎng)站。
入門(mén)要求
本書(shū)是圍繞在計(jì)算機(jī)上開(kāi)發(fā)應(yīng)用程序并在可能與硬件附件配對(duì)的物理設(shè)備上進(jìn)行測(cè)試的工作流而設(shè)計(jì)的。本書(shū)中項(xiàng)目所需的API在iOS模擬器中是不提供的。
Apple使用物理設(shè)備開(kāi)發(fā)和測(cè)試iOS應(yīng)用程序的要求與將應(yīng)用程序提交到App Store的要求相同,具體如下。
? 運(yùn)行OS X Yosemite(10.10)或更高版本的基于Intel的Mac。
? Xcode 7或更高版本。
? 能夠運(yùn)行iOS 9.1或更高版本的iPhone或iPad(iPhone 5或更高版本、iPad 2/iPad mini或更高版本)。
? 有效的Apple ID,可以注冊(cè)免費(fèi)的基于設(shè)備的應(yīng)用程序測(cè)試。
從2015年夏季開(kāi)始,Apple取消了必須擁有付費(fèi)iOS開(kāi)發(fā)者計(jì)劃會(huì)員資格才能在iOS設(shè)備上測(cè)試應(yīng)用程序的要求,但仍需要付費(fèi)會(huì)員資格才能將應(yīng)用程序提交到App Store、使用TestFlight進(jìn)行Beta測(cè)試以及調(diào)試基于Apple服務(wù)器的API(如Apple Pay)?梢酝ㄟ^(guò)登錄Apple Developer Program網(wǎng)站(https://developer.apple.com/programs/,中文網(wǎng)址為https://developer.apple.com/cn/programs/)并單擊Enroll(注冊(cè))按鈕來(lái)注冊(cè)Apple Developer Program會(huì)員資格,如圖P-2所示。收到費(fèi)用后,在Apple Store中,所選擇的Apple ID將可在Apple Developer Program中使用。
圖P-2 注冊(cè)一個(gè)付費(fèi)的Apple Developer Program賬戶
說(shuō)明:
如果要注冊(cè)一個(gè)企業(yè)開(kāi)發(fā)人員賬戶,則需要向Apple提供其他信息以標(biāo)識(shí)你的實(shí)體,如Dunn & Bradstreet號(hào)(鄧白氏集團(tuán)信用賬號(hào))。處理此類(lèi)賬戶將需要更多的時(shí)間。
本書(shū)中的項(xiàng)目旨在通用,這意味著它們可以同時(shí)在iPhone或iPad上運(yùn)行。這些用戶界面主要是為iPhone設(shè)計(jì)的,但它們會(huì)按比例放大并在iPad上以相同的方式工作。
本書(shū)涵蓋的內(nèi)容
本書(shū)包含15章,分為5篇。
第1篇為物聯(lián)網(wǎng)應(yīng)用程序開(kāi)發(fā)和Swift編程語(yǔ)言基礎(chǔ)知識(shí),包括第1~2章。第1章通過(guò)一個(gè)簡(jiǎn)單的實(shí)例介紹了在Xcode中創(chuàng)建應(yīng)用程序的基本操作,第2章則介紹了Swift的基本語(yǔ)法和特定功能等,方便開(kāi)發(fā)人員快速入門(mén)。
第2篇為Fitbit健康設(shè)備項(xiàng)目,包括第3~5章,要求開(kāi)發(fā)人員擁有iPhone 5S或更高版本的設(shè)備,才能使用Core Motion框架。iPad和較舊的iPhone沒(méi)有Core Motion提供的M系列運(yùn)動(dòng)協(xié)處理器芯片。該芯片包括一個(gè)高級(jí)計(jì)步器和陀螺儀,它們可以按小于GPS芯片功耗十分之一的速度進(jìn)行跟蹤(根據(jù)Apple的要求)。對(duì)于第5章,開(kāi)發(fā)人員需要在Fitbit.com上有一個(gè)免費(fèi)賬戶才能生成樣本數(shù)據(jù)進(jìn)行測(cè)試,但不需要Fitbit硬件設(shè)備。你可以在Fitbit網(wǎng)站上手動(dòng)輸入步數(shù)、卡路里攝入量和體重。
第3篇為Apple Watch項(xiàng)目,包括第6~8章,前兩章可以使用Apple Watch模擬器來(lái)實(shí)現(xiàn);但是,第8章則利用模擬器不支持的Core Location框架的功能。Apple Watch仍然是一個(gè)正在不斷優(yōu)化的硬件平臺(tái),因此好使用Apple Watch對(duì)應(yīng)用程序進(jìn)行測(cè)試以獲取真實(shí)的性能數(shù)據(jù)。
第4篇為藍(lán)牙和WiFi連接,包括第9~12章,它要求開(kāi)發(fā)人員至少有兩臺(tái)iOS設(shè)備。第9章教給開(kāi)發(fā)人員如何通過(guò)藍(lán)牙在兩臺(tái)設(shè)備之間建立直接鏈接。為了使敘述重點(diǎn)突出,開(kāi)發(fā)人員將學(xué)習(xí)如何為藍(lán)牙的兩個(gè)核心角色(中心設(shè)備管理器和外圍設(shè)備管理器)配置iOS設(shè)備。擁有兩臺(tái)設(shè)備可以使開(kāi)發(fā)人員快速而可靠地進(jìn)行測(cè)試。在第10章中,開(kāi)發(fā)人員將學(xué)習(xí)如何將iPhone配置為iBeacon發(fā)射器,但是也可以使用硬件信標(biāo)進(jìn)行測(cè)試 (在大多數(shù)電子產(chǎn)品網(wǎng)站上,它們都可以作為USB加密狗使用,價(jià)格約20~30美元)。
第5篇為安全物聯(lián)網(wǎng),包括第13~15章,介紹了與身份驗(yàn)證和支付系統(tǒng)相關(guān)的內(nèi)容,要求開(kāi)發(fā)人員擁有iPhone 5S或更高版本的設(shè)備以獲得Touch ID。第15章有關(guān)Apple Pay的項(xiàng)目則需要iPhone 6或更高版本的設(shè)備。自iPhone 5S起,每部iPhone上均配備Touch ID傳感器(由HOME按鍵周?chē)慕饘侪h(huán)標(biāo)識(shí)),自iPad mini 3和iPad Air起,每臺(tái)iPad上均可使用。它不能在軟件中模擬。同樣,Apple Pay需要近場(chǎng)通信(Near Field Communication,NFC)傳感器和附加的身份驗(yàn)證芯片,這些功能僅在iPhone 6/6 Plus或更高版本以及iPad mini 3/iPad Air 2或更高版本中可用。
本書(shū)約定
在本書(shū)中,讀者將可以看到許多區(qū)分不同類(lèi)型信息的文本樣式。以下是這些樣式的一些示例以及對(duì)它們的含義的解釋。
(1)界面詞匯的后面使用括號(hào)附加對(duì)應(yīng)的中文含義,以方便讀者對(duì)照查看。以下段落就是一個(gè)示例:
在選中Map View(地圖視圖)后,單擊Pin(固定)工具,在彈出的對(duì)話框中,取消選中Constrain to margins(約束到邊距)復(fù)選框,并將所有鄰近約束(框周?chē)募s束)設(shè)置為0,如圖1-22所示。
(2)代碼塊顯示如下:
funcset(text: String?="") {
dispatch_async(dispatch_get_main_queue()) {
self.textArea!.text = text
};
}
(3)當(dāng)我們希望引起讀者對(duì)代碼塊特定部分的注意時(shí),相關(guān)的行或項(xiàng)目將以粗體顯示。示例如下:
import UIKit
import MapKit
class SecondViewController: UIViewController {
@IBOutlet var mapView : MKMapView?
}
(4)新術(shù)語(yǔ)和重要單詞提供了中英文對(duì)照的形式。以下段落就是一個(gè)示例:
peripheralDataWithMeasuredPower采用一個(gè)參數(shù)代表所測(cè)量的功率。設(shè)備的測(cè)量功率是在接收信號(hào)強(qiáng)度指示器(Received Signal Strength Indicator,RSSI)中測(cè)得的1m處的信號(hào)強(qiáng)度。iOS提供的距離以米為單位,是基于信標(biāo)信號(hào)強(qiáng)度與發(fā)射功率之比的估算值。
下載示例代碼文件
讀者可以從Apress網(wǎng)站(www.apress.com)中下載本書(shū)的示例代碼文件。本書(shū)的所有源代碼都打包在一個(gè)zip文件中,具體網(wǎng)址如下:
http://Apress.com/9781484211953
也可以直接訪問(wèn)以下GitHub頁(yè)面:
https://github.com/apress/program-internet-of-things-w-swift-for-ios
關(guān)于作者
Ahmed Bakir是devAtelier LLC(www.devatelier.com)的創(chuàng)始人和首席開(kāi)發(fā)人員,devAtelier是一家位于圣地亞哥的移動(dòng)應(yīng)用開(kāi)發(fā)公司。Ahmed Bakir在花了幾年時(shí)間編寫(xiě)嵌入式系統(tǒng)軟件之后,他開(kāi)始在業(yè)余時(shí)間開(kāi)發(fā)移動(dòng)App,并以此為樂(lè)。消息傳開(kāi)后,就有客戶絡(luò)繹不絕地登門(mén)拜訪他,以至于他不得不辭掉正式工作,全職投入移動(dòng)App的開(kāi)發(fā)中。
從那以后,Ahmed Bakir參與了20多個(gè)移動(dòng)項(xiàng)目的開(kāi)發(fā),其中有若干個(gè)項(xiàng)目進(jìn)入了App Store的前25名,包括在同類(lèi)產(chǎn)品中排名的App(Video Scheduler)。他的客戶中既有雄心勃勃的初創(chuàng)公司,也有一些大型企業(yè),如Citrix等。業(yè)余時(shí)間他喜歡談?wù)摰倪是移動(dòng)開(kāi)發(fā)。
Gheorghe Chesler是一名高級(jí)軟件工程師,在質(zhì)量保證、系統(tǒng)自動(dòng)化、性能工程和電子出版方面具有專(zhuān)長(zhǎng)。他是ServiceNow公司的一名高級(jí)性能工程師,同時(shí)也是Plural Publishing公司的首席技術(shù)顧問(wèn)。他喜歡的編程語(yǔ)言是Perl(以至于他樂(lè)于使用Perl的吉祥物來(lái)標(biāo)識(shí)自己,也就是右面的這幅駱駝?lì)^像圖),但他也參與了許多Java和Objective-C項(xiàng)目。
Manny de la Torriente擁有超過(guò)30年的軟件開(kāi)發(fā)經(jīng)驗(yàn),曾從事從工程到管理各個(gè)級(jí)別的工作。Manny初從事軟件方面的工作,為聲音工程編寫(xiě)程序,然后進(jìn)入游戲引擎和低級(jí)視頻回放系統(tǒng)的開(kāi)發(fā)。Manny比較出名的是,他會(huì)根據(jù)對(duì)項(xiàng)目的感興趣程度在iOS和Android之間做出選擇。
關(guān)于審稿者
Charles Cruz是iOS、Windows Phone和Android平臺(tái)的移動(dòng)應(yīng)用程序開(kāi)發(fā)人員。他畢業(yè)于斯坦福大學(xué),獲得工程學(xué)士和碩士學(xué)位。他住在南加州,和他的妻子一起經(jīng)營(yíng)一家攝影公司(www.bellalentestudios.com)。當(dāng)他不做技術(shù)方面的工作時(shí),他會(huì)擔(dān)任原創(chuàng)金屬樂(lè)隊(duì)(www. taintedsociety.com)的主音吉他手。要聯(lián)系Charles,可以發(fā)郵件到codingandpicking@gmail.com或在Twitter上@codingnpick。