详解iOS App开发中session和coockie的用户数据存储处理
NSURLSession
在iOS7之后,NSURLSession作为系统推荐使用的HTTP请求框架,在进行前台请求的情况下,NSURLSession与NSURLConnection并无太大差异,对于后台的请求,NSURLSession更加灵活的优势就将展现无遗。
1.NSURLSession集合的类型
NSURLSession类提供3中Session类型:
(1)Default类型:提供前台请求相关方法,支持配置缓存,身份凭证等。
(2)Ephemeral类型:即时的请求类型,不使用缓存,身份凭证等。
(3)Background:后台类型,支持在后台完成请求任务。
2.NSURLSession任务的类型
在NSURLSession中添加的请求任务支持3中类型:
(1)数据任务:使用NSData对象进行数据的发送和获取,一般用于短数据的任务。
(2)下载任务:从文件下载数据,支持后台下载。
(3)上传任务:以文件的形式上传数据,支持后台上传。
3.创建并配置NSURLSession:
通过NSURLSessionConfiguration类对象对NSURLSession进行配置与创建,创建和配NSURLSession的示例代码如下:
//默认类型的
NSURLSessionConfiguration*defaultConfiguration=[NSURLSessionConfigurationdefaultSessionConfiguration];
//即时类型的
NSURLSessionConfiguration*ephemeralConfiguration=[NSURLSessionConfigurationephemeralSessionConfiguration];
//后台类型的
NSURLSessionConfiguration*backgroundConfiguration=[NSURLSessionConfigurationbackgroundSessionConfigurationWithIdentifier:@"SessionId"];
//创建并设置session
NSURLSession*defaultSession=[NSURLSessionsessionWithConfiguration:defaultConfiguration];
NSURLSession*ephemeralSession=[NSURLSessionsessionWithConfiguration:ephemeralConfiguration];
NSURLSession*backgroundSession=[NSURLSessionsessionWithConfiguration:backgroundConfiguration];
NSURLSessionConfiguration还可以配置如缓存,网络模式等参数
4.使用NSURLSession进行网络请求的两种方式
NSURLSession有两种方式进行网络数据的请求,一种是通过block的方式获取网络数据,一种是通过代理回调的方式获取网络数据。通过block的方式进行请求代码如下:
//创建session配置对象
NSURLSessionConfiguration*defaultConfiguration=[NSURLSessionConfigurationdefaultSessionConfiguration];
//创建请求对象
NSURLRequest*request=[NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://www.baidu.com"]];
//创建session对象
NSURLSession*defaultSession=[NSURLSessionsessionWithConfiguration:defaultConfiguration];
//添加任务
NSURLSessionTask*task=[defaultSessiondataTaskWithRequest:requestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror){
NSLog(@"%@",data);
}];
//开始任务
[taskresume];
使用代理回调的方式进行请求需要遵守如下协议:
@interfaceViewController()<NSURLSessionDataDelegate>
@end
将请求代码修改如下:
NSURLSessionConfiguration*defaultConfiguration=[NSURLSessionConfigurationdefaultSessionConfiguration];
NSURLRequest*request=[NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://www.baidu.com"]];
NSURLSession*defaultSession=[NSURLSessionsessionWithConfiguration:defaultConfigurationdelegate:selfdelegateQueue:[NSOperationQueuemainQueue]];
NSURLSessionTask*task=[defaultSessiondataTaskWithRequest:request];
[taskresume];
实现代理方法如下:
//开始接受数据
-(void)URLSession:(NSURLSession*)sessiondataTask:(NSURLSessionDataTask*)dataTaskdidReceiveData:(NSData*)data{
NSLog(@"=======%@",data);
}
//接受数据结束
-(void)URLSession:(NSURLSession*)sessiontask:(NSURLSessionTask*)taskdidCompleteWithError:(NSError*)error{
NSLog(@"完成:error%@",error);
}
5.进行后台下载任务
NSURLSession最大的优势在于其后台下载的灵活性,使用如下的代码进行后台数据下载:
NSURLSessionConfiguration*backgroundConfiguration=[NSURLSessionConfigurationbackgroundSessionConfigurationWithIdentifier:@"com.zyprosoft.backgroundsession"];
NSURLRequest*request=[NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://www.baidu.com"]];
NSURLSession* backgroundSession =[NSURLSessionsessionWithConfiguration:backgroundConfigurationdelegate:selfdelegateQueue:nil];
[[backgroundSessiondownloadTaskWithRequest:request]resume];
在下面的回调方法中可以进行下载进度的监听:
-(void)URLSession:(NSURLSession*)sessiondownloadTask:(NSURLSessionDownloadTask*)downloadTaskdidWriteData:(int64_t)bytesWrittentotalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
NSLog(@"######");
}
如果在下载过程中点击Home键使应用程序进入后台,NSURLSession的相关代理方法将不再被回调,但是下载任务依然在进行,当后台下载完成后会与AppDelegate进行交互,会调用AppDelegate中的如下方法:
-(void)application:(UIApplication*)applicationhandleEventsForBackgroundURLSession:(NSString*)identifiercompletionHandler:(void(^)())completionHandler{
NSLog(@"1111");
}
之后应用程序在后台会调用NSURLSesstion代理的如下方法来通知下载结果:
//此方法无论成功失败都会调用
-(void)URLSession:(NSURLSession*)sessiontask:(NSURLSessionTask*)taskdidCompleteWithError:(NSError*)error{
NSLog(@"完成:error%@",error);
}
//此方法只有下载成功才会调用文件放在location位置
-(void)URLSession:(NSURLSession*)sessiondownloadTask:(NSURLSessionDownloadTask*)downloadTaskdidFinishDownloadingToURL:(NSURL*)location{
}
最后将调用NSURLSesstion的如下方法:
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession*)session
{
NSLog(@"Alltasksarefinished");
}
Cookie
Cookie是网站为了便是终端身份,保存在终端本地的用户凭证信息。Cookie中的字段与意义由服务端进行定义。例如,当用户在某个网站进行了登录操作后,服务端会将Cookie信息返回给终端,终端会将这些信息进行保存,在下一次再次访问这个网站时,终端会将保存的Cookie信息一并发送到服务端,服务端根据Cookie信息是否有效来判断此用户是否可以自动登录。
iOS中进行Cookie管理的两个类:
iOS中进行HTTP网络请求Cookie管理主要由两个类负责,一个类是NSHTTPCookieStorage类,一个是NSHTTPCookie类。
1.NSHTTPCookieStorage
NSHTTPCookieStorage类采用单例的设计模式,其中管理着所有HTTP请求的Cookie信息,常用方法如下:
//获取单例对象
+(NSHTTPCookieStorage*)sharedHTTPCookieStorage;
//所有Cookie数据数组其中存放NSHTTPCookie对象
@property(nullable,readonly,copy)NSArray<NSHTTPCookie*>*cookies;
//手动设置一条Cookie数据
-(void)setCookie:(NSHTTPCookie*)cookie;
//删除某条Cookie信息
-(void)deleteCookie:(NSHTTPCookie*)cookie;
//删除某个时间后的所有Cookie信息iOS8后可用
-(nullableNSArray<NSHTTPCookie*>*)cookiesForURL:(NSURL*)URL;
//获取某个特定URL的所有Cookie数据
-(void)removeCookiesSinceDate:(NSDate*)dateNS_AVAILABLE(10_10,8_0);
//为某个特定的URL设置Cookie
-(void)setCookies:(NSArray<NSHTTPCookie*>*)cookiesforURL:(nullableNSURL*)URLmainDocumentURL:(nullableNSURL*)mainDocumentURL;
//Cookie数据的接收协议
/*
枚举如下:
typedefNS_ENUM(NSUInteger,NSHTTPCookieAcceptPolicy){
NSHTTPCookieAcceptPolicyAlways,//接收所有Cookie信息
NSHTTPCookieAcceptPolicyNever,//不接收所有Cookie信息
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain//只接收主文档域的Cookie信息
};
*/
@propertyNSHTTPCookieAcceptPolicycookieAcceptPolicy;
系统下面的两个通知与Cookie管理有关:
//Cookie数据的接收协议改变时发送的通知
FOUNDATION_EXPORTNSString*constNSHTTPCookieManagerAcceptPolicyChangedNotification;
//管理的Cookie数据发生变化时发送的通知
FOUNDATION_EXPORTNSString*constNSHTTPCookieManagerCookiesChangedNotification;
2.NSHTTPCookie
NSHTTPCookie是具体的HTTP请求Cookie数据对象,其中属性方法如下:
//下面两个方法用于对象的创建和初始化都是通过字典进行键值设置
-(nullableinstancetype)initWithProperties:(NSDictionary<NSString*,id>*)properties;
+(nullableNSHTTPCookie*)cookieWithProperties:(NSDictionary<NSString*,id>*)properties;
//返回Cookie数据中可用于添加HTTP头字段的字典
+(NSDictionary<NSString*,NSString*>*)requestHeaderFieldsWithCookies:(NSArray<NSHTTPCookie*>*)cookies;
//从指定的响应头和URL地址中解析出Cookie数据
+(NSArray<NSHTTPCookie*>*)cookiesWithResponseHeaderFields:(NSDictionary<NSString*,NSString*>*)headerFieldsforURL:(NSURL*)URL;
//Cookie数据中的属性字典
@property(nullable,readonly,copy)NSDictionary<NSString*,id>*properties;
//请求响应的版本
@property(readonly)NSUIntegerversion;
//请求相应的名称
@property(readonly,copy)NSString*name;
//请求相应的值
@property(readonly,copy)NSString*value;
//过期时间
@property(nullable,readonly,copy)NSDate*expiresDate;
//请求的域名
@property(readonly,copy)NSString*domain;
//请求的路径
@property(readonly,copy)NSString*path;
//是否是安全传输
@property(readonly,getter=isSecure)BOOLsecure;
//是否只发送HTTP的服务
@property(readonly,getter=isHTTPOnly)BOOLHTTPOnly;
//响应的文档
@property(nullable,readonly,copy)NSString*comment;
//相应的文档URL
@property(nullable,readonly,copy)NSURL*commentURL;
//服务端口列表
@property(nullable,readonly,copy)NSArray<NSNumber*>*portList;