最近的项目开发中,遇到了一个有趣的问题:金融项目需要接入第三方的SDK进行资金托管,比如充值,提现,投资等。当从第三方的界面回到原生APP界面时,神奇的事情发生了。原本存储在NSHTTPCookieStorage中的cookic却被清空了。项目是依靠cookie验证用户登录状态,这下出大事了:用户莫名其妙的退出登录了。
一,NSHTTPCookieStorage
/*!
@property sharedHTTPCookieStorage
@abstract获取默认位置的共享cookie存储。
@result共享的cookie存储
@discussion从OS X 10.11开始,每个应用程序都有自己的sharedHTTPCookieStorage单例,
这将不会与其他应用程序共享。
*/
@property(class, readonly, strong) NSHTTPCookieStorage *sharedHTTPCookieStorage;
当我们使用该类的时候,是通过上面这个属性方法获取到该单例对象的。至于为什么会采用单例模式,是因为该类的用途就是“共享的cookie存储”。
/*!
@abstract获取所有的cookies
@result一个NSArray的NSHTTPCookies
*/
@property (nullable , readonly, copy) NSArray<NSHTTPCookie *> *cookies;
/*!
@method setCookie:
@abstract设置一个cookie
@discussion该cookie将覆盖现有的cookie与相同的名称,域名和路径,如果有的话。
*/
- (void)setCookie:(NSHTTPCookie *)cookie;
/*!
@method deleteCookie:
@abstract删除指定的cookie
*/
- (void)deleteCookie:(NSHTTPCookie *)cookie;
/*!
@method removeCookiesSince:
@abstract从提供的日期起,删除cookie存储中的所有cookie。
*/
- (void)removeCookiesSinceDate:(NSDate *)date
/*!
@method cookiesForURL:
@abstract返回要发送到给定URL的cookie数组。
@param URL获取cookie的URL。
@result一个NSArray的NSHTTPCookie对象。
@discussion Cookie管理器检查它存储的cookie包括那些应该被发送到给定的URL。 您可以使用<tt> + [NSCookie requestHeaderFieldsWithCookies:] </ tt>来打开这个数组成一组头字段添加到请求。
*/
- (nullable NSArray<NSHTTPCookie *> *)cookiesForURL:(NSURL *)URL;
/*!
@method setCookies:forURL:mainDocumentURL:
@abstract将一个数组的cookie添加到cookie存储中
Cookie接受政策。
@param cookies要设置的cookie。
@参数URL发送cookie的URL。
@param mainDocumentURL要用作“相同”的基础的主文档URL域名为主要文件“政策。
@discussion对于mainDocumentURL,调用者应该传递URL一个适当的主文档,如果知道的话。
例如,加载时一个网页,顶层的主html文档的URL框架应该通过。
根据一组响应保存cookie头,你可以使用<tt> + [NSCookie
cookiesWithResponseHeaderFields:forURL:] </ tt>标题字段字典,然后使用此方法来存储结果的cookie 按照政策设置。
*/
- (void)setCookies:(NSArray<NSHTTPCookie *> *)cookies forURL:(nullable NSURL *)URL mainDocumentURL:(nullable NSURL *)mainDocumentURL;