美文网首页iOS开发技术分享iOS进阶指南
Swift中 webView请求中添加cookie(OC同样处理

Swift中 webView请求中添加cookie(OC同样处理

作者: devchena | 来源:发表于2016-03-03 12:50 被阅读5925次

什么是Cookie

Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

更多cookie详解请见: Cookie/Session机制详解

NSHTTPCookie简单介绍:

NSHTTPCookieStorage提供了管理所有NSHTTPCookie 对象的接口。在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只当当前应用中有效。

通过sharedHTTPCookieStorage方法可获取到共享的NSHTTPCookieStorage单件对象。
+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage


使用NSHTTPCookieStorage单件对象可获取到当前存储的所有cookie
- (NSArray *)cookies


或针对特定URL的cookie
- (NSArray *)cookiesForURL:(NSURL *)theURL;


还可以添加/删除Cookie
– deleteCookie:
– setCookie:
– setCookies:forURL:mainDocumentURL:


通过NSHTTPCookieStorage可读取/修改cookie接收策略,默认为NSHTTPCookieAcceptPolicyAlways.
- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy
- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.


一共有三种cookie accept policy。typedef enum {
NSHTTPCookieAcceptPolicyAlways,
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
}NSHTTPCookieAcceptPolicy;

NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默认策略.
NSHTTPCookieAcceptPolicyNever: 拒绝所有cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.


相关通知
1.NSHTTPCookieManagerCookiesChangedNotification
当NSHTTPCookieStorage实例中的cookies变化时发出此通知。

2.NSHTTPCookieManagerAcceptPolicyChangedNotification
当NSHTTPCookieStorage实例的cookie acceptance policy变化时发出此通知。

添加cookie使用

以本人参加项目所需功能为例:由于访问wap界面时,需要传递用户信息给wap处理,此时我们选择cookie机制。

代码:

class CustomerCookie: NSObject {

    // 为url绑定cookie
    class func addCustomerCookie(url: NSURL) {
        // 当用户登录后
        if let customerEntity = LoginViewController.kCustomerEntity {
            // 被传输的数据,根据项目需要自定义
            var properties = [String: AnyObject]()
            properties["user_token"] = customerEntity.token
            properties["user_name"] = customerEntity.mobile
            properties["user_mobile"] = customerEntity.mobile
            properties["user_pas"] = customerEntity.password
            properties["userId"] = customerEntity.customerId
            
            var cookies = [NSHTTPCookie]()
            for property in properties {
                var cookieProperties = [String: AnyObject]()
                // 这里我们只设置4个属性,更多属性请查阅文档
                cookieProperties[NSHTTPCookieName] = property.0       // cookie名称
                cookieProperties[NSHTTPCookieValue] = "\(property.1)" // NSHTTPCookieName对应的value
                cookieProperties[NSHTTPCookieDomain] = url.host       // 有效域名
                cookieProperties[NSHTTPCookiePath] = url.path         // 路径
            
                // 创建并添加cookie
                if let cookie = NSHTTPCookie(properties: cookieProperties) {
                    cookies.append(cookie)
                }
            }
           // 绑定cookie到url
            NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies, forURL: url, mainDocumentURL: nil)
        }
    }
}
class DetailViewController: UIViewController, UIWebViewDelegate {

    lazy private var webView: UIWebView = {
        let webView = MTWebView(frame: self.view.bounds)
        webView.delegate = self
        return webView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.addSubview(self.webView)
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        webView.frame = self.view.bounds

        // 例如下面的url
        let url = NSURL(string: "http://test.cn/jlfjdljfljaljfl")

        // 一定要在webView加载之前添加cookie
        CustomerCookie.addCustomerCookie(url)

        self.webView.loadRequest(NSURLRequest(URL: url))
    }
    
    // MARK: UIWebViewDelegate
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if let url = request.URL {
            // 拦截url
            if url.absoluteString.containsString("login") { // 去登陆
                self.navigationController?.pushViewController(LoginViewController(params: ["": ""]), animated: true)
                return false
            }
        }
        
        return true
    }
    
    func webViewDidStartLoad(webView: UIWebView) {
    }
    
    func webViewDidFinishLoad(webView: UIWebView) {
    }
    
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
    }
}

引用链接:
http://blog.csdn.net/fangaoxin/article/details/6952954
http://www.jianshu.com/p/65094611980c

相关文章

  • Swift中 webView请求中添加cookie(OC同样处理

    什么是Cookie Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前C...

  • vue+sprintboot 解决session为空问题

    前端处理: 在request.js中添加如下代码,允许跨域携带cookie 请求拦截添加token 后端处理: 添...

  • Swift OC类里面调用Swift方法

    在OC类里面引入Swift类 在Swift中,为你准备调用的方法和属性,添加@objc 添加之后,在OC中,就可以...

  • iOS string转utf8

    网络请求url中如果包含空格或者中文字符串的话,需要单独处理 oc中 swift中 如果url中包含 # 等特殊字...

  • WKWebView请求添加Cookie

    WKWebView发送请求时不会把HTTPCookieStorage中的cookie写入请求中需要手动添加。 iO...

  • Oc调用swift 的技巧

    oc项目如果要调用swift一定要在oc的类中添加#import "QeelinGold_iOS-Swift.h"...

  • oc与Swift混编

    1、要想在oc 类中调用 Swift的类首先要在 pch文件中添加Swift的关联 其次,就是代码调用了。在oc代...

  • swift4,网络请求工具Moya

    在OC中,我们使用AFNetworking来进行网络请求,简洁方便。在swift中,我们使用Moya来进行网络请求...

  • iOS面试-0x06配置

    0x00 OC和Swift之间的调用 1)swift调用oc,主要是在header.h 文件中添加了相应的oc头文...

  • swift备忘录之arc

    swift中的arc与oc中很相似。需要注意的是swift中arc处理循环引用的关键字及其使用方式与oc中有所区分...

网友评论

    本文标题:Swift中 webView请求中添加cookie(OC同样处理

    本文链接:https://www.haomeiwen.com/subject/jmankttx.html