與天鬥與地鬥與人鬥其樂無窮
Jan 4
最近网络上有这么一个帖子:https://www.da.vidbuchanan.co.uk/widgets/pngdiff/。其中展示了一张图片,下半部分在苹果的系统与其他系统上展示不一致,其中的讨论使用苹果系统(包括iOS/OS X)设计的一种私有png chunk即iDOT,在mac上通过系统截屏截取的png就可以看到这个chunk。

目前网络上能搜到关于iDOT的描述,都是以截图的这种png为基准,分析出png分为两段的情况下,双线程解析png是iDOT是如何描述的(https://www.hackerfactor.com/blog/index.php?/archives/895-Connecting-the-iDOTs.html),不过其中还包含大量不准确(unknown)的字段,并且也不清晰如何描述分为两段以上即开启更多线程解析的方式。因此本次笔者经过逆向分析,得到了准确的多线程iDOT数据结构与全部字段含义,与一部分苹果的png decoder的iDOT校验逻辑,希望对后续该格式利用有所帮助。
Dec 21
在讨论js容器桥注入方案时,不可避免的会聊到react-native所搭建的JavascriptInterface(这是RN自己造的词,不过本文用JSI指代相同类型的方案)。JSI类方案一般确实不会有人提,核心原因是——除了RN,几乎没有什么方案是直接使用JSCore进行js执行的,而是通过Webview进行的h5页面执行,而对于webview来说,是无法直接拿到jscore的(严格来说只有iOS的UIWebview能拿到jscore,但是已经被淘汰了),
Dec 13
上次讨论Webview同步桥落地方案(https://lrdcq.com/me/read.php/151.htm)时,核心寻找了在js中表现为同步,但是实际为异步的方案,其中同步xhr这个特性(https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests)虽然在部分浏览器中会显示deprecated,但是并没有被ban掉,因此完全可以使用该特性在普通web中完成阻塞式API调用。这里尝试用该方案封装一个sleep函数,既不是for循环算时间这样消耗算力的sleep,也不是await这样的假同步sleep了。
Dec 12
在做Web容器方式时,业界目前一般采用的方案都是WebViewJavaScriptBridge拓展于Android/iOS上的实现。原理是基于iframe url request或者webkit.messageHandlers/Android JavascriptInterface进行js->native通信,evalJavascript的native->js通信,并相互维护call queue来保持对外一致。显然这个实现方案暴露的Bridge API必须是异步的,可以抽象为
callAPI(apiName: string, param: array, callback: function(result: any): void): void;

但是实际开发过程中异步bridge还是有不便之处,如storage / environmentinfo这类的桥,同步桥还是更方便易用。
Nov 29
就在前几天11月20号周六,笔者朋友在阿里所在的某部门在重庆建设阿里homearch线下实体店开张了,各个渠道大肆宣传homearch全国首店试营业了的同时,也别忘了,这是阿里在软装零售与家居领域toC门店数字化的一个里程碑。

实体门店数字化往往分为两部分,一部分是用户体验数字化即用户在店内的体验科技化,toC;另一部分是店内操作数字化如促单下单过程,这部分toB。当然这两部分是有大量交集结合在一起完成实体门店数字化的落地与实际用户实体购物体验的保障。
Nov 20
一般我们说web页面解析特别是其中的js执行是“单线程”的,并且这是js这门语言的特点。本身确实没什么,但是实际项目实践中,特别是目前重js的spa大行其道的今天,界面中绝大部分的运行时卡顿,如滚动掉帧,事件响应延迟,均是js卡顿引起的。比较常见的卡顿常见如大量json序列化反序列化,对象deepcopy,界面diff刷新不收敛,总之代码稍微写得烂了一点页面性能就不堪入目,更别说编写大型项目如动画/3d内项目时大量货真价实的运输拖慢帧率了。
Oct 24
在iOS的学习过程中,我们总会聊到“离屏渲染”,在百度上能搜到的关于离屏渲染的描述都是
什么是离屏渲染. 离屏渲染(offscreen-rendering)顾名思义为屏幕外的渲染,即渲染的结果不会直接呈现到当前屏幕上,而是等待合适的时机才会被显示。
但是每次我问到候选人为什么UIKit会在这种情况下发生离屏渲染,极限是什么,根因是什么,可以避免么这样的问题时,大概率得不到方向正确的答案。毕竟是猜测UIKit的渲染行为,不像是安卓苹果的全闭源策略当然给开发者带来了理解困难。

当然也不全是,通过理解一个自然的GUI框架包含内容/搭建方案,结合苹果提供给我们的已知工具,我们应该可以分析出UIKit离屏渲染的逻辑与基础界面合成行为到底怎么回事。同时也可以通过苹果公开的一些文档进行验证。
Oct 2
CALayer的filters属性能为Layer渲染时添加CoreImage滤镜来做特殊效果。然而因为某些原因,根据苹果文档https://developer.apple.com/documentation/quartzcore/calayer/1410901-filters
Special Considerations
This property is not supported on layers in iOS.
这个功能在iOS上是无法使用的。而在OS X上看起来则是能够轻易的使用:
點擊在新視窗中瀏覽此圖片