主要记录关于cookie相关的坑

1. UIWebview

1. UIWebview 相对比较简单 直接通过 NSHTTPCookieStorage 设置cookie就能实现。

代码部分

  1. ```
  2. NSURL *cookieHost = [NSURL URLWithString:self.domain];
  3. // 设定 cookie
  4. NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
  5. [NSDictionary dictionaryWithObjectsAndKeys:
  6. [cookieHost host], NSHTTPCookieDomain,
  7. [cookieHost path], NSHTTPCookiePath,
  8. self.cookieKey, NSHTTPCookieName,
  9. self.cookieValue, NSHTTPCookieValue,
  10. nil]];
  11. // 加入cookie
  12. [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
  13. ```

2. 如果在第一次请求的时候需要在HTTPRequest 通过setValueForKey设置 HeaderValue

2. WKWebview

在使用WKWebview的时候也是需要分两种情况传递:

  • 1.HTTPRequest 请求URL的时候携带 如后端PHP获取 cookie

  • 2.注入js 目的是让前端从页面里边获取到cookie 可以通过在document.cookie 设置 通过WKWebview 初始化时候把js传递过去

    1. WKUserScript * cookieScript = [[WKUserScript alloc]
    2. initWithSource: cookieValue
    3. injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
    4. ``
  • 3.NSHTTPCookieStorage 似乎不携带没问题,因为我们目前没有通过这个传递cookie

网上参考别人的方法是要实现下面几个步骤,但是我们项目并没有按照这三种必要方式,但是可以做个参考:

WKWebview三个处理步骤: (1)iOS11,WKHTTPCookieStore 直接传递。(如果是只支持iOS11,下面两步可以不做); (2)iOS8-iOS10, js注入; (3)PHP携带cookie方式

相关代码

  1. #pragma mark - WKWebview
  2. // iOS11
  3. - (void)setWkCookie:(WKWebView *)wkWebview completionHandler:(nullable void (^)(void))comple {
  4. NSURL *cookieHost = [NSURL URLWithString:self.domain];
  5. // 设定 cookie
  6. NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
  7. [NSDictionary dictionaryWithObjectsAndKeys:
  8. [cookieHost host], NSHTTPCookieDomain,
  9. [cookieHost path], NSHTTPCookiePath,
  10. self.cookieKey, NSHTTPCookieName,
  11. self.cookieValue, NSHTTPCookieValue,
  12. // [NSDate dateWithTimeIntervalSinceNow:30*60*60],NSHTTPCookieExpires,
  13. nil]];
  14. // 加入cookie
  15. //发送请求前插入cookie;
  16. if (@available(iOS 11.0, *)) {
  17. WKHTTPCookieStore *cookieStore = wkWebview.configuration.websiteDataStore.httpCookieStore;
  18. [cookieStore setCookie:cookie completionHandler:^{
  19. comple?comple():nil;
  20. }];
  21. } else {
  22. }
  23. }
  24. // JS携带cookie的形式
  25. - (void)setWkJsCookie:(WKUserContentController *)userContentController {
  26. // 单个cookie,多个的话,再加上document.cookie ='%@=%@';一次
  27. NSString *cookieStr = [NSString stringWithFormat:@"document.cookie ='%@=%@';",self.cookieKey,self.cookieValue];
  28. WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
  29. [userContentController addUserScript:cookieScript];
  30. }
  31. // PHP携带cookie的形式
  32. - (void)setWkPHPCookie:(NSMutableURLRequest *)request {
  33. //通过host关联cookie。
  34. NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
  35. NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
  36. NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  37. for (NSHTTPCookie *cookie in [cookieStorage cookies]) {
  38. [cookieDic setObject:cookie.value forKey:cookie.name];
  39. }
  40. if ([cookieDic objectForKey:[CookieManager shareInstance].cookieKey]) {
  41. [cookieDic removeObjectForKey:[CookieManager shareInstance].cookieKey];
  42. }
  43. // cookie重复,先放到字典进行去重,再进行拼接
  44. for (NSString *key in cookieDic) {
  45. NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
  46. [cookieValue appendString:appendString];
  47. }
  48. [cookieValue appendString:[NSString stringWithFormat:@"%@ = %@;",self.cookieKey,self.cookieValue]];
  49. [request addValue:cookieValue forHTTPHeaderField:@"Cookie"];
  50. }

  1. #pragma mark - Webview
  2. // 客户端添加cookie
  3. - (void)setWebCookie {
  4. NSURL *cookieHost = [NSURL URLWithString:self.domain];
  5. // 设定 cookie
  6. NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
  7. [NSDictionary dictionaryWithObjectsAndKeys:
  8. [cookieHost host], NSHTTPCookieDomain,
  9. [cookieHost path], NSHTTPCookiePath,
  10. self.cookieKey, NSHTTPCookieName,
  11. self.cookieValue, NSHTTPCookieValue,
  12. nil]];
  13. // 加入cookie
  14. [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
  15. }

2.WKWebview 有跨域问题

* 最后要说的是以上方法如果 考虑跨域问题的话,UIWebView 是不会出现的,但是WKWebview是不允许跨域的,这个也是苹果考虑到安全性的方面,但是是可以处理的,目前我们的方案是以下两种

1.前端通过获取到cookie后 重新种植一下cookie ,通过 .xxx.com 模糊种植

2.让后端来处理,可以把用户相关信息如 uid传递给前端。

iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)的更多相关文章

  1. Hybrid APP之Native和H5页面交互原理

    Hybrid APP之Native和H5页面交互原理 Hybrid APP的关键是原生页面与H5页面直接的交互,如下图,痛过JSBridge,H5页面可以调用Native的api,Native也可调用 ...

  2. 浅谈 iOS 与 H5 的交互- JavaScriptCore 框架

    前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCo ...

  3. IOS的H5页面滑动不流畅的问题:

    IOS的H5页面滑动不流畅的问题: -webkit-overflow-scrolling : touch; 需要滑动的是哪块区域,就在哪里加上这段代码就OK

  4. ios嵌套H5页面,出现的小bug;

    ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content=" ...

  5. iOS原生App与H5页面交互笔记

    文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...

  6. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  7. iOS 中 h5 页面 iframe 调用高度自扩展问题及解决

    开发需求需要在 h5 中用 iframe 中调用一个其他公司开发的 html 页面. 简单的插入 <iframe /> 并设置宽高后,发现在 Android 手机浏览器上打开可以正常运行, ...

  8. iframe ios中h5页面 样式变大

    实际项目开发中,iframe在移动设备中使用问题还是很大的,说一说我的那些iframe坑 做过的这个后台管理框架,最开始的需求是PC,但随着业务需要,需要将项目兼容到ipad,后台的框架也是使用的开源 ...

  9. chrome 调试 ios的 H5 页面

    原文地址http://www.cnblogs.com/kelsen/p/6402477.html 本文重点讨论如何在 Windows 系统中通过chrome 浏览器调试运行在 iPhone Safar ...

随机推荐

  1. c# 为什么会出现死锁?多线程死锁怎么解决

    出现死锁必须满足以下几个条件: 1.互斥条件:该进程拥有的资源,其他进程只能等待其释放. 2.不剥夺条件:该进程拥有的资源只能由它自己来释放. 3.请求和保持条件:请求其他的资源,同时自己拥有的资源又 ...

  2. Theano中的导数

    计算梯度 现在让我们使用Theano来完成一个稍微复杂的任务:创建一个函数,该函数计算相对于其参数x的某个表达式y的导数.为此,我们将使用宏T.grad.例如,我们可以计算相对于的梯度 import ...

  3. HttpClientFactory 日志不好用,自己扩展一个?

    前言 .NetCore2.1新推出HttpClientFactory工厂类, 替代了早期的HttpClient, 并新增了弹性Http调用机制 (集成Policy组件). 替换的初衷还是简单说下: ① ...

  4. 【Android - 控件】之MD - NavigationView的使用

    NavigationView是Android 5.0新特性——Material Design中的一个布局控件,可以结合DrawerLayout使用,让侧滑菜单变得更加美观(可以添加头部布局). Nav ...

  5. selenium处理iframe和动作链

    selenium处理iframe和动作链 iframe iframe就是一个界面里嵌套了其他界面,这个时候selenium是不能从主界面找到子界面的属性,需要先找到子界面,再去找子界面的属性 动作链( ...

  6. php实现微信拼手气红包

    $result = sendHB(3, 5); echo '<pre>'; var_export($result); echo array_sum($result); /** * 拼手气红 ...

  7. 物缘科技主导IEEE可信物联网数据管理工作组启动会召开

    2019年10月15日,由物缘科技主导的IEEE标准协会P2144 可信物联网数据管理工作组启动会在香港召开.物联网.区块链技术领域的企业代表和技术专家出席,共同就物联网数据管理.基于区块链的可信数据 ...

  8. 深入比特币原理(三)——交易的输入(input)与输出(output)

    本节内容非常重要,如果你不能很好的掌握本节内容,你无法真正理解比特币的运行原理,请务必要学习清楚. 比特币的交易模型为UTXO(unspend transaction output),即只记录未花费的 ...

  9. oracle监听查看、启动和停止

    oracle监听查看.启动和停止 查看监听lsnrctl status 停止监听lsnrctl stop 启动监听lsnrctl start

  10. 洛谷 题解 P1287 【盒子与球】

    题解:P1287 盒子与球 不了解的:stirling数(斯特林数) - 百度百科 分析如下: 设有n个不同的球,分别用b1,b2,--bn表示.从中取出一个球bn,bn的放法有以下两种: 1) bn ...