在你選擇網(wǎng)絡(luò)API之前,你應(yīng)該了解一些OS X和iOS提供的網(wǎng)絡(luò)API家族。
OS X和iOS提供三個(gè)主要的用戶空間網(wǎng)絡(luò)API層。前兩個(gè),F(xiàn)oundation和CFNetwork(基于Core Foundation),是針對(duì)OS X和iOS的框架,。最后一個(gè)POSIX層,是和其他類(lèi)UNIX和類(lèi)Linux的操作系統(tǒng)中的網(wǎng)絡(luò)層是一樣的。
在每一層中,都有支持常見(jiàn)網(wǎng)絡(luò)任務(wù)的函數(shù)或類(lèi),例如連接遠(yuǎn)程主機(jī)(流協(xié)議)、下載URL上的內(nèi)容、以及在本地網(wǎng)絡(luò)發(fā)現(xiàn)服務(wù)。這些層都如表2-1所示。
表2-1 OS X和iOS網(wǎng)絡(luò)API的層和家族
層 | 流協(xié)議 | URL加載 | 服務(wù)發(fā)現(xiàn) |
---|---|---|---|
Foundation 層 | NSStream | NSURLConnection 和 NSURLRequest | NSNetService |
Core Foundation 層 | CFStream | CFHTTPMessage | CFNetService |
POSIX 層 | kqueue | libcurl (例如。注意這是第三方API) | DNS Service Discovery |
POSIX 層 | 構(gòu)建在BSD套接字(sockets)之上(直接或間接) |
你僅使用Foundation類(lèi)就能輕松的完成大多數(shù)客戶端的網(wǎng)絡(luò)任務(wù)。如果你正在寫(xiě)服務(wù)器端的代碼或者你有特殊的需求,你或許想要使用底層級(jí)的框架。但是通常來(lái)說(shuō),你應(yīng)該始終選擇滿足你需求的高級(jí)API。
常見(jiàn)的網(wǎng)絡(luò)任務(wù)
在你決定使用哪個(gè)特定的API之前,你必須首先評(píng)估應(yīng)用程序需要實(shí)現(xiàn)什么網(wǎng)絡(luò)任務(wù)。
支持點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)的游戲。在iOS中,Game Kit框架提供了對(duì)點(diǎn)對(duì)點(diǎn)通信的支持,全球的(通過(guò)網(wǎng)絡(luò))和本地的(使用藍(lán)牙網(wǎng)絡(luò)或Wi-Fi LAN)。
你可以在應(yīng)用中使用Game Kit來(lái)簡(jiǎn)化下面的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)任務(wù):
- 提供多人游戲網(wǎng)絡(luò)通信
- 提供音頻通信
除上述兩種任務(wù)以外的點(diǎn)對(duì)點(diǎn)通信,應(yīng)該使用在本部分稍后介紹的低級(jí)別網(wǎng)絡(luò)API來(lái)完成。
更多關(guān)于Game Kit的內(nèi)容,請(qǐng)閱讀Game Center Programming Guide。
支持與其他應(yīng)用的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)。在iOS中,Multipeer Connectivity框架提供對(duì)基礎(chǔ)Wi-Fi的對(duì)點(diǎn)對(duì)點(diǎn)通信、Wi-Fi點(diǎn)對(duì)點(diǎn)、以及藍(lán)牙的支持。更多內(nèi)容,請(qǐng)閱讀Discovering and Advertising Network Services。
連接到web服務(wù)器。接收和發(fā)送短信息的首選方式是通過(guò)類(lèi)似HTTP或HTTPS這樣的標(biāo)準(zhǔn)協(xié)議進(jìn)行的。通過(guò)使用這些現(xiàn)有的協(xié)議,你可以最大程度的減少客戶端與服務(wù)器端連接所需的工作量。HTTP還可以輕松的遷移到安全連接(HTTPS)——你只需要添加一個(gè)證書(shū)到服務(wù)器,并在URL的第一部分添加一個(gè)字母就可以了。
想要學(xué)習(xí)更多關(guān)于制作HTTP和HTTPS請(qǐng)求的API的信息,請(qǐng)閱讀Making HTTP and HTTPS Requests。
想要學(xué)習(xí)如何在應(yīng)用中顯示網(wǎng)頁(yè)內(nèi)容,請(qǐng)閱讀Displaying Web and Multimedia Content。
連接FTP服務(wù)器。除非你必須與現(xiàn)有服務(wù)器保持兼容,否則不要使用FTP。FTP是一種有嚴(yán)重限制并且不安全的(數(shù)據(jù)和密碼通過(guò)明文發(fā)送)舊協(xié)議。
考慮到這點(diǎn),如果你需通過(guò)FTP下載文件,你應(yīng)該使用NSURLConnection API并向它傳遞合適的URL。這個(gè)API是在Making HTTP and HTTPS Requests中描述,但是也能被用于ftp:// URLs。
對(duì)于更復(fù)雜的請(qǐng)求,CFNetwork框架(基于Core Foundation)提供CFFTPStream API與FTP服務(wù)器進(jìn)行通信。CFNetwork還提供CFURLAccess API,它被用于從FTP服務(wù)器上刪除文件。這個(gè)API的詳情超出了本文檔的范圍。想要知道更多,請(qǐng)閱讀CFNetwork Programming Guide。
發(fā)現(xiàn)和公布網(wǎng)絡(luò)服務(wù)。OS X和iOS提供對(duì) DNS Service Discovery(DNS服務(wù)發(fā)現(xiàn))的支持,它允許你描述你的應(yīng)用提供哪些服務(wù),并在用戶的設(shè)備上、附近的設(shè)備上、或者在使用“返回到我的Mac”的用戶的家庭設(shè)備上,發(fā)現(xiàn)其他服務(wù)。然后你可以使用這些信息來(lái)與程序副本、或者與其他程序(你的程序知道如何進(jìn)行通信的程序)進(jìn)行連接。例如,OS X使用 DNS Service Discovery 來(lái)讓用戶找到附近的打印機(jī)、從附近的電腦中找到iTunes中的流音樂(lè)、在Finder中共享屏幕等等。
想要學(xué)習(xí)使用NDS Service Discovery在本地網(wǎng)絡(luò)或遠(yuǎn)程服務(wù)器中發(fā)現(xiàn)服務(wù),請(qǐng)閱讀Discovering and Advertising Network Services。
解析DNS主機(jī)名。OS X和iOS提供Core-Foundation層和POSIX層名字解析API來(lái)獲取主機(jī)名中的IP地址。
想要學(xué)習(xí)這些API,請(qǐng)閱讀Designing for Real-World Networks。但是,如果你正在解析你想要連接到的主機(jī),你通常應(yīng)該使用名稱(chēng)來(lái)連接。閱讀Avoiding Common Networking Mistakes中的Avoid Resolving DNS Names Before Connecting to a Host來(lái)了解為什么。
使用socket或socket流。如果你需要以高級(jí)API不支持的的方式進(jìn)行網(wǎng)絡(luò)請(qǐng)求,你可以使用sockets(POSIX層和Core Foundation 層都有)或者socket流 (在Core Foundation層)。更多信息,請(qǐng)閱讀Using Sockets and Socket Streams。
安全通信。OS X和iOS支持Transport Layer Security (傳輸層安全,TLS)協(xié)議和它的前身 Secure Sockets Layer(安全套接字層,SSL),用來(lái)加密通信,以及服務(wù)器可信度的確定。想要了解更多,閱讀Using Networking Securely。
下一步
現(xiàn)在你已經(jīng)決定了你要做什么,你可以在OS X和iOS中輕松的完成各種各樣的網(wǎng)絡(luò)任務(wù),只需要很少的配置,甚至無(wú)需配置。大多數(shù)常見(jiàn)的網(wǎng)絡(luò)任務(wù)和完成它們推薦的方法將在接下來(lái)的幾章中簡(jiǎn)潔地描述。注意這里不是全面的API討論;每個(gè)章節(jié)的末尾都會(huì)有一個(gè)鏈接,它會(huì)連接到其他一些提供關(guān)于這些任務(wù)更深層信息的文檔。