iOS平台下cookie的使用

首先,先介绍下iOS对cookie的操作的两个类:

帖子来源于:http://blog.csdn.net/chun799/article/details/17206907

1. NSHTTPCookie  2. NSHTTPCookieStorage

NSHTTPCookie对象代表一个HTTP cookie。 这是一个不可改变的对象,从一个包含cookie的属性的字典初始化,这个类可以用来手动创建cookie的Properties 。

- (NSUInteger)version;

- (NSString *)name;

- (NSString *)value;

- (NSString *)domain;

- (NSString *)path;

- (BOOL)isSessionOnly;等等属性,具体属性请自行谷歌

可以通过手工赋值的方式创建Cookie,如

+ (id)cookieWithProperties:(NSDictionary *)properties;

- (id)initWithProperties:(NSDictionary *)properties;

也可以从Cookie中读取到所有属性。

- (NSDictionary *)properties;

使用NSHTTPCookie的类方法可以将NSHTTPCookie实例与HTTP cookie header相互转换.

根据NSHTTPCookie实例数组生成对应的HTTP cookie header

+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

从headerFileds中读取到Cookie相关内容,生成NSHTTPCookie实例对象数组。

+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)theURL;

该方法会忽略headerFileds中与cookie无关的字段,如果headerFileds中的cookie没有指定domain,则使用theURL的domain,如果没有指定path,则使用”/”.

除非NSURLRequest明确指定不使用cookie(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。从NSURLResponse返回的cookie也会根据当前的cookie访问策略(cookie acceptance policy)接收到系统中。

例如:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];  // 创建cookie属性字典

[cookieProperties setObject:@"username" forKey:NSHTTPCookieName]; // 手动设置cookie的属性

[cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];

[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];  // 通过NSHTTPCookie的cookieWithProperties方法,将属性字典传入进行初始化,对象返回的是一个NSHTTPCookie对象,创建完成后进行下一步操作:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];  // 将手动创建返回的NSHTTPCookie对象添加到NSHTTPCookieStorage中,在iOS中使用NSHTTPCookie类封装一条cookie,通过NSHTTPCookie的方法读取到cookie的通用属性。在此声明一点:如果你的request里面明确不使用cookie,那么要讲cookie的(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。

下面来介绍一下NSHTTPCookieStorage对象:

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.

四.相关通知

NSHTTPCookieManagerCookiesChangedNotification

当NSHTTPCookieStorage实例中的cookies变化时发出此通知。

NSHTTPCookieManagerAcceptPolicyChangedNotification

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

参考:

NSHTTPCookieStorage Class Reference

NSHTTPCookie Class Reference

URL Loading System Programming Guide – Cookie Storage

以上是对这两个类的综合介绍,如果有不懂,请自行百度或谷歌。

正文

说了这么多,就来写下我项目中用到的cookie管理

我这个操作是保存NSHTTPCookieStorage对象里的所有cookie,当然也可以使用cookieForUrl来获取cookie进行保存,方便后续的使用。此操作是在登录的时候进行。

下面:

 这个方法就是更新cookie。在程序每次启动的时候调用一下。用来确保每次的cookie是最新的。

然后:

 这个方法就是移除你保存的cookie了。因为你在退出账户的时候需要重新获取新的cookie,所以,你需要在退出账户的时候清空你上次保存的cookie.   大概就是这么多操作

staticNSString*kLocalCookieName =@"MyProjectCookie";

staticNSString*kLocalUserData =@"MyProjectLocalUser";

staticNSString*kServerSessionCookie =@"JSESSIONID";

最后

写的不好,也没排版,请见谅。

iOS平台下cookie的使用的更多相关文章

  1. node.js平台下,利用cookie实现记住密码登陆(Express+Ejs+Mysql)

    本博文需有node.js+express+mysql入门基础,若基础薄弱,可参考博主的其他几篇node.就是博文: 1.下载Mysql数据库,安装并配置 创建用户表供登录使用: 2.node.js平台 ...

  2. Android平台下OpenCV移植与使用---基于C/C++

    在<Android Studio增加NDK代码编译支持--Mac环境>和<Mac平台下Opencv开发环境搭建>两篇文章中,介绍了如何使用NDK环境和Opencv环境搭建与测试 ...

  3. [修正] Firemonkey Windows & macOS 平台下 Edit & Memo 中文输入后会取消原选取文字的 BUG

    问题:Firemonkey Windows & macOS 平台下 Edit & Memo 中文输入后会取消原选取文字的 BUG 适用版本:Delphi 10.1.2 & 10 ...

  4. Android平台下Dalvik层hook框架ddi的研究

    通过adbi,可以对native层的所有代码进行hook.但对于Android系统来说,这还远远不够,因为很多应用都还是在Dalvik虚拟机中运行的. 那么,有没有什么办法可以对Dalvik虚拟机中跑 ...

  5. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  6. Windows平台下Git服务器搭建

    第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...

  7. Windows平台下PHP开发环境的配置

    Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...

  8. Mac平台与Windows平台下AndroidStudio增量升级

    Android Studio增量升级什么情况下使用最合适呢? 比如现在的as版本是2.2版本,而你的as版本2.0版本,这个时候点Check For Updates就没有反应了,因为你已经2个有版本没 ...

  9. win7平台下React-Native Android:Unable to upload some APKs

    一.问题描述 根据网络上的Win7平台下React-native配置教程配置好开发环境的过程中,在艰难进行到react-native run-android这一步时,发现一直出现错误,截图如下: 错误 ...

随机推荐

  1. canvas--画宇宙

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  2. WEB 开发所用的网站

    常用前端手册: http://caniuse.com/ http://www.w3school.com.cn/ http://www.runoob.com/ http://www.css88.com/ ...

  3. 在浏览器中就可以写F#程序了,你试试吧

    学习F#有一种简单办法,不需要安装Visual Studio,在浏览器中就可以写F#了,非常方便,进入下面的链接,你可以试试. http://www.tryfsharp.org/Learn

  4. 最全C语言笔记回顾

  5. 武汉科技大学ACM :1008: 零起点学算法58——开灯问题

    Problem Description 计算中心有8个机房,每个机房有n台电脑.每台电脑都有一个编号,比如8号机房编号就为H1到Hn,我们有时又称为H1为1号机器,H2为2号机器,.... 有一天我们 ...

  6. Matlab 取子矩阵

    MATLAB如何提取矩阵的子块 在matlab中如何提取一个矩阵的部分元素 1.提取大矩阵的一列.一行元素: 一列元素:  A(:,j)表示提取A矩阵的第j列全部元素 一行元素:  A(i,:)表示提 ...

  7. [目录][总结] C++和Java 中的主要操作对比

    总结一些,C++ 和Java 中的一些常用操作对比,就当是自己的查询工具书啦.(暂时按随笔的更新时间排序) [Stack] c++ V.S. Java (2015.04.27) [Map]   c++ ...

  8. xml2js

    实际做项目的时候会有很多的XML配置文件,有些XML多达上千行,比如物品,武将的配置,一般的手游项目是直接解析XML文件,这就引发2个问题. 1.XML是明文,代码中解析必要要做加密. 2.有些配置过 ...

  9. DEDE数据库修改

    dede数据库配置文件所在路径为:/data/common.inc.php 修改方法: 下面是该dede数据库配置文件的内容: <?php //数据库连接信息 $cfg_dbhost = 'lo ...

  10. C程序设计语言练习题1-4

    练习1-4 编写一个程序打印摄氏温度转换为相应华氏温度的转换表. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的 ...