阅读 4878

老司机 iOS 周报 #129 | 2020-09-21

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

WWDC20

本周在周报公众号上我们推送了 2 篇 WWDC20 内参专栏内的文章,每篇都很精彩!

新闻

Swift 5.3 正式发布

@Parsifal:继 3 月底发布 Swift 5.2 后,Swift 5.3 终于也官宣发布了~苹果继续围绕编码体验、Swift 运行时性能和更多平台支持进行改善和优化。小集团队也为我们翻译了官方的更新概要 - 一图读懂 Swift 5.3,下载更新 Xcode 12 即可体验 Swift 5.3。

苹果更新 App Store 审核指南

@Parsifal:随着 iOS 14 的发布,以及正在路上的 macOS Big Sur,苹果对 App Store 审核指南也进行了一波更新。Apple Hub 做了中文翻译,不过建议大家还是以官方为主,译文为辅 - 苹果更新 App Store 审核指南,可以给苹果爸爸的审核条款提建议了

文章

🌟 🐢 系列文章:用 Swift 实现一个 Swift Runtime

@享耳先森:这个系列的文章来自于今年愚人节的一个项目,作者让 Mac OS 9 支持运行 Swift 程序,其中 Swift Runtime 没有将 C++ 的实现迁移过来,而是使用 Swift 实现了一套,文章里就分享了具体的实现细节,包含了大量的 Swift 指针操作技巧。

通过阅读系列文章,你应该对 Swift Runtime 会有更深的理解,推荐阅读。 belkadan.com/blog/2020/0… belkadan.com/blog/2020/0… belkadan.com/blog/2020/0…

作者 Jordan Rose 之前是 Swift 团队的一员,负责 bugs.swift.org 相关的工作,在去年离职。

🌟 🐕 分析可执行文件 Mach-O

@Damien:本文从 Mach-O 的概念出发,深度解析了 Mach-O 的内部结构以及加载 Mach-O 的步骤,最后作者也给出了通过分析 Mach-O 之后可以应用的使用场景,对于想理解 iOS 系统底层实现原理的同学是个很好的文章。

🌟 🐢 Flutter 包大小治理上的探索与实践

@CrazyCoderShi: Flutter 作为一种全新的响应式、跨平台、高性能的移动开发框架,在性能、稳定性和多端体验一致上都有着较好的表现。引入 Flutter 带来的包体积问题,一直以来都是个热门话题,本文详细 讲述了美团在处理 Flutter 包体积问题上的思考及相关的建设。

🌟 🐕 今日头条品质优化 - 图文详情页秒开实践

@JonyFang:本篇总结了头条详情页(WebView)加载优化的思路和实践。内容总结如下:

  • 数据建立
    • 确定优化效果的度量为:页面加载时间
    • 白屏检测方案:WebView 快照 -> 缩放 -> 非白色像素点检测
    • 确定用户刷头条时真实体验的指标:95 分位值
  • 模板优化
    • 模板拆分
      • 公共样式 CSS 和逻辑 JS 抽离为独立模板,内置到客户端中
      • 客户端请求接口拿到正文数据,并通过 JS 脚本注入页面完成展示
      • 用户进入详情页加载本地模板,并行请求详情页数据并注入模板
      • 通过一定策略预加载数据并暂存
    • 模板预热
      • 全流程离线化后,进行本地模板加载优化
      • 模板合并。将 JS、CSS、图片内联到一个文件以减少加载模板时的 IO 操作
      • 模板简化。非必要样式和 JS 异步拉取
      • 在合适的时机在后台创建 WebView 并预加载模板,用户进入详情页时使用加载好模板的 WebView 并将内容数据通过 JS 注入页面,收到数据后前端渲染
    • 模板复用
      • 详情页使用同一个模板,当用户退出页面时把正文数据清空,在进入喜爱个页面时复用这个 WebView 重新注入对应正文数据
  • 网络优化
    • CDN 加速
      • 详情页请求特点:流量大、数据属性基本不变、用户分布广、接口数据大
      • 将正文、标题、作者栏等主要又基本不变的内容托管到 CND
    • 容灾
      • 多域名备份。服务端下发多个 CDN 链接,某个访问异常时可以快速切换
      • 快速访问。设计了详情页请求的快速动态超时策略(因子 1.5,min = 1s,max = 4s),保证在网络或服务异常时,用户快速感知到自身网络问题。
  • 渲染优化
    • 服务端预渲染
      • 详情页首屏内容在服务端就把所有正文的 HTML 数据组装好,服务端直出内容给客户端 WebView 渲染。
    • 客户端渲染
      • WebView 中非文字内容(图片、视频)通过原生组件渲染
      • Feed 页智能加载详情页需要的多图
  • 白屏优化
    • 网络导致的页面白屏问题,通过前面的优化策略已解决
    • 非网络原因的白屏(WebView 占用内存过大发生的白屏),先判断是否存在数据注入,若没有进行请求重试,接着重新加载模板并注入数据。

🐕 一位 iOS 开发者的进阶之旅

iOS 开发早已经过了会写两个页面就可以拿到高薪的时代了,于是,出于兴趣也好,出于生计也罢,越来越多的 iOSer 该意识到,需要提高自己的技术能力了,毕竟面试也越来越难了不是。 那如何提高呢?本文其实是 v2ex 上面的一个帖子: "iOS 开发有什么国人写的比较好的书籍推荐?"。里面的内容大多来源于 lujie2012 以及其他人的一些回答,回答的内容已经不仅仅是推介书了,还包含了很多关于 iOS 学习上的问题。虽然里面个别回答或观点笔者并不是完全认同,但还是希望对这方面有困扰的同学有一点点帮助。

🐕 闲鱼对 Flutter-Native 混合工程解耦的探索

@含笑饮砒霜:闲鱼是国内第一个使用 Flutter 混合开发的大型应用,但是目前面临如下几个痛点:

  • Flutter 侧混合编译速度慢,Android 首次编译 10min+,iOS 首次编译 20min+
  • 混合栈编程中历史包袱导致 iOS/Android 双端返回给 Flutter 侧的数据可能存在不一致性
  • 集成模块开发效率相比模块开发较低,单模块页面测试性能数据无法展开

面对这些痛点,闲鱼技术团队做了如下尝试:

  • 模块化开发
  • 跨进程开发

尽管两个方案都可以解决编译运行时间长的问题,但通过对比分析,方案一拆分模块和维护模块时都有很高的成本,方案二拆分成本和维护成本都相对较低,但对运行环境要求苛刻。综合来看,方案二虽然有一定缺陷,却可以解决很多问题。

🐕 4. Podfile 的解析逻辑

@JonyFang:内容主要分三部分。第一部分,简介 Podfile 配置所围绕的 Xcode 工程结构(Workspace、Project、Target 及 Build Setting)。第二部分,介绍 CocoaPods 中 CocoaPods-Core 对配置文件的解析,配置文件包括 Podfile、Podspec 及解析后的依赖锁存文件(如 Podfile.lock)。第三部分,演示在 Podfile 中对 Target 进行的嵌套使用。

文章目录结构如下:

  • Xcode 工程结构
    • Target
    • Project
    • Workspace
    • Scheme
  • CocoaPods-Core
    • CocoaPods-Core 的文件结构
    • Podfile 的主要数据结构
      • Specification
      • TargetDefinition
      • Podfile
      • Lockfile
    • Podfile 内容加载
      • Podfile 文件类型
      • Podfile 文件读取
      • Ruby 格式的 Podfile 加载
      • YAML 格式的 Podfile 加载
    • Podfile 内容解析
  • Podfile targets 配置
    • Target 的嵌套使用
    • Abstract Target 的应用演示

🐎 The State of SwiftUI

@zvving:SwiftUI 被寄予一统 iOS macOS iPadOS tvOS 全平台界面实现的厚望。然愿望美好,现实骨感:笔者使用 SwiftUI 过程中就碰到一系列状态同步 + Crash + 卡顿问题。

如果要上线 SwiftUI,可以从 iOS 平台 Widget 等较稳定的场景入手,而 macOS tvOS 跨平台场景问题多多,建议先谨慎观望。

工具

🐎 GitHub CLI 1.0 is now available

@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)