iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)
主要记录关于cookie相关的坑
1. UIWebview
1. UIWebview 相对比较简单 直接通过 NSHTTPCookieStorage 设置cookie就能实现。
代码部分
```
NSURL *cookieHost = [NSURL URLWithString:self.domain];
// 设定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[cookieHost host], NSHTTPCookieDomain,
[cookieHost path], NSHTTPCookiePath,
self.cookieKey, NSHTTPCookieName,
self.cookieValue, NSHTTPCookieValue,
nil]];
// 加入cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
```
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方式
相关代码
#pragma mark - WKWebview
// iOS11
- (void)setWkCookie:(WKWebView *)wkWebview completionHandler:(nullable void (^)(void))comple {
NSURL *cookieHost = [NSURL URLWithString:self.domain];
// 设定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[cookieHost host], NSHTTPCookieDomain,
[cookieHost path], NSHTTPCookiePath,
self.cookieKey, NSHTTPCookieName,
self.cookieValue, NSHTTPCookieValue,
// [NSDate dateWithTimeIntervalSinceNow:30*60*60],NSHTTPCookieExpires,
nil]];
// 加入cookie
//发送请求前插入cookie;
if (@available(iOS 11.0, *)) {
WKHTTPCookieStore *cookieStore = wkWebview.configuration.websiteDataStore.httpCookieStore;
[cookieStore setCookie:cookie completionHandler:^{
comple?comple():nil;
}];
} else {
}
}
// JS携带cookie的形式
- (void)setWkJsCookie:(WKUserContentController *)userContentController {
// 单个cookie,多个的话,再加上document.cookie ='%@=%@';一次
NSString *cookieStr = [NSString stringWithFormat:@"document.cookie ='%@=%@';",self.cookieKey,self.cookieValue];
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
}
// PHP携带cookie的形式
- (void)setWkPHPCookie:(NSMutableURLRequest *)request {
//通过host关联cookie。
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieStorage cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
}
if ([cookieDic objectForKey:[CookieManager shareInstance].cookieKey]) {
[cookieDic removeObjectForKey:[CookieManager shareInstance].cookieKey];
}
// cookie重复,先放到字典进行去重,再进行拼接
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
[cookieValue appendString:[NSString stringWithFormat:@"%@ = %@;",self.cookieKey,self.cookieValue]];
[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];
}
#pragma mark - Webview
// 客户端添加cookie
- (void)setWebCookie {
NSURL *cookieHost = [NSURL URLWithString:self.domain];
// 设定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[cookieHost host], NSHTTPCookieDomain,
[cookieHost path], NSHTTPCookiePath,
self.cookieKey, NSHTTPCookieName,
self.cookieValue, NSHTTPCookieValue,
nil]];
// 加入cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
2.WKWebview 有跨域问题
* 最后要说的是以上方法如果 考虑跨域问题的话,UIWebView 是不会出现的,但是WKWebview是不允许跨域的,这个也是苹果考虑到安全性的方面,但是是可以处理的,目前我们的方案是以下两种
1.前端通过获取到cookie后 重新种植一下cookie ,通过 .xxx.com 模糊种植
2.让后端来处理,可以把用户相关信息如 uid传递给前端。
iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)的更多相关文章
- Hybrid APP之Native和H5页面交互原理
Hybrid APP之Native和H5页面交互原理 Hybrid APP的关键是原生页面与H5页面直接的交互,如下图,痛过JSBridge,H5页面可以调用Native的api,Native也可调用 ...
- 浅谈 iOS 与 H5 的交互- JavaScriptCore 框架
前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCo ...
- IOS的H5页面滑动不流畅的问题:
IOS的H5页面滑动不流畅的问题: -webkit-overflow-scrolling : touch; 需要滑动的是哪块区域,就在哪里加上这段代码就OK
- ios嵌套H5页面,出现的小bug;
ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content=" ...
- iOS原生App与H5页面交互笔记
文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...
- Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理
本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...
- iOS 中 h5 页面 iframe 调用高度自扩展问题及解决
开发需求需要在 h5 中用 iframe 中调用一个其他公司开发的 html 页面. 简单的插入 <iframe /> 并设置宽高后,发现在 Android 手机浏览器上打开可以正常运行, ...
- iframe ios中h5页面 样式变大
实际项目开发中,iframe在移动设备中使用问题还是很大的,说一说我的那些iframe坑 做过的这个后台管理框架,最开始的需求是PC,但随着业务需要,需要将项目兼容到ipad,后台的框架也是使用的开源 ...
- chrome 调试 ios的 H5 页面
原文地址http://www.cnblogs.com/kelsen/p/6402477.html 本文重点讨论如何在 Windows 系统中通过chrome 浏览器调试运行在 iPhone Safar ...
随机推荐
- 请求库urllib和urllib3
# coding=utf-8 # urllib """ 使用python的urllib库去模拟浏览器请求网页,常用内容如下: urllib.request 发送HTTP请 ...
- linux常见配置文件路径
1:/etc/sysconfig/i18n (语言配置文件). 2:/etc/sysconfig/network-scripts/ifcfg-eth0 ...
- Android分包MultiDex源码分析
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52845661 本文出自: [HansChen的博客] 概述 Android开发者应该 ...
- 小白学 Python 爬虫(9):爬虫基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- python 备忘录
1. python 变量 区分大小写 2. 字符串可以用 'X' "X" '''X''' """X""" 3. ...
- VisualVM分析与HelloWorld、springBoot项目
VisualVM分析与HelloWorld.springBoot项目 自从1995年第一个JDK版本JDKBeta发布,至今已经快25年,这些年来Java的框架日新月异,从最开始的Servlet阶段, ...
- 工作中的开发过程(Javaweb路线,写给刚刚实习或者马上就要工作的朋友)
工作中的开发过程(Javaweb路线,写给刚刚实习或者马上就要工作的朋友) 当我还没开始工作的时候,我是对实际项目开发流程充满未知和向往的,当时很希望能够有一个过来人,给我介绍一下实际工作起来是什么样 ...
- RS485与RS232
以下内容为结合视频,加上自述对其理解. 信息在传输线上通过电压信息进行传输,一个字节的数据有8位. 当传输一个字节的信息时,通信方式有串行通信与并行通信,在这两种通信方式之中,RS485是并行通信,R ...
- Preact(React)核心原理详解
原创: 宝丁 玄说前端 本文作者:字节跳动 - 宝丁 一.Preact 是什么 二.Preact 和 React 的区别有哪些? 三.Preact 是怎么工作的 四.结合实际组件了解整体渲染流程 五. ...
- CodeForces1000A-Light It Up
B. Light It Up time limit per test 1 second memory limit per test 256 megabytes input standard input ...