老司机 iOS 周报,只为你呈现有价值的信息。
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
本周在周报公众号上我们推送了 2 篇 WWDC20 内参专栏内的文章,每篇都很精彩!
UICollectionView 进阶使用
探索 Swift 中的日志系统
@Parsifal:继 3 月底发布 Swift 5.2 后,Swift 5.3 终于也官宣发布了~苹果继续围绕编码体验、Swift 运行时性能和更多平台支持进行改善和优化。小集团队也为我们翻译了官方的更新概要 - 一图读懂 Swift 5.3,下载更新 Xcode 12 即可体验 Swift 5.3。
@Parsifal:随着 iOS 14 的发布,以及正在路上的 macOS Big Sur,苹果对 App Store 审核指南也进行了一波更新。Apple Hub 做了中文翻译,不过建议大家还是以官方为主,译文为辅 - 苹果更新 App Store 审核指南,可以给苹果爸爸的审核条款提建议了。
@享耳先森:这个系列的文章来自于今年愚人节的一个项目,作者让 Mac OS 9 支持运行 Swift 程序,其中 Swift Runtime 没有将 C++ 的实现迁移过来,而是使用 Swift 实现了一套,文章里就分享了具体的实现细节,包含了大量的 Swift 指针操作技巧。
通过阅读系列文章,你应该对 Swift Runtime 会有更深的理解,推荐阅读。https://belkadan.com/blog/2020/08/Swift-Runtime-Heap-Objects/ https://belkadan.com/blog/2020/09/Swift-Runtime-Type-Layout/ https://belkadan.com/blog/2020/09/Swift-Runtime-Type-Metadata/
作者 Jordan Rose 之前是 Swift 团队的一员,负责 bugs.swift.org 相关的工作,在去年离职。
@Damien:本文从 Mach-O 的概念出发,深度解析了 Mach-O 的内部结构以及加载 Mach-O 的步骤,最后作者也给出了通过分析 Mach-O 之后可以应用的使用场景,对于想理解 iOS 系统底层实现原理的同学是个很好的文章。
@CrazyCoderShi: Flutter 作为一种全新的响应式、跨平台、高性能的移动开发框架,在性能、稳定性和多端体验一致上都有着较好的表现。引入 Flutter 带来的包体积问题,一直以来都是个热门话题,本文详细 讲述了美团在处理 Flutter 包体积问题上的思考及相关的建设。
@JonyFang:本篇总结了头条详情页(WebView)加载优化的思路和实践。内容总结如下:
数据建立
确定优化效果的度量为:页面加载时间
白屏检测方案:WebView 快照 -> 缩放 -> 非白色像素点检测
确定用户刷头条时真实体验的指标:95 分位值
模板优化
详情页使用同一个模板,当用户退出页面时把正文数据清空,在进入喜爱个页面时复用这个 WebView 重新注入对应正文数据
全流程离线化后,进行本地模板加载优化
模板合并。将 JS、CSS、图片内联到一个文件以减少加载模板时的 IO 操作
模板简化。非必要样式和 JS 异步拉取
在合适的时机在后台创建 WebView 并预加载模板,用户进入详情页时使用加载好模板的 WebView 并将内容数据通过 JS 注入页面,收到数据后前端渲染
公共样式 CSS 和逻辑 JS 抽离为独立模板,内置到客户端中
客户端请求接口拿到正文数据,并通过 JS 脚本注入页面完成展示
用户进入详情页加载本地模板,并行请求详情页数据并注入模板
通过一定策略预加载数据并暂存
模板拆分
模板预热
模板复用
网络优化
多域名备份。服务端下发多个 CDN 链接,某个访问异常时可以快速切换
快速访问。设计了详情页请求的快速动态超时策略(因子 1.5,min = 1s,max = 4s),保证在网络或服务异常时,用户快速感知到自身网络问题。
详情页请求特点:流量大、数据属性基本不变、用户分布广、接口数据大
将正文、标题、作者栏等主要又基本不变的内容托管到 CND
CDN 加速
容灾
渲染优化
WebView 中非文字内容(图片、视频)通过原生组件渲染
Feed 页智能加载详情页需要的多图
详情页首屏内容在服务端就把所有正文的 HTML 数据组装好,服务端直出内容给客户端 WebView 渲染。
服务端预渲染
客户端渲染
白屏优化
网络导致的页面白屏问题,通过前面的优化策略已解决
非网络原因的白屏(WebView 占用内存过大发生的白屏),先判断是否存在数据注入,若没有进行请求重试,接着重新加载模板并注入数据。
iOS 开发早已经过了会写两个页面就可以拿到高薪的时代了,于是,出于兴趣也好,出于生计也罢,越来越多的 iOSer 该意识到,需要提高自己的技术能力了,毕竟面试也越来越难了不是。那如何提高呢?本文其实是 v2ex 上面的一个帖子:"iOS 开发有什么国人写的比较好的书籍推荐?"。里面的内容大多来源于 lujie2012
以及其他人的一些回答,回答的内容已经不仅仅是推介书了,还包含了很多关于 iOS 学习上的问题。虽然里面个别回答或观点笔者并不是完全认同,但还是希望对这方面有困扰的同学有一点点帮助。
@含笑饮砒霜:闲鱼是国内第一个使用 Flutter 混合开发的大型应用,但是目前面临如下几个痛点:
Flutter 侧混合编译速度慢,Android 首次编译 10min+,iOS 首次编译 20min+
混合栈编程中历史包袱导致 iOS/Android 双端返回给 Flutter 侧的数据可能存在不一致性
集成模块开发效率相比模块开发较低,单模块页面测试性能数据无法展开
面对这些痛点,闲鱼技术团队做了如下尝试:
模块化开发
跨进程开发
尽管两个方案都可以解决编译运行时间长的问题,但通过对比分析,方案一拆分模块和维护模块时都有很高的成本,方案二拆分成本和维护成本都相对较低,但对运行环境要求苛刻。综合来看,方案二虽然有一定缺陷,却可以解决很多问题。
@JonyFang:内容主要分三部分。第一部分,简介 Podfile 配置所围绕的 Xcode 工程结构(Workspace、Project、Target 及 Build Setting)。第二部分,介绍 CocoaPods 中 CocoaPods-Core 对配置文件的解析,配置文件包括 Podfile、Podspec 及解析后的依赖锁存文件(如 Podfile.lock)。第三部分,演示在 Podfile 中对 Target 进行的嵌套使用。
文章目录结构如下:
Xcode 工程结构
Target
Project
Workspace
Scheme
CocoaPods-Core
Podfile 文件类型
Podfile 文件读取
Ruby 格式的 Podfile 加载
YAML 格式的 Podfile 加载
Specification
TargetDefinition
Podfile
Lockfile
CocoaPods-Core 的文件结构
Podfile 的主要数据结构
Podfile 内容加载
Podfile 内容解析
Podfile targets 配置
Target 的嵌套使用
Abstract Target 的应用演示
@zvving:SwiftUI 被寄予一统 iOS macOS iPadOS tvOS 全平台界面实现的厚望。然愿望美好,现实骨感:笔者使用 SwiftUI 过程中就碰到一系列状态同步 + Crash + 卡顿问题。
如果要上线 SwiftUI,可以从 iOS 平台 Widget 等较稳定的场景入手,而 macOS tvOS 跨平台场景问题多多,建议先谨慎观望。
@J_Knight_:GitHub CLI 1.0 版本已发布。使用 GitHub CLI 可以:
从终端运行你的整个 GitHub 工作流
调用 GitHub API 来编写几乎所有操作的脚本,也可以为所有命令设置一个自定义别名
连接 GitHub Enterprise Server 而不只是 GitHub.com
本文结合实例介绍了从 issue 到 release 工作流的使用方法,也讲解了如何使用 gh alias set 为命令创建别名;而且这些自定义的命令也可以自由组合。
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
我们开通了公众号,每期发布时公众号(LSJCoding)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
???? 表示需某工具,???? 表示编辑推荐
预计阅读时间:???? 很快就能读完(1 - 10 mins);???? 中等 (10 - 20 mins);???? 慢(20+ mins)
参考资料
[1]
Swift 5.3 正式发布: https://swift.org/blog/swift-5-3-released
[2]
苹果更新 App Store 审核指南: https://developer.apple.com/news/?id=xqk627qu
[3]
系列文章:用 Swift 实现一个 Swift Runtime: https://belkadan.com/blog/2020/08/Swift-Runtime-Heap-Objects/
[4]
分析可执行文件 Mach-O: https://juejin.im/post/6870034249026633742
[5]
The State of SwiftUI: https://steipete.com/posts/state-of-swiftui/
[6]
GitHub CLI 1.0 is now available: https://github.blog/2020-09-17-github-cli-1-0-is-now-available/