iOS WKWebView适配(基础篇)

iOS 13 适配 ING... Xcode11 缺失库文件导入位置变更 libstdc-6.0.9 文件下载 Xcode11下 这个目录不存在了 /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntim... 阅读详情

一、初始化

1.initWithFrame:configuration

self.wkWebView = [[WKWebView alloc] initWithFrame:frame configuration:[self _defaultConfiguration]];

2.WKWebViewConfiguration类说明

wkwebview初始化时的参数配置

websiteDataStore

wkwebview的存储空间,一般是处理cookie,缓存等浏览器相关的临时存储

读取cookie代码

[config.websiteDataStore fetchDataRecordsOfTypes:[NSSet setWithObject:WKWebsiteDataTypeCookies] completionHandler:^(NSArray *records) {}];	

清理所有存储(allWebsiteDataTypes)

WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore];
[dataStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes]
           completionHandler:^(NSArray * __nonnull records) {
            for (WKWebsiteDataRecord *record in records) {
                [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:record.dataTypes
                                                          forDataRecords:@[record]
                                                       completionHandler:^{
                    NSLog(@"Cookies for %@ deleted successfully",record.displayName);
                }];
            }
        }];
allowsInlineMediaPlayback

PS: 视频播放器不全屏显示 , iOS 10 以下使用 webkit-playsinline 属性

processPool

就是一个处理池,打开一个webview可以指定从什么池子里打开,一般用默认或者指定一个单例WKProcessPool就行了

applicationNameForUserAgent

可以指定userAgent中的application的名字,如果要修改整个UA,需要采用全局设置

mediaTypesRequiringUserActionForPlayback(iOS10+)/mediaPlaybackRequiresUserAction(iOS10-)

是否自动播放视频

if (@available(iOS 10.0, *)) {
	config.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
}else {
	config.mediaPlaybackRequiresUserAction = NO;
}
preferences

WKPreferences的配置

其它参数

js注入,创建js句柄(bridge)等在后续js通信处介绍

3.WKPreferences类说明

WKWebViewConfiguration另外的一些属性配置

javaScriptEnabled

是否支持js,如果是no,html加载时候直接忽略js的加载

KVC设置 allowFileAccessFromFileURLs

是否允许file路径

[prefs setValue:@TRUE forKey:@"allowFileAccessFromFileURLs"];

4.WKUIDelegate

wkwebview.UIDelegate属性

用户js中调用alert,confirm,prompt,如果不适配则无法使用对应js功能,估计是安全问题,因为使用中有的会采用这个作为bridge桥接

5.WKNavigationDelegate

wkwebview.navigationDelegate属性

监听wkwebview整个生命周期的代理方法,详细见"二、生命周期方法"

二、生命周期方法(WKNavigationDelegate)

1.请求前决定是否要跳转

用户点击网页上的链接,打开新页面时,调用。

为了兼容iOS8的js通信,也可以在这里拦截url做bridge分发

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    BOOL isContinueRequest = YES;
    //    NSString *jsNotId = [self __getJSNotificationId:[navigationAction.request URL]];
    //    NSString *urlStr = [navigationAction.request URL].absoluteString;
    //    if (jsNotId) {
    //        // 符合 js to native 的方法
    //        isRequest = NO;
    //        [self handleJSBridgeGetJsonStringForJsNotId:jsNotId];
    //    }else if ([urlStr hasPrefix:@"ios://"]) {
    //        // 特殊host拦截
    //        isRequest = NO;
    //        [self handleSpecialJSBridgeTask:urlStr];
    //    }
    if ([self.ArleneWebViewDelegate respondsToSelector:@selector(ArleneWebView:shouldStartLoadWithRequest:navigationType:)]) {
        isContinueRequest = [self.ArleneWebViewDelegate ArleneWebView:webView shouldStartLoadWithRequest:navigationAction.request navigationType:UIWebViewNavigationTypeOther];
    }
    if (isContinueRequest) {//允许
        decisionHandler(WKNavigationActionPolicyAllow);
    } else {//不允许跳转
        decisionHandler(WKNavigationActionPolicyCancel);
    }
}

2.页面开始请求

正式发送请求前的回调,无法拦截,可以在这个点注入一些自己的js

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    ALLOG(@"webView->didStartProvisionalNavigation:");
    [self importJS];
    if([self.ArleneWebViewDelegate respondsToSelector:@selector(ArleneWebViewDidStartLoad:)]){
        [self.ArleneWebViewDelegate ArleneWebViewDidStartLoad:webView];
    }
}

3.收到响应后决定是否跳转

- (void) webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
     ALLOG(@"webView->收到请求后 3 decidePolicyForNavigationResponse:");
    if ([navigationResponse.response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
        NSInteger statusCode =response.statusCode;
        NSString * urlStr = response.URL.absoluteString;
        ALLOGF(@"当前状态值:%ld;当前跳转地址:%@",statusCode,urlStr);
    }
   
    //允许跳转
    decisionHandler(WKNavigationResponsePolicyAllow);
    //不允许跳转
    //decisionHandler(WKNavigationResponsePolicyCancel);
}

4-1.加载完成

回调该函数未必就代表了成功

回调该函数未必就代表了成功

回调该函数未必就代表了成功

如果访问的页面服务器出错(返回500,400等非200的statusCode),这个方法也会被回调

//读取成功
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    ALLOG(@"webView->didFinishNavigation:");
    [self __ArleneWebViewDidFinishLoad];
    if([self.ArleneWebViewDelegate respondsToSelector:@selector(ArleneWebViewDidFinishLoad:)]){
        [self.ArleneWebViewDelegate ArleneWebViewDidFinishLoad:webView];
    }
    if([self.ArleneWebViewDelegate respondsToSelector:@selector(ArleneWebViewAllFinishLoad:)]){
        [self.ArleneWebViewDelegate ArleneWebViewAllFinishLoad:webView];
    }
}

4-2.加载失败

2种请求错误:

  1. 在“页面开始请求”后 “收到请求响应”前的错误

比如:地址非法,DNS解析地址有问题,本地网络问题

总之是还没有请求到服务器时候的错误,都会返回在这里

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation
      withError:(NSError *)error {
    ALLOG(@"webView->didFailProvisionalNavigation:");
    [self __ArleneWebView:webView didFailLoadWithError:error];
}

打印的日志

2020-06-04 14:09:33.416181+0800 ArleneiOS[7346:272402] -[ArleneWebView webView:decidePolicyForNavigationAction:decisionHandler:] [Line 551] webView->请求前 1 decidePolicyForNavigationAction:http://i.arlene.coms:3333/
2020-06-04 14:09:33.423342+0800 ArleneiOS[7346:272402] webView->开始请求页面 2 didStartProvisionalNavigation:
2020-06-04 14:09:37.021316+0800 ArleneiOS[7346:272402] webView->didFailProvisionalNavigation:
  1. 在请求页面过程中的错误

    服务器接收到请求,并开始返回数据给到客户端的过程中出现传输错误

    这个错误不是返回500,400等非200错误的回调

    这个错误不是返回500,400等非200错误的回调

    这个错误不是返回500,400等非200错误的回调

    重要的事情说三遍

    实际表现的错误可能是你传输过程中,断网了或者服务器down掉了导致的错误

//地址正确,返回的response有问题
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation
      withError:(NSError *)error {
    ALLOG(@"webView->didFailNavigation:");
    [self __ArleneWebView:webView didFailLoadWithError:error];
}

打印的日志

2020-06-04 14:06:10.950200+0800 ArleneiOS[7273:268811] -[ArleneWebView webView:decidePolicyForNavigationAction:decisionHandler:] [Line 551] webView->请求前 1 decidePolicyForNavigationAction:http://i.arlene.com:3333/
2020-06-04 14:06:10.956527+0800 ArleneiOS[7273:268811] webView->开始请求页面 2 didStartProvisionalNavigation:
2020-06-04 14:06:11.590449+0800 ArleneiOS[7273:268811] webView->收到请求后 3 decidePolicyForNavigationResponse:
2020-06-04 14:06:11.592887+0800 ArleneiOS[7273:268811] webView->内容开始返回 4 didCommitNavigation:
2020-06-04 14:06:48.776484+0800 ArleneiOS[7273:268811] webView->didFailNavigation:

5.安全验证/证书验证

对访问网站的证书做验证,并决定是否拦截

实际应用过程中由于涉及到第三方合作,所以基本采用全部放过+url白名单方式做控制

如果需要对证书做强校验,可以采用AFNetwork的认证证书方式做比对

// 如果需要证书验证,与使用AFN进行HTTPS证书验证是一样的
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *__nullable credential))completionHandler{
    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        NSURLCredential *card = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
        completionHandler(NSURLSessionAuthChallengeUseCredential,card);
    }
}

其它

不常用的说明如下

@protocol WKNavigationDelegate 
@optional
// 主机地址被重定向时调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation;
// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation;


//9.0才能使用,web内容处理中断时会触发
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);
@end

三、访问页面

请求方式

1.请求在线页面
//1.创建request
NSString* urlString = @"https://www.baidu.com";
NSURL* url=[NSURL URLWithString:urlString];
NSURLRequestCachePolicy cachePolicy = NSURLRequestUseProtocolCachePolicy;
NSURLRequest *request =[NSURLRequest requestWithURL:url
                          cachePolicy:cachePolicy
                           timeoutInterval:0];
//2.请求
[self.wkWebView loadRequest:request];

如果需要自定义header,可以采用NSMutableURLRequest,然后设置

[mutableRequest addValue:cid?:@"" forHTTPHeaderField:@"x-c-id"];
2.请求沙盒页面

请求本地沙盒里的页面,主要是拼对URL就行了

注意url的头部是“file:///”注意“斜杠”的数量是3个

或者直接使用

NSURL *fileURL = [NSURL fileURLWithPath:path];
NSURLRequest *request =[NSURLRequest requestWithURL:url cachePolicy:cachePolicy  timeoutInterval:0];

然后发起请求

[self.wkWebView loadFileURL:request.URL allowingReadAccessToURL:[request.URL URLByDeletingLastPathComponent]]

PS:我发现在iOS13+模拟器上,直接用loadRequest也可以访问本地沙盒,并没有权限问题,但是为了减少兼容问题,还是选择使用本地读取

3.请求内置包(bundle)页面

内置包就是bundle包,就是将bundle包路径拼接好,然后请求沙盒方式读取页面

自定义了一个url头部"bundle://",在请求的时候做"file:///"头部替换

4.加载源代码

直接把html文件读出来以后,以页面内容方式去读取

[self.wkWebView loadHTMLString:htmlString baseURL:nil];
5.离线资源包的一点思考

利用离线加载这一特性,我们可以通过服务端资源打包成本地资源包(zip包),通过服务器比对方式下载资源包,解压后放在本地指定的沙盒目录,随后通过wkwebview加载本地方式打开页面。

对于资源包要求

  1. 前后端分离(目前前端基本如此)
  2. 资源包加载需要相对路径,大部分在线资源都是通过cdn的,如何通过cdn去转换成资源包并打包进来,也是一个挑战,或者直接用cdn包也是可以的
  3. 要考虑降级策略,如果加载失败,资源包出现问题,如何快速替换最新资源包或者回滚。

缓存策略

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0, // 默认策略,具体的缓存逻辑和协议的声明有关,如果协议没有声明,不需要每次重新验证cache。
    NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地缓存,直接从后台请求数据
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // 忽略本地缓存数据、代理和其他中介的缓存,直接从后台请求数据
    NSURLRequestReturnCacheDataElseLoad = 2, // // 优先从本地拿数据,且忽略请求生命时长和过期时间。但是如果没有本地cache,则请求源数据
    NSURLRequestReturnCacheDataDontLoad = 3,  //只从本地拿数据 离线模式
    NSURLRequestReloadRevalidatingCacheData = 5, // 从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。
};
1.默认策略NSURLRequestUseProtocolCachePolicy

遵循web的缓存策略,简单介绍:

分为两种缓存

1.对比缓存 (服务器方式比对,304)

需要和服务器做一次比对,但是不会拿回所有数据,所以请求快且轻。

Etag / If-None-Match :返回Etag给到客户端,下次请求时header中将etag的值设置在If-None-Match 服务器做比对后客户端比较后,决策是否缓存

image-20200604163300511

Last-Modified / If-Modified-Since:原理类似上面,只不过是用时间的新旧来决策缓存

image-20200604163514314

2.强缓存 (本地缓存,200 from memory cache/from disk cache)

Expires(1.0产物,基本可以忽略) 第一次请求返回一个head,值是一个时间点,下次如果再请求相同资源,判断时间是否过期,如果未过期则命中缓存

Cache-Control,主要指定max-age={xxx sencods}

image-20200604164303844

2.NSURLRequestReloadIgnoringLocalCacheData

忽略所有缓存,建议本地加载可以采取这种方式,忽略缓存,因为缓存空间是有限的,不要影响真正需要缓存的页面

关于我

期待与要求上进的您进一步沟通
微信号:maako127
扫描下方二维码加入我的公众号(二码前端说),定期更新前端相关技术干货

icon_gongzhonghao

iOS 端容器之 WKWebView 那些事 本文主要是关于在端容器设计开发过程中,WKWebView 使用上遇到的一些问题和解决办法。 作者 | 驽良 来源 | 阿里技术公众号 一 背景 熟悉 iOS\macOS Hybrid 混合开发的同学应该都有体会,WKWebView 虽然是苹果作为替代 UIWebView\WebView 而推出的"新"组件,但大部分开发者对它实在“爱不起来”。毕竟对于国内大部分应用开发者来说,在实际使用中 WKWebView 所谓的“优势”未必能体现出来,但带来的“坑”却都着实都不浅。 目前社区或线上. 阅读详情

相关推荐

iOS17下WKWebView设置UserAgent的3种方法对比(附兼容旧版本技巧)

本文详细解析了iOS17下WKWebView设置UserAgent的三种核心方法,重点推荐使用稳定的customUserAgent属性进行实例级精准控制。通过对比分析各方法的优劣,并提供兼容iOS 9至17+的实战代码方案,帮助开发者实现UserAgent设置的平滑迁移与版本适配,确保网络请求识别的准确性与应用稳定性。

gray5的博客 1056

webView:decidePolicyForNavigationAction:request:frame:decisionListener

@implementation NSURLRequest (YLBIgnoreSSL) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host {     return YES; } @end

canlanyangg的博客 5763

WKWebView代理方法解析

今天看一下WKWebView的两个协议:WKNavigationDelegate 和 WKUIDelegate。 一、WKNavigationDelegate #pragma mark - WKWebView NavigationDelegate //WKNavigationDelegate - (void)webView:(WKWebView *)webView decidePolicy...

ZhongLv_HoneyMoon的博客 1430

WKWebView 加载生命周期与代理方法剖析

????????关注后回复“进群”,拉你进程序员交流群????????作者丨童红明来源丨百度App技术1. 前言从 WebView 开始加载一条请求,到页面完整呈现这一过程发生了什么?...

iOS_开发 2112

如何解决navigator.mediaDevices.getUserMedia兼容问题

/ 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口。// 调用用户媒体设备,访问摄像头、录音、console.log("访问用户媒体设备失败:", error.name, error.message);// 因为这样可能会覆盖已有的属性。// 否则,为老的navigator.getUserMedia方法包裹一个Promise。// 首先,如果有getUserMedia的话,就获得它。// 最新标准API、// 成功的回调函数。// 异常的回调函数。

刘杨造梦的博客 6375

STM32H743 ADC校准失败排查:HAL_ADCEx_Calibration_Start()的正确调用时机

本文深入剖析了STM32H743 ADC校准失败的核心原因,即错误地在ADC使能状态下调用HAL_ADCEx_Calibration_Start()函数,导致读数漂移。文章详细解释了校准必须在ADC禁用状态下进行的硬件原理,列举了典型错误场景,并提供了上电初始化与周期性重校准的正确代码实践,帮助开发者彻底解决ADC精度问题。

ik678901的博客 1177

iOS WKWebView 判断跳转链接是否是用户点击

我们通过原生是无法拿到判断状态是点击跳转还是主动reload,那我们就通过用JS监听点击事件的方式。

假装自己很用心的博客 2469

【C++】小猫钓鱼纸牌游戏--C++实现

小猫钓鱼问题: 描述:初始,两个人各有n张牌(牌面0-10),顺序固定,只能按顺序出牌。然后,两个人轮流在桌面上以接龙的方式出牌,当某个人放置的牌在桌面上已经出现时,他收起相同牌面及其中间的牌作为自己的筹码,同时需要再放一张牌到桌面。某人手上的牌出完后,另一个人继续出,直到两人手上都没牌为止,输出结束时两个人手上的筹码数。 #include<iostream> using namespace std; struct queue { int head; //队列首 int tail; //

qq_41344430的博客 3202

在hb中html怎么插图片,WKWebView加载HTML文本(图片自适应)

NSString * htmlsTr = @"哦吧你不会比谁都不休的白色修身才能完呢冲破恩微博撇那狗骗你我饿够了呢比你耳边n伪军抹去你问邪恶热敷已成为8哦鳄鱼从背后有我饿去年细纹卡马乔全部下次去把握和刺猬比欧巴";NSString * urlStr1 = [NSString stringWithFormat:@"%@",htmlsTr];[self.webView loadHTMLString:u...

weixin_39981400的博客 800

图神经网络实战(6)——使用PyTorch构建图神经网络

图数据集通常比简单的连接集合更加丰富,因为节点和边可以具有表示分数、颜色、单词等特征。包含这些额外信息在输入数据中对于生成最佳嵌入至关重要。在本节中,我们将使用 Cora 和 Facebook Page-Page 数据集,首先将它们视为表格数据集,观察香草神经网络在节点特征上的表现如何。然后,尝试在神经网络中加入拓扑信息,实现图神经网络 (Graph Neural Networks, GNN) 架构:一个同时考虑节点特征和边的简单模型。最后,我们将比较两种架构的性能。

盼小辉丶的博客 2万+

手把手教你学AI GPU UMD驱动软件开发专栏--1.1 UMD(用户模式驱动)的定义与定位

摘要:UMD(用户模式驱动)是GPU驱动架构中的关键组件,负责连接AI应用与硬件。作为运行在用户空间的动态链接库,UMD通过减少系统调用开销显著提升AI计算性能。其核心功能包括API转换、资源管理和命令生成,同时具备安全性高(崩溃不影响系统)、开发灵活等优势。随着AI发展,UMD已从图形驱动演变为深度学习加速的关键组件,支持TensorCore等硬件特性优化。未来趋势包括深度框架集成、硬件感知增强和虚拟化支持。UMD通过性能优化和安全隔离机制,成为现代AI计算基础设施的理想选择。

MHD0815的博客 170

适配IOS13

1. 暗黑模式 iOS13更新后外观增加了一个浅色和深色设置一般默认为浅色,但是如果设置外观为深色的时候会IOS13系统的机型会出现很多UI界面变成暗黑色。适配暗黑模式的工作量较大,改为强制使用正常模式。 处理方案:在info.plist文件中增加配置项UIUserInterfaceStyle,值为Light。 2.状态栏样式 在iOS13之前有两种状态:UIStatusBarStyleD...

Jing921225的博客 579

激光雷达的64线,32线,16线,你弄懂了吗?

激光雷达的 64 线、32 线、16 线是指激光雷达系统中能够同时发射和接收激光脉冲的激光线的数量5。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 2637

2021-08-30

iOS12适配及问题记录 版本信息 Xcode: Version 10.0 beta (10L176w) macOS: 10.14 Beta (18A293u) iOS: 12.0(16A5288q) 问题及解决过程 1,StatusBar内部结构改变 现象:crash crash log: -[_UIStatusBarIdentifier isEqualToString:]: unrecognized selector sent to instance 0x283452820 *** Termin

feelinghappy的专栏 415

Fabric V2.5 通用溯源系统——使用Hyperledger Caliper压力测试

Caliper是一款测试区块链性能的工具,支持Hyperledger Fabric、Ethereum等,支持丰富的测试配置参数,测试完成后将直接输出报告,相较于tape更加专业,但是配置稍微有些复杂。本文将一步一步配置Caliper以测试Fabric V2.5 通用溯源系统中的注册用户、查询用户、农产品上链、农产品查询的区块链性能。

TrueTechLabs 官方博客 1395

【Bug已解决】claude: command not found 解决方案

方案适用场景推荐指数添加 PATH全局 bin 目录确实存在但未加入 PATH⭐⭐⭐⭐⭐nvm 重新安装多 Node 版本切换导致失效⭐⭐⭐⭐⭐Windows 环境变量检查Windows 平台专用⭐⭐⭐⭐原生安装脚本想彻底避开 npm PATH 问题⭐⭐⭐⭐清理多重 Node 安装系统里有多套 Node 管理方式冲突⭐⭐⭐报错的核心是npm 全局安装的可执行文件路径没有正确出现在系统的 PATH 环境变量里,而不是安装本身失败了。

一键难忘的博客 1万+

微信iOS WKWebview 网页开发适配指南

微信iOS客户端将于2017年3月1日前逐步升级为WKWebview内核,需要网页开发者提前做好网站的兼容检查和适配。 背景WKWebView 是苹果在iOS 8中引入的新组件,目的是提供一个现代的支持最新Webkit功能的网页浏览控件,摆脱过去 UIWebView的老、旧、笨,特别是内存占用量巨大的问题。它使用与Safari中一样的Nitro JavaScript引擎,大大提高了页面js执行速度

timtian008的博客 5312

生成模型实战 | StyleGAN详解与实现

StyleGAN 能够生成非常高分辨率人脸图像的关键在于,在增加分辨率的步骤中逐步增加生成网络和判别网络的复杂性,以便在每一步中,两个模型都可以很好地完成任务。我们学习了如何通过确保每个分辨率的特征由一个独立的输入(称为风格向量)来控制,从而操纵生成图像的风格,以及如何通过将图像之间的风格进行交换来操作不同图像的风格。

盼小辉丶的博客 7604

iOS WKWebView交互实现及iOS13以上, iOS11以下适配

笔者性懒,腹中无墨. 以下简单列出WKWebView的使用及注意事项. 初始化webview及事件监听 fileprivate lazy var webView: WKWebView = { let webConfiguration = WKWebViewConfiguration() webConfiguration.preferences = WKP...

daozhishier的博客 1971

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

iOS WKWebView适配(实战篇)

一、Cookie适配 1.现状 WKWebView适配中最麻烦的就是cookie同步问题 WKWebView采用了独立存储控件,因此和以往的UIWebView并不互通 虽然iOS11以后,iOS开放了WKHTTPCookieStore让开发者去同步,但是还是需要考虑低版本的 同步问题,本章节从各个角度切入考虑cookie同步问题 2.同步cookie(NSHTTPCookieStorage->WKHTTPCookieStore) iOS11+ 可以直接使用WKHTTPCookieStore遍历方式设值

1990

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

iOS WKWebView的使用--API篇

WKWebView是苹果在iOS 8之后推出的框架WebKit中的浏览器控件, 其加载速度比UIWebView快了许多, 但内存占用率却下降很多, 也解决了加载网页时的内存泄露问题. 现在的项目大多数只需适配到iOS 8, 所以用WKWebView来替换项目中的UIWebView是很有必要的. WKWebView的使用主要涉及下面几个类: WKWebView WKWebViewConfiguration WKUserScript WKUserContentController WKWebsiteDataS

假装你是大灰狼的专栏 2563

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

wkwebview的适配问题

1、微信iOS客户端将于2017年3月1日前逐步升级为WKWebview内核,需要网页开发者提前做好网站的兼容检查和适配; 2、iOS微信6.5.3版本开始支持开发者手动切换WKWebview和UIWebview,使开发者可提前对WKWebview进行适配。切换的方法在微信“添加朋友”中输入...

chuyuan6518的博客 464

iOS WKWebView JS 与 原生交互

一些说明: 在iOS开发中难免会用到网页,在iOS 8以前,我们更喜欢使用UIWebView,但是UIWebView有很多弊端,首先它有一个最让人头疼的问题就是内存会暴增,并且释放不掉,而且苹果开放出来的接口相对较少,目前用Xcode 9进行iOS开发,其支持最低的系统版本号为iOS 9.0,目前所在的公司也并没有要求对iOS 8.0以前版本进行适配于是,在新的项目中打算摒弃UIWebView而采...

u598975767的专栏 1569

iOS开发之WKWebView代替UIWebView

Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等。因此,我们公司的应用也打算淘汰IOS7。 支持到IOS8,第一个要改的自然是用WKWebView替换原来的UIWebView。WKWebView有很多明显优势:1,更多的支持HTML5的特性2,官方宣称的高达60fps的滚动刷新率以及内置手势3,将UIW

CuiAnkly的博客 1733

iOS oc与js交互详解 之 WKWebView

Xcode8发布以后,编译器开始不支持iOS7,所以很多应用在适配iOS10之后都不在适配iOS7了,其中包括了很多大公司,网易新闻,滴滴出行等。 支持到iOS8,第一个要改的自然是用WKWebView替换原来的UIWebView。WKWebView有很多明显优势: 1、更多的支持HTML5的特性 2、官方宣称的高达60fps的滚动刷新率以及内置手势 3、...

1960
上一篇: shell打包ios程序
下一篇: iOS WKWebView适配(实战篇)
JerryVon
博客等级 码龄15年 125粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值