# 老司机 iOS 周报 #192 | 2022-02-21

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/ios-weekly.png?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### 🌟 🐕 [Flutter 2.10 现已发布](https://mp.weixin.qq.com/s/FgMu6-O_wMkwxp2yxiW2Ew)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 2.10 已经发布，2022 年的第一个 Stable 版本，按照惯例每个季度只会发布一个 Stable 版本，所以每一个 Stable 版本都是成吨的优化和性能改进:
- Flutter 构建 Windows 桌面应用 Stable
- 引擎的性能改进
  - 绘制脏区管理
  - 更快的类型流分析实现
- 平台侧更新
  - iOS 平台键盘动画优化
  - iOS 9.3.6 的⽀持进入尾声，计划在 Q3 放弃对 iOS 9 和 10 的支持
  - Android 版本支持配置更新
  - Web 文本框滚动 bugfix
- Material 3
- 开发工具更新
  - DevTools 命令行改进以及调试窗口对大型列表展示优化
  - VS Code 着色器增强( Color 类可弹出着色面板)

### 🌟 🐢 [Apple 开源 dyld4](https://github.com/apple-oss-distributions/dyld/blob/main/doc/dyld4.md)

[@Leo](https://github.com/leomobiledeveloper): 近期 Apple 开源了 dyld4 的源码，不同于以往，这次在开源的同时还附带了相对完善的文档，所以对开发者阅读体验更加友好，不用从零开始自己梳理逻辑了。dyld4 保留了相同的 mach-o 解析器，引入了 JustInTime 的加载器来优化 dyld3 闭包失效时候需要重建闭包的性能问题，推荐对底层原理感兴趣的同学阅读。


## 文章


### 🌟 🐕 [FFmpeg 工具：客户端音视频开发的必备工具](https://mp.weixin.qq.com/s/Rl7fxOP-YH37mQEvGxhfUA)

[@JonyFang](https://github.com/JonyFang)：FFmpeg 是从事音视频开发最常用的工具和三方库之一，我们可以用它来进行多种格式音频和视频的录制、转换、流处理功能。对对音视频感兴趣的 iOS 开发同学来说，FFmpeg 会是必不可少的工具。本文主要是对 FFmpeg 的常用功能做了详细的介绍。

本文内容框架：
- ffmpeg 常用命令介绍；
- ffplay 常用命令介绍；
- ffprobe 常用命令介绍；

### 🌟 🐕 [可视化音视频分析工具：音视频原始数据、编码、封装分析好用工具集锦](https://mp.weixin.qq.com/s/jCYih3qgEIUctuWxn0aTGQ)

[@JonyFang](https://github.com/JonyFang)：在音视频开发中，FFmpeg 是必不可少的工具之一，但 FFmpeg 主要是命令行形式。为了方便、快捷、直观的分析音视频数据，最好能有一些可视化的分析工具来协助开发，本文主要介绍了一些常见的可视化音视频分析工具。

本文内容框架：
- 音画原始数据分析工具介绍；
- 编码数据分析工具介绍；
- 封装格式分析工具介绍；

### 🐢 [阿里卖家 Flutter for Web 工程实践](https://mp.weixin.qq.com/s/pai_9kJuAdD0RoZOdemL9w)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：本文详细介绍了 FFW(Flutter for Web) 落地的全过程，从选择分支版本、迁移代码、发布构建、产物精简、兼容性踩坑 等多个方面全面介绍。最终能够取得不错的业务收益，一路艰辛，欢迎大家阅读。

插外说一句，选型还是要谨慎，toB 产品还好，toC 低端机用户较多且弱网的情况下，一个较大的 js 的资源包加载就足以影响用户体验了，期待团队的后续优化方案。本文的具体目录如下：

- 工程基础：Flutter 版本选择、Dart 代码复用、平台相关插件
- 发布体系：工程构建（选择 HTML 渲染）、产物精简和处理、页面发布
- 能力支持：页面路由和地址、JS 调用、打点监控
- 优化和兼容：骨架图避免白屏、JS 资源拆包、兼容问题解决

### [hacker-laws: 软件开发人员常用定律](https://github.com/nusr/hacker-laws-zh)
[@莲叔](http://github.com/aaaron7)：在软件开发的过程中，有很多前人的经验和努力凝结而成的定律，比如摩尔定律，破船效应等等。这些原则总能够在项目开发过程中举棋不定的时刻来指导和帮助我们做出决定。这篇文章可以说是把软件开发中常见的定律、原则和模式做了一个汇总，非常有参考意义，并且每一个原则都给出了延伸阅读的资料，来帮你了解原则诞生的背景与故事，兼具了趣味性。总的来说，是非常不错的周末读物。

### 🐎 [Xcode 常见 CLI 工具](https://mp.weixin.qq.com/s/jF6mTsxC2xtn8Xp1Mn72Zw)

[@Smallfly](https://github.com/iostalks)：在日常开发中，或多或少都会用到 Xcode 内置的一些命令行工具（CLI），但是大部分小伙伴可能只是会用到一部分具体的命令。

本文较全面的介绍了 Xcode 内置的 20 种 CLI，主要分为六类：
- 前置工具
- 符号表相关
- 构建相关
- 工具链相关
- 工具相关
- Mach-O 操作相关

### 🐎 [Unobtrusive runtime warnings for libraries](https://www.pointfree.co/blog/posts/70-unobtrusive-runtime-warnings-for-libraries)

[@老峰](https://github.com/gesantung)：写代码的过程中，API 调用的一部分错误是无法通过类型检查处理的，但直接 fatalError 也不好，在业务层使用 #if DEBUG 进行检查也很容易错漏。Point-Free 就在这篇文章里就为我们介绍了更好的处理方式，通过代码进入断点，亦或者是通过 Xcode 抛出 Runtime Warning，给上层用户更好的提示，并且将这些逻辑封装起来，感兴趣的同学可以尝试。

### 🐕 [iOS自动化测试框架Kiwi的使用介绍及原理分析 - 掘金](https://juejin.cn/post/7060780751700099080)

[@Barney](https://github.com/BarneyZhaoooo)：本文较为深入的分析了Kiwi的功能、实现原理，以及一些比较容易被忽略的机制。它有语义清晰，实现方式优雅等优点，用它写出来的测试代码会有很好的可读性。文章同时也给出示例，从实际场景分析其原理。

- **Spec**
- **Mock & Stub**
- **Expectation, Verifier and Matcher**

### 🐕 [高级 SwiftUI 动画 — Part 1：Paths](https://mp.weixin.qq.com/s/5KinQfNtcovf_451UGwLQQ)

[@水水](https://www.xuyanlan.com)： 在本文中，结合原理和例子深入的探讨了一些创建 SwiftUI 动画的高级技术。

- Animatable
- animatableData
- GeometryEffect
- AnimatableModifier

这些都是被官方文档完全忽略的主题，在 SwiftUI 的帖子和文章中也几乎没有提及。本文（Part 1）中介绍了 Animatable 和 animatableData。后续的 Part 2中将介绍 GeometryEffect , Part 3中将介绍 AnimatableModifier。

### 🐕 [“一把梭：REST API 全用 POST”](https://coolshell.cn/articles/22173.html)

[@四娘](https://kemchenj.github.io/)：大家在工作中，可能遇到过各种各样风格的 API 定义，那么到底什么样的 API 定义才是合理的？本文从 v2ex 的一个问题开始，探讨为什么 HTTP 需要不同的动词，POST 是否安全，对于其它上下游基础架构功能的构建会产生什么影响等等的问题。另外留言区也有一些针对实际业务场景的提问和回答，推荐大家阅读。

### 🐢 [LLVM中文网](https://llvm.liuxfe.com/docs/)

[@红纸](https://github.com/nianran)：这是一个 LLVM 学习站点，少有的中文版本 LLVM 文档网站。站内含有 LLVM 使用指南、编程文档、子系统文档、Pass 编写等多个主题内容。对底层感兴趣的同学不妨看一看。

## 代码

### 🌟 [百度网盘开源依赖注入框架 CarbonGraph](https://github.com/baidu/CarbonGraph)

[@xiaofei86](https://github.com/xiaofei86)：百度网盘开源依赖注入框架 CarbonGraph，框架使用 Swift 编写同时兼容 ObjC，提供完整的依赖注入能力（构造器注入、属性注入、方法注入、工厂注入）。你可以将类之间的依赖关系交给 IOC 容器来构建，使用框架定义的 DSL 能够方便地进行配置。
构建更有利于测试和替换的松散耦合关系，可以实现不同业务对中台服务的个性化配置，也可以仅仅用来解决组件化中模块间直接依赖的问题。简单的使用示例如下所示，阅读原文了解更多信息。

```swift
let context = ObjectContext()
let definitionBuilder = Definition("filevc")
    .protocol(UIViewController.self)
    .object(FileViewController())
context.register(builder: definitionBuilder)
context[UIViewController.self, name: "filevc"]
```

```swift
let context = ObjectContext()
let definitionBuilder = Definition()
    .object(FileManager() as FileManagerProtocol)
context.register(builder: definitionBuilder)
context[FileManagerProtocol.self]
```

## 摸鱼周报

[@摸鱼周报 #43](https://mp.weixin.qq.com/s/Ktk5wCMPZQ5E-UASwHD7uw)：第四十三期摸鱼周报来了，一起来看下本期概要吧：

* 话题：dyld4 开源了
* Tips：Fix iOS12 libswift_Concurrency.dylib crash bug 
* 面试模块：Synchronized 源码解读
* 优秀博客：Swift Protocol 进阶
* 学习资料：南大软件分析课程，iOS 开发学习图谱
* 开发工具：贝尔实验室开发的有向图/无向图自动布局应用，支持 dot 脚本绘制结构图，流程图等。

本期还有一个人物访谈：[人物访谈 | 东坡肘子：健康&开发](https://mp.weixin.qq.com/s/SO5UN1JGsjnQG5zyQMDRew)，肘子是一位专注于 Swift 领域优秀博主。之前的一段时间经历过一场大病，本期访谈一方面聊一下他的独立开发和博主日常，另一方面则会聊些健康相关话题，希望大家能够重视自己身体发出的各类异常信号，任何阶段都应以身体为重。


## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 iTDriverr 哦~**

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（LSJCoding）会推送消息，欢迎关注。

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
