孫建喬
摘要:Cookie通過在客戶端存儲用戶的狀態(tài),增強用戶與Web應(yīng)用的交互性。Swift已經(jīng)成為iOS的主要開發(fā)語言之一,為了增進Swift與Web之間的交互,該文基于實例給出Swift操作Cookie的主要方法,從而實現(xiàn)App基于狀態(tài)的HTTP通訊。
關(guān)鍵詞:iOS;Swift;Cookie
中圖分類號:TP3 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)08-0075-01
iOS以良好的用戶體驗,受到用戶和移動開發(fā)者的廣泛青睞。對C語言的良好兼容性,使得Objective-C在很長一段時間內(nèi)被作為iOS應(yīng)用開發(fā)的標(biāo)配語言。Objective-C在語法上與Java、C++等主流語言差異顯著,例如,缺乏垃圾回收機制、不支持命名空間,以及因采用動態(tài)類型而導(dǎo)致的運行時性能低下。這些問題時常困擾著iOS的應(yīng)用開發(fā)者,尤其顯著增加了初學(xué)者的開發(fā)難度。鑒于此,Ap#e公司與2014年發(fā)布了Swift,并于2015年將其開源化。Swift不僅兼容Objective-C,而且語法簡單、性能優(yōu)越、安全可靠,從而受到開發(fā)人員的廣泛喜愛。近期的TIOBE統(tǒng)計結(jié)果表明,Swift已經(jīng)超過Objective-C,并成為iOS應(yīng)用開發(fā)的首選語言。
對多種媒體的支持、便捷的交互性和分布式特性,使得Web在實際應(yīng)用中快速普及。尤其,Ajax的廣泛應(yīng)用和HTML5的出現(xiàn),使得Web換發(fā)蓬勃的生機,更將Web應(yīng)用平滑的移植到了移動平臺。與PC機上的Web應(yīng)用類似,移動平臺上的Web應(yīng)用,客戶端需要與服務(wù)器端頻繁的交換數(shù)據(jù)。Web客戶端向服務(wù)器發(fā)送請求后,服務(wù)器響應(yīng)請求,并將處理結(jié)果封裝到HTML中返回到移動平臺上的Web客戶端。上述請求過程結(jié)束后,客戶端與服務(wù)器端連接斷開,服務(wù)器則無法再利用連接跟蹤客戶。Cookie能夠在客戶端持久保存與用戶相關(guān)的部分?jǐn)?shù)據(jù),從而解決客戶端與服務(wù)器端的持久會話問題。
1 Cookie與Session介紹
Cookie由Netscape公司提出,利用客戶端記錄和跟蹤用戶的活動信息,包括用戶的身份。用戶無論什么時候連接到服務(wù)器,都可以通過客戶端讀取Cookie中的數(shù)據(jù)。Cookie自誕生之日起便飽受爭議,原因是Cookie跟蹤用戶,并將用戶信息保存到客戶端的文本文件中。這些Cookie文本文件非常容易被泄露,從而將用戶的隱私公諸于眾。上述問題并不影響Cookie在實際中的廣泛應(yīng)用,這是由于:一方面,可以通過妥善使用Cookie避免泄漏,例如,Cookie加密、為Cookie添加時間戳等;另一方面,Cookie在諸如記錄會話狀態(tài)等方面是不可替代的。
Cookie利用文本文件存儲用戶的活動狀態(tài),一般由re-sponse向客戶端的Cookie文件中寫人數(shù)據(jù),由request從客戶端的Cookie的文件中讀取數(shù)據(jù)。由于Cookie在功能上與Session具有很多相似之處,因此,實際應(yīng)用中二者常被等同起來。實際上,Cookie與Session區(qū)別顯著,Cookie在客戶端的文件中存取數(shù)據(jù),而Session則在服務(wù)器端存取數(shù)據(jù)??梢?,當(dāng)用戶與服務(wù)器的會話結(jié)束,Session中所存儲的數(shù)據(jù)也將不復(fù)存在;而Cookie則不受會話結(jié)束的額影響,由于Cookie數(shù)據(jù)存儲在客戶端的文件中,因此,可以在同一應(yīng)用中的不同會話中多次使用。
2 ioS對Cookie的管理
iOS提供了一個HTYPCookieStorag類用管理Cookie數(shù)據(jù),其中每一個Cookie數(shù)據(jù)對應(yīng)一個HTTPCookie對象。每一個HTTPCookie對象里面封裝一個Cookie數(shù)據(jù),以供用戶直接存。通常情況下,不需要刻意關(guān)注Cookie,如果response中帶有Cookie,iOS會自動通過HTTPCookieStorage存儲Cookie數(shù)據(jù)。當(dāng)有新的請求時,URLRequest會自動加載相應(yīng)的Cookie數(shù)據(jù)。這個機制不僅適用于URLSession,同樣適用于SwiftHTTP、Al-amofire等第三方HTTP操作。需要注意的是,由于iOS安全策略,使得不同APP之間是不能共享Cookie的數(shù)據(jù)。
3 Siwft對Cookie的操作
由上一節(jié)iSO對Cookie的管理機制可知,Cookie由服務(wù)器產(chǎn)生,并存儲與客戶端。因此,存儲Cookie數(shù)據(jù)時需要首先創(chuàng)建一個服務(wù)器端,這里通過PHP的腳本實例(cookie.php),如圖1所示,說明Cookie向客戶端存儲數(shù)據(jù)的過程。
當(dāng)APP應(yīng)用程序訪問圖1中的頁面時,服務(wù)器將啟動會話,并判斷客戶端的請求是否攜帶Cookie。如果未攜帶Cookie數(shù)據(jù),服務(wù)器則將Cookie下發(fā),將Cookie數(shù)據(jù)存儲到iOS的客戶端。當(dāng)應(yīng)用程序需要讀取Cookie數(shù)據(jù)時,可以通過HTFPCook-ieStorage直接讀取客戶端的Cookie數(shù)據(jù)。Cookie數(shù)據(jù)的讀取過程如圖2中的代碼所示。
圖2中,request()函數(shù)便用URLSession向服務(wù)器發(fā)送HTTP請求,并訪問服務(wù)器端的cookie.php??蛻舳说谝淮蜗蚍?wù)器發(fā)起請求時(調(diào)用loadCookies()函數(shù)),此時,并未攜帶Cookie數(shù)據(jù)。服務(wù)器端的處理程序cookie.php(見圖1中代碼),響應(yīng)客戶端發(fā)送過來的請求,并將Cookie數(shù)據(jù)下發(fā)給客戶端。此時,Cookie數(shù)據(jù)已經(jīng)存儲到客戶端。當(dāng)服務(wù)器端向客戶端發(fā)送讀取Cookie數(shù)據(jù)的時候,HTYPCookieStorage就讀取相應(yīng)的Cookie數(shù)據(jù)??蛻舳说诙蜗蚍?wù)器端發(fā)起請求時,第一次請求的網(wǎng)絡(luò)連接已關(guān)閉,此時,客戶端可以通過Cookie向服務(wù)器端表明自己的身份,通過setCookie()在第二次發(fā)送請求之前設(shè)置Cook-ie。
圖2中,代碼props[HTFPCookiePropertyKey.domain]=“192.168.80.100”用于指定domain,而且必須與請求的domain相匹配。這是因為根據(jù)Cookie規(guī)范,Cookie不能跨越域名,第二次請求時攜帶了Cookie,服務(wù)器端則根據(jù)Cookie數(shù)據(jù)自動識別用戶的身份,并做響應(yīng)該用戶的額處理,從而實現(xiàn)了會話控制。
4總結(jié)
綜上所述,Swift應(yīng)用程序發(fā)時,當(dāng)遇到HTTP網(wǎng)絡(luò)通信等需求時,可以利用以上操作過程,完成Cookie基于狀態(tài)的會話功能。當(dāng)然,iOS所提供的HTTP及Cookie功能并不僅僅局限與上述數(shù)據(jù)操作。在本文介紹操作的基礎(chǔ)上,結(jié)合SwiftHTFP等類庫,我們還可以完成更加豐富的網(wǎng)絡(luò)功能。