APP下载

Swift中的Cookie操作

2018-05-07孙建乔

电脑知识与技术 2018年8期

孙建乔

摘要:Cookie通过在客户端存儲用户的状态,增强用户与Web应用的交互性。Swift已经成为iOS的主要开发语言之一,为了增进Swift与Web之间的交互,该文基于实例给出Swift操作Cookie的主要方法,从而实现App基于状态的HTTP通讯。

关键词:iOS;Swift;Cookie

中图分类号:TP3 文献标识码:A 文章编号:1009-3044(2018)08-0075-01

iOS以良好的用户体验,受到用户和移动开发者的广泛青睐。对C语言的良好兼容性,使得Objective-C在很长一段时间内被作为iOS应用开发的标配语言。Objective-C在语法上与Java、C++等主流语言差异显著,例如,缺乏垃圾回收机制、不支持命名空间,以及因采用动态类型而导致的运行时性能低下。这些问题时常困扰着iOS的应用开发者,尤其显著增加了初学者的开发难度。鉴于此,Ap#e公司与2014年发布了Swift,并于2015年将其开源化。Swift不仅兼容Objective-C,而且语法简单、性能优越、安全可靠,从而受到开发人员的广泛喜爱。近期的TIOBE统计结果表明,Swift已经超过Objective-C,并成为iOS应用开发的首选语言。

对多种媒体的支持、便捷的交互性和分布式特性,使得Web在实际应用中快速普及。尤其,Ajax的广泛应用和HTML5的出现,使得Web换发蓬勃的生机,更将Web应用平滑的移植到了移动平台。与PC机上的Web应用类似,移动平台上的Web应用,客户端需要与服务器端频繁的交换数据。Web客户端向服务器发送请求后,服务器响应请求,并将处理结果封装到HTML中返回到移动平台上的Web客户端。上述请求过程结束后,客户端与服务器端连接断开,服务器则无法再利用连接跟踪客户。Cookie能够在客户端持久保存与用户相关的部分数据,从而解决客户端与服务器端的持久会话问题。

1 Cookie与Session介绍

Cookie由Netscape公司提出,利用客户端记录和跟踪用户的活动信息,包括用户的身份。用户无论什么时候连接到服务器,都可以通过客户端读取Cookie中的数据。Cookie自诞生之日起便饱受争议,原因是Cookie跟踪用户,并将用户信息保存到客户端的文本文件中。这些Cookie文本文件非常容易被泄露,从而将用户的隐私公诸于众。上述问题并不影响Cookie在实际中的广泛应用,这是由于:一方面,可以通过妥善使用Cookie避免泄漏,例如,Cookie加密、为Cookie添加时间戳等;另一方面,Cookie在诸如记录会话状态等方面是不可替代的。

Cookie利用文本文件存储用户的活动状态,一般由re-sponse向客户端的Cookie文件中写人数据,由request从客户端的Cookie的文件中读取数据。由于Cookie在功能上与Session具有很多相似之处,因此,实际应用中二者常被等同起来。实际上,Cookie与Session区别显著,Cookie在客户端的文件中存取数据,而Session则在服务器端存取数据。可见,当用户与服务器的会话结束,Session中所存储的数据也将不复存在;而Cookie则不受会话结束的额影响,由于Cookie数据存储在客户端的文件中,因此,可以在同一应用中的不同会话中多次使用。

2 ioS对Cookie的管理

iOS提供了一个HTYPCookieStorag类用管理Cookie数据,其中每一个Cookie数据对应一个HTTPCookie对象。每一个HTTPCookie对象里面封装一个Cookie数据,以供用户直接存。通常情况下,不需要刻意关注Cookie,如果response中带有Cookie,iOS会自动通过HTTPCookieStorage存储Cookie数据。当有新的请求时,URLRequest会自动加载相应的Cookie数据。这个机制不仅适用于URLSession,同样适用于SwiftHTTP、Al-amofire等第三方HTTP操作。需要注意的是,由于iOS安全策略,使得不同APP之间是不能共享Cookie的数据。

3 Siwft对Cookie的操作

由上一节iSO对Cookie的管理机制可知,Cookie由服务器产生,并存储与客户端。因此,存储Cookie数据时需要首先创建一个服务器端,这里通过PHP的脚本实例(cookie.php),如图1所示,说明Cookie向客户端存储数据的过程。

当APP应用程序访问图1中的页面时,服务器将启动会话,并判断客户端的请求是否携带Cookie。如果未携带Cookie数据,服务器则将Cookie下发,将Cookie数据存储到iOS的客户端。当应用程序需要读取Cookie数据时,可以通过HTFPCook-ieStorage直接读取客户端的Cookie数据。Cookie数据的读取过程如图2中的代码所示。

图2中,request()函数便用URLSession向服务器发送HTTP请求,并访问服务器端的cookie.php。客户端第一次向服务器发起请求时(调用loadCookies()函数),此时,并未携带Cookie数据。服务器端的处理程序cookie.php(见图1中代码),响应客户端发送过来的请求,并将Cookie数据下发给客户端。此时,Cookie数据已经存储到客户端。当服务器端向客户端发送读取Cookie数据的时候,HTYPCookieStorage就读取相应的Cookie数据。客户端第二次向服务器端发起请求时,第一次请求的网络连接已关闭,此时,客户端可以通过Cookie向服务器端表明自己的身份,通过setCookie()在第二次发送请求之前设置Cook-ie。

图2中,代码props[HTFPCookiePropertyKey.domain]=“192.168.80.100”用于指定domain,而且必须与请求的domain相匹配。这是因为根据Cookie规范,Cookie不能跨越域名,第二次请求时携带了Cookie,服务器端则根据Cookie数据自动识别用户的身份,并做响应该用户的额处理,从而实现了会话控制。

4总结

综上所述,Swift应用程序发时,当遇到HTTP网络通信等需求时,可以利用以上操作过程,完成Cookie基于状态的会话功能。当然,iOS所提供的HTTP及Cookie功能并不仅仅局限与上述数据操作。在本文介绍操作的基础上,结合SwiftHTFP等类库,我们还可以完成更加丰富的网络功能。