广

IOS开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    详解iOS App开发中session和coockie的用户数据存储处理

    2018-04-08 09:04:49 次阅读 稿源:互联网
    零七广告

    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 = [NSURLSessionConfiguration defaultSessionConfiguration];
        //即时类型的
        NSURLSessionConfiguration * ephemeralConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
        //后台类型的
        NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"SessionId"];
       
        //创建并设置session
        NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];
        NSURLSession * ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralConfiguration];
        NSURLSession * backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration];
    NSURLSessionConfiguration还可以配置如缓存,网络模式等参数

    4.使用NSURLSession进行网络请求的两种方式

    NSURLSession有两种方式进行网络数据的请求,一种是通过block的方式获取网络数据,一种是通过代理回调的方式获取网络数据。通过block的方式进行请求代码如下:

        //创建session配置对象
        NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
        //创建请求对象
        NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
        //创建session对象
        NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration];
        //添加任务
        NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSLog(@"%@",data);
        }];
        //开始任务
        [task resume];
    使用代理回调的方式进行请求需要遵守如下协议:

    @interface ViewController ()<NSURLSessionDataDelegate>
    @end
    将请求代码修改如下:

        NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
        NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
        NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

        NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request];
        [task resume];
    实现代理方法如下:

    //开始接受数据
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
        NSLog(@"=======%@",data);
    }
    //接受数据结束
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
        NSLog(@"完成:error%@",error);
    }
    5.进行后台下载任务

    NSURLSession最大的优势在于其后台下载的灵活性,使用如下的代码进行后台数据下载:

     NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.zyprosoft.backgroundsession"];
        NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
        NSURLSession *  backgroundSession   = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:nil];
        [[backgroundSession downloadTaskWithRequest:request]resume];
    在下面的回调方法中可以进行下载进度的监听:

    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
    {
        NSLog(@"######");
    }
    如果在下载过程中点击Home键使应用程序进入后台,NSURLSession的相关代理方法将不再被回调,但是下载任务依然在进行,当后台下载完成后会与AppDelegate进行交互,会调用AppDelegate中的如下方法:

    -(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
        NSLog(@"1111");
    }
    之后应用程序在后台会调用NSURLSesstion代理的如下方法来通知下载结果:

    //此方法无论成功失败都会调用
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
        NSLog(@"完成:error%@",error);
    }
    //此方法只有下载成功才会调用 文件放在location位置
    -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
       
    }
    最后将调用NSURLSesstion的如下方法:

    -(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
    {
       
        NSLog(@"All tasks are finished");
       
    }

    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后可用
    - (nullable NSArray<NSHTTPCookie *> *)cookiesForURL:(NSURL *)URL;
    //获取某个特定URL的所有Cookie数据
    - (void)removeCookiesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);
    //为某个特定的URL设置Cookie
    - (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forURL:(nullable NSURL *)URL mainDocumentURL:(nullable NSURL *)mainDocumentURL;
    //Cookie数据的接收协议
    /*
    枚举如下:
    typedef NS_ENUM(NSUInteger, NSHTTPCookieAcceptPolicy) {
        NSHTTPCookieAcceptPolicyAlways,//接收所有Cookie信息
        NSHTTPCookieAcceptPolicyNever,//不接收所有Cookie信息
        NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain//只接收主文档域的Cookie信息
    };
    */
    @property NSHTTPCookieAcceptPolicy cookieAcceptPolicy;
    系统下面的两个通知与Cookie管理有关:

    //Cookie数据的接收协议改变时发送的通知
    FOUNDATION_EXPORT NSString * const NSHTTPCookieManagerAcceptPolicyChangedNotification;
    //管理的Cookie数据发生变化时发送的通知
    FOUNDATION_EXPORT NSString * const NSHTTPCookieManagerCookiesChangedNotification;

    2.NSHTTPCookie

    NSHTTPCookie是具体的HTTP请求Cookie数据对象,其中属性方法如下:

    //下面两个方法用于对象的创建和初始化 都是通过字典进行键值设置
    - (nullable instancetype)initWithProperties:(NSDictionary<NSString *, id> *)properties;
    + (nullable NSHTTPCookie *)cookieWithProperties:(NSDictionary<NSString *, id> *)properties;
    //返回Cookie数据中可用于添加HTTP头字段的字典
    + (NSDictionary<NSString *, NSString *> *)requestHeaderFieldsWithCookies:(NSArray<NSHTTPCookie *> *)cookies;
    //从指定的响应头和URL地址中解析出Cookie数据
    + (NSArray<NSHTTPCookie *> *)cookiesWithResponseHeaderFields:(NSDictionary<NSString *, NSString *> *)headerFields forURL:(NSURL *)URL;
    //Cookie数据中的属性字典
    @property (nullable, readonly, copy) NSDictionary<NSString *, id> *properties;
    //请求响应的版本
    @property (readonly) NSUInteger version;
    //请求相应的名称
    @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) BOOL secure;
    //是否只发送HTTP的服务
    @property (readonly, getter=isHTTPOnly) BOOL HTTPOnly;
    //响应的文档
    @property (nullable, readonly, copy) NSString *comment;
    //相应的文档URL
    @property (nullable, readonly, copy) NSURL *commentURL;
    //服务端口列表
    @property (nullable, readonly, copy) NSArray<NSNumber *> *portList;

     

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告