经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)
来源:cnblogs  作者:日落东单  时间:2019/10/24 9:16:51  对本文有异议

iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)

主要记录关于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传递过去

    `WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieValue injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];

  • 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传递给前端。

原文链接:http://www.cnblogs.com/keyan1102/p/11729795.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号