记录使用WKWebView进行OC与JS交互所踩过的坑
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
} // cookie重复,先放到字典进行去重,再进行拼接
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request addValue:cookieValue forHTTPHeaderField:@"Cookie"]; [_webView loadRequest:request];
WKWebViewConfiguration *config = [WKWebViewConfiguration new];
// 将所有cookie以document.cookie = 'key=value';形式进行拼接
NSString *cookieValue = [self getCookieSets];
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc]
initWithSource: cookieValue
injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
config.userContentController = userContentController;
_webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 64, Screen_Width, Screen_Height - 64) configuration:config]; - (NSString *)getCookieSets
{
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
} /*
cookie重复,先放到字典进行去重,再进行拼接,拼接格式为
NSString *cookieValue = @"document.cookie = 'fromapp=ios';document.cookie = 'channel=appstore';";
*/
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"document.cookie = '%@=%@';", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
} return cookieValue; }
2.允许弹出js的弹窗
当js调用alert弹窗时,是不能直接在APP页面上弹出来的,必须由APP实现以下三个代理方法,才能弹出他们的弹窗
在JS端调用alert函数时,会触发此代理方法。JS端调用alert时所传的数据可以通过message拿到 在原生得到结果后,需要回调JS,是通过completionHandler回调
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
JS端调用confirm函数时,会触发此方法。
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
JS端调用confirm函数时,会触发此方法
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message
initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
3.加载不安全的Https链接
当加载的H5页面链接是不安全的https链接时,页面会表现为进度条在走,但是过一会进度条消失,页面空白,无内容显示。
这时候必须做一些兼容操作,才能正常加载页面。在认证的代理方法里进行信任。
4.WkWebview无法播放wav格式音频
在H5页面播放语音,没有声音,但是能确保的是音频文件是正确的,因为在iOS端发送的语音在安卓端是可以播放的;后来经测试发现在微信端发送的语音在iOS上也能播放,而微信端发送的语音格式是MP3,iOS端发送的是WAV格式的;于是就怀疑是语音文件格式的问题,于是用苹果自带的浏览器进行测试发现并不支持WAV格式的音频播放。刚开始一直以为是权限未开放的问题,并没有怀疑是格式的问题,因为WAV是苹果录音的原生音频格式
5.H5页面图片横竖屏显示错乱
H5页面图片浏览器在安卓端显示的图片是竖屏的,但是在iOS端显示的图片确实横屏的,本来以为是iOS端的图片是自动根据屏幕适应,后来才发现是因为:
图片有自己的存储信息,苹果手机在拍摄的时候会给图片加上横评或者竖屏的信息的,拍摄的时候是横屏的自然显示的就是横屏的,服务器传的图片之所以是竖屏的是因为服务器那边旋转了图片的位置,但是图片自身的那个横评或者竖屏的信息没有修改,所以在浏览器加载时图片仍然显示自身记录的横屏
6.WkWebView中window.open方法不起作用
webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
里面进行拦截url,然后使用【UIApplication openURL】方法进行跳转,但是这种方法对于我的需求来说并不适用,因为我是需要在App当前页面打开新窗口,不离开当前页面。所以后来询问了H5那边的开发人员除了window.open有没有其他打开新窗口页面的方法,然后H5那边跟App一起尝试了用window.location,成功解决问题。
7.WkWebView加载PDF乱码
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler { NSString *strRequest = [navigationAction.request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
WKNavigationActionPolicy policy = WKNavigationActionPolicyAllow; if ([strRequest rangeOfString:@"?sign="].location != NSNotFound)
{
NSString *headStr = [[strRequest componentsSeparatedByString:@"?sign="] firstObject]; //加载PDF文件需要设置编码
if ([headStr rangeOfString:@".pdf"].location != NSNotFound) {
NSData *data = [NSData dataWithContentsOfURL:navigationAction.request.URL];
if (@available(iOS 9.0, *)) {
[self.webView loadData:data MIMEType:@"application/pdf" characterEncodingName:@"GBK" baseURL:nil];
} else {
// Fallback on earlier versions
}
}
}
}
记录使用WKWebView进行OC与JS交互所踩过的坑的更多相关文章
- iOS(UIWebView 和WKWebView)OC与JS交互 之二
在iOS应用的开发过程中,我们经常会使用到WebView,当我们对WebView进行操作的时候,有时会需要进行源生的操作.那么我记下来就与大家分享一下OC与JS交互. 首先先说第一种方法,并没有牵扯O ...
- iOS(WKWebView)OC与JS交互 之三
随着H5功能愈发的强大,没进行过混合开发的小伙们都不好意思说自己能够独立进行iOS的app开发,在iOS7操作系统下,常用的native,js交互框架有easy-js,WebViewJavascr ...
- OC和JS交互的三种方法
看简书上说一共有六种OC和JS交互的方法,但是前三种原理都一致,都是通过检测.拦截Url地址实现互相调用的.剩下的react native等第三方框架原理不一样,也没有去研究,下边记录我使用的三种方法 ...
- OC与JS交互之WebViewJavascriptBridge
上一篇文章介绍了通过UIWebView实现了OC与JS交互的可能性及实现的原理,并且简单的实现了一个小的示例DEMO,当然也有一部分遗留问题,使用原生实现过程比较繁琐,代码难以维护.这篇文章主要介绍下 ...
- Mac Webview OC与JS交互实现
1.首先,需要定义一个JS可识别的变量(如external)用于OC与JS交互 - (void)webView:(WebView *)sender didClearWindowObject:(WebS ...
- UIWebView和WKWebView的使用及js交互
UIWebView和WKWebView的使用及js交互 web页面和app直接的交互是很常见的东西,之前尝试过flex和js的相互调用以及android和js的相互调用,却只有ios没试过,据说比较复 ...
- OC与JS交互之UIWebView
随着H5的强大,hybrid app已经成为当前互联网的大方向,单纯的native app和web app在某些方面显得就很劣势.关于H5的发展史,这里有一篇文章推荐给大家,今天我们来学习最基础的基于 ...
- OC与JS交互前言
OC与JS交互过程中,可能会需要使用本地image资源及html,css,js文件,这些资源应该如何被加载? 一.WebView加载HTML UIWebView提供了三个方法来加载html资源 1. ...
- iOS WKWebView OC 与 JS 交互学习
我写WKWebView 想让 服务端相应 一个 方法但是不响应,根据 UIWebView 用 JSContext就能拿到响应的处理经验是不是服务端 也需要 对 WKwebView有兼容的一个写法??? ...
随机推荐
- Jenkins_创建任务以及定时启动(2)
一.创建任务 1.点击New Item 2.输入用户,单击Freestyle project,点击OK 3.填写构建步骤,因为是安装在linux上的,所以我们选择Execute shell,随意输入一 ...
- Django_视图中的request对象详解(八)
本文参考:http://www.cnblogs.com/MnCu8261/p/5871085.html Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并 ...
- Python 利用@property装饰器和property()方法将一个方法变成属性调用
在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_s ...
- testng.xml 执行多个测试用例
1.在工程名字上点击右键,点击[New]-->[File] 2.在弹出的[New File]对话框中的[File name]输入[testng.xml],点击[Finish]即创建了一个test ...
- go包管理速通,一篇文章就够了,再也不用担心因为不会导包被辞退
前言 最近在看一些go语言相关的书,发现了一个有意思的事情:其中一本书最新印刷的版本是2017年3月,而golang包管理的后起之秀go module伴随go1.11于2018年8月诞生--因此,书里 ...
- 你的Kubernetes Java应用优雅停机了吗?
Java 应用优雅停机 我们首先考虑下,一般在什么场景下数据会丢失呢? 升级服务时 pod重启时 服务器断电时 因为服务器断电属于极端情况,我们暂且不考虑.那就只有 Java 退出时我们要保证数据的完 ...
- 简单Spring MVC项目搭建
1.新建Project 开发环境我使用的是IDEA,其实使用什么都是大同小异的,关键是自己用的顺手. 首先,左上角File→New→Project.在Project页面选择Maven,然后勾上图中所示 ...
- 《剑指offer》面试题64. 求1+2+…+n
问题描述 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示 ...
- 我把自己的java库发布到了maven中央仓库,从此可以像Jackson、Spring的jar一样使用它了
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【记录一个问题】thanos receiver的日志中出现错误:conflict
完整的错误如下: level=debug ts=2021-08-16T09:07:43.412451Z caller=handler.go:355 component=receive componen ...