曲折的“修改 AttributeText 的文字”尝试

需求

在商品列表的设计中,很多商品卡片的商品名称需要换行。效果如,商品图 如“耐穿又耐看, 男式基础休闲牛津纺衬衫”, 用 UILabel 实现。但样式不能用以下代码来实现,

这个春天的口罩故事 策划稿

主题

严选利用自身的资源,紧急上线口罩,支持全国人民的抗击疫情

故事框架

自1月22日疫情大爆发,技术部门和兄弟部门同事,放弃春节假期重新回到工作岗位,协调资源,加班加点为全国(包括湖北专供)第一时间提供珍贵的口罩的故事。

如何 HotReload Objective C 代码——用 SwiftUI

原文发表于:2020.01.07 @ 简书

SwiftUI 和 Xcode 11

自从 SwiftUI 推出之后,它带来左边代码右边实时预览的特性,让一直苦于 Objective-C 耗时、低效、繁琐的开发流程的我很羡慕。但是 SwiftUI 需要 Swift 工程运行在 iOS 13 的 target 上才能使用。目前国内大部分的 App 基本都是 Objective-C,最低支持 iOS 9 版本的现状,阻止进一步将 SwiftUI 引入到实际工程里。

直到最近重温 WWDC2019 Mastering Xcode Previews,其中有一句

Finally, you have seen how to use previews not just with SwiftUI and not just with Swift, but with all of the source files that Xcode understands written against UIKit, AppKit, and WatchKit.

让我有了个想法——既然 Xcode 认识 Objective-c,那是不是也支持 Objective-c 的预览?接下来,我在使用Xcode Preview for Objective-C等关键字 Google 了一番,居然没找到类似的方案,有点怀疑是不是搜索姿势不对?

在经过一些尝试,有一些初步的成果,B 站视频演示 使用 Xcode Preview 实现普通的 UIView 的 HotReload。 下面以复盘的方式来介绍下实现的过程。

iOS 13 darkmode 适配的动态颜色 cheatsheet

深色模式,作为 iOS 13 最大的新特性,从设计者角度,带来设计体系、颜色、材质、系统控件、SF Symbols 等若干方面的新的变化;对于开发者来讲,我们熟知的适配;
– 屏幕尺寸
– 屏幕方向
– View 渲染阶段(指 viewDidLoad 和 viewDidAppear 两个阶段,view 的尺寸是变化的)
– iOS SDK 适配

等适配维度,而后又多了一个维度,
– 外观模式(dark or light)

SwiftUI: 苹果的一次天才尝试

时间回到一个月前的 WWDC 19 现场,当苹果宣布推出 SwiftUI 时,所有观众为其优雅的语法、 强大的实时预览 preview特性而欢呼雀跃,在发布之后几天,各路人马推入巨大的热情,研究 SwiftUI DSL 语言设计、Swift5.1 的新特性、 Combine 库的使用方法,产出了很多的文章。熟悉 Swift 语言的会从 Swift 演进的角度对新特性的来由、场景用法等深度解析;熟稔动画的作者,则用 SwiftUI 用极简的代码玩出酷炫的效果;以前玩 reactive-cocoa 类型开发模式的大佬,则对 Combine 库做了深入的探讨。

作者对 Swift 语言是新手、水平有限,这篇文章不会深入的讨论 Swift 语法特性和 Combine 的使用及实现原理。而是分享在这几星期期间,一边学习其他人的文章,一遍使用 SwiftUI 构建网易严选的 iPad 版本 —— YanxuanHD(源码见参考链接)过程中思考和感悟。从最初的惊喜到迷茫、再到困惑直到若有所得,拙作在这里抛砖引玉。

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

背景

讨论 WKWebview 在加载 h5 页面时,Objective-C里的 WKNavigationDelegate、window.performance.timing、WKUserScriptInjectionTimeAtDocumentStart、WKUserScriptInjectionTimeAtDocumentEnd,以及和前端最常用的document.readystate\domContentLoaded\document.onload 事件等时间维度的关系,为native和前端在相互调用时,能够明确沟通的时机。

探索 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 GB 2133 MHz LPDDR3,3.1 GHz Intel Core i5
  3. 测试流程。启动 App,将 Xcode 切换到 Debug Navigation,观察内存消耗;同时打开 Safari 开发者工具,切换到 Timing tab 里,观察内存的占用情况

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

1. 问题

在 AppHost.framework【注1】(以下简称 AppHost) 的编码中,需要处理很多预先导入到 webview 里的 js 文件,有一些不关键功能是用 .js 的文件读到内存的,还有一些比较短小的 js 源码,如;

1
2
3
4
          (function(e){
                e.setAttribute('src','%@');
                document.getElementsByTagName('body')[0].appendChild(e);
            })(document.createElement('script'));

要写到代码里和 objc 代码一起。还有,在 AppHost 里,有个 ah_doc 模块,在编写注释时,需要输出完整的 js 代码,如

1
2
3
4
5
6
7
8
window.appHost.invoke('startNewPage', { 'url': 'http://you.163.com/','title': 'title',
    'type': "push",
    'backPageParameter': {
        'url': 'http://qian.163.com',
        'title': 'title',
        'type': 'push'
    }
})

这个字符串里包含了大量的单引号、双引号,而且为了保持可读性、维护性,需要多行输出。

这是非常典型的问题,传统的多行字符串声明有没有方法很好的解决?