WKWebview 加载过程中的性能指标图解

背景 讨论 WKWebview 在加载 h5 页面时,Objective-C里的 WKNavigationDelegate、window.performance.timing、WKUserScriptInjectionTimeAtDocumentStart、WKUserScriptInjectionTimeAtDocumentEnd,以及和前端最常用的document.readystate\domContentLoaded\document.onload 事件等时间维度的关系,为native和前端在相互调用时,能够明确沟通的时机。 图解 普通的200请求,注意先看图例 本次数据采集的页面是 https://mp.weixin.qq.com/s/X_WDv1-vqdXYcg0eLpMAhA, ​ ​ 带有302跳转的页面 ​ ​ 本次数据采集的页面是 https://lq.163.com/platform/wap/entry?merchantCode=M32412338855&before_login=1 请求出错时的序列 本次数据采集的页面是 https://hite.me,出错原因是因为证书不正确。 ​ ​ 对比,结论 1. 首先注意几个等价事件。 didStartProvisionalNavigation = navigationStart didCommitNavigation = domLoading  =  WKUserScriptInjectionTimeAtDocumentStart,此时刚刚开始创建 DOM WKUserScriptInjectionTimeAtDocumentEnd = domContentLoade = document.readystate = interactive,此时 CSSOM 和 DOM 都已经构建完毕,等待图片资源等下载 didFinishNavigation = domComplete = […]

Read more

探索 messageHandler 的传输性能极限

本次测试的目标是 iOS 8+ 之后提供的 WKWebview 提供的 JS 和 Native 通讯机制之 messageHandler,比较浅显的探索下它各方面的极限。 测试 Demo ##主要的测试场景包括 1. messageHandler 可传输的数据类型有哪些? 2. 以字符串为例,messageHandler 最多可传输多少字节? 3. 承接 2,在不同量级下的传输效果(是否丢失、速度等)如何? 4. 如果是 native 向 WKWebview 传输数据,是否有类似的表现? 5. 探索使用 messageHandler 的最佳方法。 ##测试方法 1. 测试设备,iPhone XR 模拟器,Xcode 10.2 2. 硬件,MacBook Pro (13-inch, 2016),Mem 16 […]

Read more

objc 中最好的多行字符串声明方式

1. 问题 在 AppHost.framework【注1】(以下简称 AppHost) 的编码中,需要处理很多预先导入到 webview 里的 js 文件,有一些不关键功能是用 .js 的文件读到内存的,还有一些比较短小的 js 源码,如; (function(e){ e.setAttribute(‘src’,’%@’); document.getElementsByTagName(‘body’)[0].appendChild(e); })(document.createElement(‘script’)); 要写到代码里和 objc 代码一起。还有,在 AppHost 里,有个 ah_doc 模块,在编写注释时,需要输出完整的 js 代码,如 window.appHost.invoke(‘startNewPage’, { ‘url’: ‘http://you.163.com/’,’title’: ‘title’, ‘type’: “push”, ‘backPageParameter’: { ‘url’: ‘http://qian.163.com’, ‘title’: ‘title’, ‘type’: ‘push’ } }) 这个字符串里包含了大量的单引号、双引号,而且为了保持可读性、维护性,需要多行输出。 […]

Read more

记一次独自带小宝宝

今天是妈妈的生日,她和其他的兄弟 3 个人去看《风中有朵雨做的云》电影,晚上 9 点到 11 点就是我和宝宝两个人了,丈母娘他们在楼下,也有自己的事情,想想自己配宝宝逗他玩,应该不是问题,所以给他们买好票,到 8 点半了,还送他们上车。 在临走之前,我还告诉老婆,让宝宝自己先吃好奶,这样就不用怕她一会需要吃奶,然后吃不到,哇哇哇的哭。 没想到我还是想的太简单了。 刚刚开始的时候我陪她在床上玩她的玩具,她对当当当响的东西,其实不是很喜欢,我自己扮成小狗,假装去咬东西,她就咯咯笑。或者冲过来,爬到我的肚子上,要去拿我在床边的电脑。玩一会,腻味了,我就抱着她玩 Animoji。 她现在已经学习到模仿和反馈了,对着小熊吐舌头。吐舌头是我自己玩 Animoji 时候她观察到的,来看看视频,差点笑死我了。 宝宝的 Animoji 然后接着和她玩耍,挤挤乐,她会拿着和床头板敲敲压压。她一会就不希望玩了,这时候,我又拿着饼干和水喂她。 其实这些我的哄娃 3 板斧就已经弄完了,这时候她好像有点困了,好好的坐着,突然自己就到后面去了,头一下子就碰到背靠上,喯的一声,也许自己困了,也顾不上哭了。 我抱着她,她头靠在我的肩膀,眼睛是闭上了,但是嘴里,嗷嗷嗷的,是不是发出哭死。因为平时都是困了,吃妈妈的奶睡过去,这时候,吃不到奶。我抱着她在屋子里绕圈,也没有用,去屋子外面走一的时候,外面有点冷,她没睡意了,是不哭了。 我试图把屋子里的灯都关了,让她慢慢睡着,还没等我把她放到床上,她自己感觉到自己要被放到床上了,两只手使劲的抓着我的衣服,一点也不放手。只好自己再抱起来。一看时间,电影才过了半小时~ 把灯打开,我和她一起吃华夫饼,她并不想吃饼干,看着我吃,自己手里拿着塑料壳子,也不捏,也不想吃,就呆呆哒,还好不哭。 我看她又开始揉眼睛了,睡意更弄了,我再次尝试斜着抱她看她会不会像去外面逛街那样睡着。结果还是没有失败了。 想想平时她和妈妈一起,虽然妈妈喂她奶的时候,还在看手机,但是她会很快就睡着,哄宝宝睡着,对妈妈来说其实是个很简单的时候。相同的工作,对于一个爸爸却并不简单。 还是抱着还是嗷嗷的哭,底下丈母娘在睡觉的,估计都被吵醒了。我手累了,把宝宝放在床上,她这是有点安静,我正要给她盖被子,我发现有个大苍蝇,在床头灯那里绕啊绕,我本能的去打苍蝇,发现宝宝在那嘎嘎嘎的笑,我正好故意做造型,故意去打苍蝇,她突然给我吸引住了,不哭了。 等我实在有点手酸了,去趴过去和她说话,没想到哇哇的哭起来了,再次抱起来,还是哭,不管是开灯关灯,就是哭,眼睛大部分时间是闭着的,就是想睡差了点喝奶,始终无法入睡。 底下老妈给老婆打了电话,狠狠的批评了她,让她回家,她说还要半小时。老妈上楼,自己尝试抱起来,哄睡,用她很久之前的方式,其实已经完全没有效果了,宝宝的身体弓成一个 反 C,还是哭成泪人,无奈我告诉她,她看我打苍蝇不哭。 所以到后面变成两个人,在玄关那里对着彩灯,挥着苍蝇拍,老妈是远视眼,看不清懂着的苍蝇,我自己一手抱娃一手拿苍蝇拍,乱打,这时候她才咯咯咯的笑起来了。 老妈拿着苍蝇拍也开始了她的表演,这时候宝宝也安静下来了。 我拿出来 iPad,她最喜欢按 home 键,她坐在我的腿上,我就问 Siri,天气怎么样啊? 我漂不漂亮啊? 明天我需要打伞吗? 。。。 这类的问题,反复问,问着问着宝宝安静了,不久宝宝睡着了, 一看时间10.55 也是妈妈们他们看完电影的时候。 […]

Read more

关于TapGesture、UIResponder 链和 target-action 事件的相互影响的机理和应用

https://github.com/hite/IOSEventTest 这是一个供探索、验证、对比测试而精心设计的demo。 用来研究 UIControl,普通的 View 在 使用 target-action, addTapGestureRecognizer 方式时,不同情况下如何相互作用。 试图解答以下问题; 1. 第一响应者如何确认?(包括 alpha,hidden,clipToBound 属性的影响,都不是本次试验的重点) 2. target-action 和 tapGesture 混用时,如何表现,加入变量 cancelsTouchesInView 时,是否有不同? 3. target-action 或者 tapGesture 是否各自都有多个? 1. 包括相同类型 event state 和 gesture Type 是否有多个? 2. 包括不同类型 event state 和 gesture Type 是否有多个? 4. 相同和不同类型 […]

Read more

WKWebview 加载过程中的性能指标图解

背景 讨论 WKWebview 在加载 h5 页面时,Objective-C里的 WKNavigationDelegate、window.performance.timing、WKUserScriptInjectionTimeAtDocumentStart、WKUserScriptInjectionTimeAtDocumentEnd,以及和前端最常用的document.readystate\domContentLoaded\document.onload 事件等时间维度的关系,为native和前端在相互调用时,能够明确沟通的时机。 图解 普通的200请求,注意先看图例 本次数据采集的页面是 https://mp.weixin.qq.com/s/X_WDv1-vqdXYcg0eLpMAhA, ​ ​ 带有302跳转的页面 ​ ​ 本次数据采集的页面是 https://lq.163.com/platform/wap/entry?merchantCode=M32412338855&before_login=1 请求出错时的序列 本次数据采集的页面是 https://hite.me,出错原因是因为证书不正确。 ​ ​ 对比,结论 1. 首先注意几个等价事件。 didStartProvisionalNavigation = navigationStart didCommitNavigation = domLoading  =  WKUserScriptInjectionTimeAtDocumentStart,此时刚刚开始创建 DOM WKUserScriptInjectionTimeAtDocumentEnd = domContentLoade = document.readystate = interactive,此时 CSSOM 和 DOM 都已经构建完毕,等待图片资源等下载 didFinishNavigation = domComplete = […]

Read more

关于是否有必要学习少儿编程的观点

没有必要。 编程目前是一种职业,在不久将来,它将成为一种日常的技能,我们生活实用的电器、设施都是由编程来控制的。但是是不是都必须要去学编程呢?这些设施和电器等他们的目的是让人类的生活更加便利,所以只需要一部分让使用编程的技巧,让剩余的人能够不需要参与编程,就能使用,这才是基础设置和电器的存在的意义。 只需要一些人来做设施和电器 与 大部分人的中介,这些中介就是懂编程的人。 打的类比,以后的会变成就是现在的会开手动挡的汽车,并不是所有人都需要学开手动挡,到一定程度,开车会进化到你只需要学会刹车、油门就可以了,不需要复杂的加减档离合器。而且目前已经有自动驾驶和专车司机、出租车司机、滴滴司机等职业司机,以后出门不需要你懂驾驶技术,你应该利用节省下来的精力去干别的事情。 少儿编程,不仅是强迫儿童去立即大人对编码世界的设计、使用方式,而且学到的东西,当社会发展和自身成长之后,获得的收益也是极其少的。不久的将来,编程已经不需要写代码了,你只需要说出你的需求,程序自动生成了。这不是科幻,微软公司已经有雏形出现了。 总结:少儿编程对儿童而言太早;编程在不久的将来将极大的简化,根本不需要学习。

Read more

兰州:一个有希望的城市

因为家人生病的原因,从杭州到兰州看他,时隔10年再次踏上了这块土地,这块新面孔里留着老样子的地方,与其说勾起了我的回忆,不如说对这些年来他的变化,感到十分的高兴。这几天来看到的人事、城市建设、旧地故友的变迁,在不动声色中,发生着的变化。 下了飞机,我这十年前留下的冻疮的脚,里面被自己的鞋子挤压的厉害。这个病就像骑车这样的技巧,已经变成了一种本能,不管过了多久,到了兰州这个气候了,依然找到我,这些是一直没变的,而变化的方面却在很多的地方。 首先是城市建设。兰大二院附近正在修地铁,这个区域非常繁华,聚聚了众多的商超,还有张掖路步行街。步行街是在翠英路和临夏路之间,没有车流,商业形态发展的很有层次感,甚至在两条街中间还有一些类似快闪的促销店,当时我看到的就是 OPPO 在弄,人很多。 在西关十字这里,有非常大的一个清真寺,想想回族人民为兰州这个城市作出的共享,这个清真寺像钉子户一样妨碍了更优化的城市建设也可以理解。 在清真寺的旁边就是公交总站,多年不见,这里上公交车大家排队的热情和规矩感让我很惊讶——在杭州要让大家排队上公交车是要靠线隔断起来的,在兰州大家是没有线围起来的,精神文明面貌有进步。当然公交车和人在斑马线上挣着通过的现象一直有;和杭州礼让行人相比,虽然样子不好看,但是通行效率是很高的。 和其他人流大的地点一样,街边都会有很多小摊贩,买吃的或者是便利店,在兰大二院附近的路边上,每天早上6 点多会有临时的早餐铺,不像我在杭州的路边小摊,这里的小摊有卫生许可证,有自己的地点,早点一过,这些小摊就消失了。而小摊的付款方式,也进化到了移动支付。和杭州不同,这边最流行的支付方式是微信。在三线城市里,微信支付带给整个经济社会的润滑剂贡献很大,即使移动支付的天地是由支付宝打下来的。 说到移动支付,兰大二院的食堂也是优先使用移动支付,其次接受现金支付,也是过渡时间最好的方式。‘ 其次是人的变化,城市化。在医院里看病的,基本上都是来自甘肃各地的病人,所以在小圈子里,各自说着自己的方言,但是彼此交流的时候,就是用自己带浓厚口音的普通话。这种自然而然的交流感,让整个社会协作更容易发生,融入甘肃返回的协作,也意味着更容易冗余全国。 其次是兰大综合楼的电梯运行方案很高效,相比其它医院那种分奇偶层,分医用电梯和普通电梯外,还分了一种跨层设置。举例,综合楼没有到 10 楼的电梯,你需要 从 9楼或者 11 楼,强迫你走楼梯。 电梯的问题和监护室家属没有地方休息的问题,我还给他们医院写了建议书,可惜没有拍照留念,因为赶着去飞机。 每天的饭,就在各种面食里切换,兰州拉面对面食的开发非常有历史。味道好,百吃不厌,除了面食的研究外,很多面店对就餐的环境方面也有自己的尝试,所以你想吃面,有很多不同的地方来满足你请客、聊天、充饥等各种场景。我在离开兰州的前一天晚上,我还特意去吃了陇南搅团王店,他们除了自己招牌的搅团,还有自己开发的野菜,一共有 4 种,我吃了一种,非常好吃。 兰州的房地产,在华润超市里看到过华润的宣传册,其他开发商的宣传活动不多。在市区和飞机场之间来回的路上,看到了兰州新城和西部恐龙世界这样,受限于规划而产生的区域,说不上的感情,既感觉为他们的开荒精神感动,也为目前的荒凉而可惜。不管后续的发展如何,敢于开拓,改变就是有希望—— 祝愿兰州新城越来越好。 另外,我在去坐大巴车的地方,还看到了“纸中城邦”,我上大学时候就存在的书店,我超级喜欢他的名字,真的在幻想有一天,我能拥有这个书店让他持续的发展下去。 短短几天,现在兰州给我的惊喜超出我的预期,一边为此而高兴的同时,也为我自己没再甘肃,没在家乡出一份力而惭愧,家乡的发展没有自己的共享。 只期望有一天能有出息,反哺回来。 完!

Read more