# 老司机 iOS 周报 #189 | 2022-01-17

![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) 提出。

## 新闻

### 手机 QQ 体积暴增，接近 900M

[@Damonwong](https://github.com/Damonvvong): 上周手机 QQ 迎来今年的第一次升级，给大家带来了一个巨大的 “惊喜”，iOS 版本的安装包已经达到了 879M，有眼尖的网友发现内置了一个 UE4 虚幻引擎，但是用在了哪个功能至今还未发现。手机 QQ 和元宇宙会擦出怎么样的火花，让我们拭目以待 ~

### [“App 分析”现已可用于 app 内活动](https://developer.apple.com/cn/news/?id=pa0x2dzk)

App Store Connect 中的“App 分析”能有效帮助您了解用户如何发现您的 app 并与之互动。您现在可以查看有关 app 内活动的信息，包括活动页浏览量、提醒和通知数据，以及由 app 内活动带来的下载和重新下载次数。每个指标都可以按照地区、来源类型、设备以及更多分类进行查看，让您能轻松了解您的 app 内活动如何推动了 app 的增长和成功。

### 🐎 [字节跳动技术 iOS 技术沙龙正式报名开启](https://mp.weixin.qq.com/s/yPTIOxJtl4BsjkDN0rXDdw)

[@Leo](https://github.com/leomobiledeveloper)：字节跳动第三次技术沙龙，本次主题是关于 iOS 开发的，可以通过这次沙龙了解「抖音 iOS 基础技术」的技术细节。本次分享的主题涉及架构、构建、自动化、性能、稳定性等领域，内容很丰富，时间在1月22日下午，进入文章即可免费报名，获取在线观看地址。

## 新手推荐

### 🐎 [iOS 浮点类型精度问题小记](https://juejin.cn/post/7047767024931438605)

[@极速男孩](https://github.com/ztlyyznf001)：浮点数精度丢失的问题是不少人都会面临的问题。本文主要介绍了在 iOS 中如何避免精度丢失的问题，并且解析了精度丢失的主要原因。

### 🐎 [Loop](https://www.swiftbysundell.com/basics/loops/)

[@享耳先森](https://github.com/iblacksun)：Swift 有多种内置语法对集合类型进行迭代：`for` `forEach` `enumerated()` `while` 等，本文介绍了各种语法的具体差异，建议阅读。 

## 文章

### 🌟 🐢 [【译】SE-0302 Sendable 和 @Sendable 闭包](https://kemchenj.github.io/2022-01-07/)

[@四娘](https://kemchenj.github.io/)：去年 WWDC 里 Swift 更新了 Concurrency 相关的功能，后续的更新提供了一定程度的向后兼容，让 iOS 13 的程序也可以用上这些功能。

虽然 WWDC 上大部分篇幅都是在介绍 async/await，结构化并发和 Actor，但实际接入过程中这些功能并没有带来太多问题，反而是 Sendable 的检查难住了我，深入了解之后才发现这个功能是帮助 Concurrency 走向 type-safe 的关键。

通过翻译这篇文章解答了很多我在这个过程中的疑惑，非常推荐想要接入 Concurrency 的同学进行阅读：

> Swift Concurrency 的功能渴望建立一个安全而强大的编程模型。我们希望实现这三件事：
>
> 1. 我们希望 Swift 程序员在试图 跨并发域传递 可能引入不受保护的共享可变状态 时得到一个静态的编译器错误。
> 2. 我们希望高阶程序员能够实现包含复杂技术的库（例如并 ConcurrentHashTable），并且能够让其他人以一种安全的方式去使用。
> 3. 我们需要拥抱现有的世界，其中包含了很多在设计时没有考虑到 Swift 并发模型的代码。我们需要一个平滑和渐进的迁移策略。

### 🌟 🐢 [基于 dylib 注入原理实现 iOS 热重载框架 CocoaHotReload](https://mp.weixin.qq.com/s/XsfYUBD2YK9Tq4cfoGW4JA)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：非常详细的热重载实现原理介绍，支持真机（iOS 13+）、Swift 的 4 种函数派发方式都能支持、支持 Storyboard & xib 资源文件等等。方案十分完整，关键实现也已贴出代码，推荐一读。文章主要内容如下：

- Mac app，主要职责是根据修改文件查找对应的编译指令并执行生成 .o 文件，接着链接 .o 文件及依赖的库生成 dylib 动态库
- iOS Framework，主要职责是 动态库注入 和 资源包更新
    - ObjC 类替换，Swift 函数替换，C函数替换（Dobby 实现）
    - hook 函数处理，解决函数调用栈丢失与死循环的问题
- 解决 Swift 函数热重载问题
- 解决部分库设置 Symbol hidden by Default 为 YES 导致的 Symbol not found 问题

### 🌟 🐕 [基于 Web 内核的微信小程序框架实践](https://mp.weixin.qq.com/s/vEu2Ft4c6LHPeUBHChjfFA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 微信小程序技术一直作为业界跨端方案的标杆一样的存在，此次小程序在内核上大跨步式改动，从类 PWA 转入 Chrome 内核以获得在 PC 层面的更多能力，并集成了 Node ，目前还未在 iOS 上应用，但作为跨端方案还是很有借鉴意义的，推荐相关同学深入阅读。

### 🐢 [A short-term roadmap for C++ interop](https://forums.swift.org/t/a-short-term-roadmap-for-c-interop/44768)

[@Damien](https://github.com/ZengyiMa)：本文是 Swift 社区提出的 Swift 和 C++ 交互的 roadmap 规划。其中主要目标是希望在接下来的几个月里，Swift 编译器可以完全导入 libc++ 头文件、LLVM 头文件和 Swift 头文件而不崩溃。对 Swift 编译相关感兴趣的同学建议一读。

### 🐢 [Swift 在手淘商品评价的技术重构与实践](https://mp.weixin.qq.com/s/J4wxvr5JvibG7vUtRz3ing)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：本文主要是对手淘探索 Swift 业务落地的一个总结。更快、更安全且更具备表达性的 Swift，这些年明显比 OC 发展的更好，国内外混编应用的占比持续增高，长远来看，使用 Swift 几乎是日常开发的不二之选。对于大型项目，引入 Swift、从哪些业务模块引入 Swift、引入 Swift 对当前项目架构的冲击等都是需要慎重考量的，文中也都有详细阐述，旨在希望可以给大家在技术选型或探索避坑的时候给到一点帮助。

### 🐎 [Xcode 配置多套 App 图标的方法 --- AppStore 图标 A/B Test 实践](https://mp.weixin.qq.com/s/BApDWf9acuFBSONzV2OnEQ)

[@老峰](https://github.com/gesantung)：2021 年 12 月 08 日，苹果推出 App Store 产品页的新功能，在 App Store 中开发者可以针对 app 产品页的不同版本上使用不同的图标、截屏和 app 预览，通过 A/B Test 找出效果最佳的版本。本文主要介绍了使用 Xcode 13 在 Assets.xcassets 创建多套测试的图标的操作细节以及要注意的一些点。

### 🐎 [让 UIKit 更优雅易用：Block 回调改造](https://juejin.cn/post/7045133536495403015)

[@JonyFang](https://github.com/JonyFang)：HWBlocksUI 对 UITableView，UITextField，UIButton，UISwitch 等常用的 UIKit 类进行了扩展，将之前需要 Delegate 或 target+selector 回调的方式改成了 Block。使用 Block 的优势体现在：

1. 代码紧凑，无需声明协议，可以将相关代码逻辑集中在一起，降低开发调试成本；
2. 允许访问上下文变量，无需再专门抽出实例变量供不同代理方法共享；

### 🐢 [Cube 技术解读 | Cube 小程序技术详解](https://mp.weixin.qq.com/s/Sm2xtyxPMGucUHtaUy_aOQ)

[@Leo](https://github.com/leomobiledeveloper)：在动态化或者跨端开发里，小程序是一个业界典型的实现方案。Cube 是阿里出品的轻量级小程序技术栈，具有体积小、启动快、内存占用低等特点。本文详细介绍了 Cube 小程序技术栈与技术演进实践，包含了布局计算、样式能力、组件支持、引擎优化等方方面面，推荐阅读。

### 🐢 [Swift Playgrounds 4 娱乐还是生产力](https://mp.weixin.qq.com/s/Uyd9Nf12HpmslYR0zOQaEQ)

[@anotheren](https://github.com/anotheren)：赶在 2021 年底，苹果终于发布了 Swift Playgrounds 4，作为近年来最具革命性意义的版本，Swift Playgrounds 4 提供了在 iPad 上开发并发行 App 的能力。本文介绍了这个版本的最新功能。如果你还没入门，不妨再读一下下面这个系列：

- [玩转 Xcode Playground（上）](https://mp.weixin.qq.com/s/rHNrTt7CReTLL8aubz0SqQ)
- [玩转 Xcode Playground（下）](https://mp.weixin.qq.com/s/_kggsB9kL5jYi-40KDMsrQ)

### [一场开源 RSA 库引发的“血案”](https://mp.weixin.qq.com/s/UM_Nrfd2I0oVosD6iQDn5w)

[@老驴](https://weibo.com/u/6090610445)：58 同城团队的一篇使用开源库踩坑的分享。简单来说就是 58 团队在使用了开源库后，上线发现频繁崩溃吗，debug 后发现原作者没有正确处理多线程。这类问题其实并不少见，很多人在使用开源库的时候，并没有去仔细调研库，而使用以后出现问题，甚至很难自己修复。也希望这篇文章能对大家是个提醒，最好在用开源库之前，先读一读代码，理解一下代码的意思，这样即便真的踩坑，需要 debug，也会轻松不少。

## WWDC21 内参

### [SwiftUI 技术内幕](https://mp.weixin.qq.com/s/Q8EuaXei9Q0q-3OyD6n9Bw)

通过阅读本文，带你一起深入解读 SwiftUI，提高应用程序的性能。

### [初探 Swift 算法和集合](https://mp.weixin.qq.com/s/WpvuuUXQPwBHZpk8OmuPDg)

本文主要介绍 Swift 的算法和集合开源包。列举了其中的几个算法和数据结构，深入了解 Swift 实现和优化方式。

## 工具

[Automatically merging conflicts in Xcode project files](https://blog.kulman.sk/automatically-merge-xcode-project-conflicts/)

对于大一些的项目工程，参与提交代码的人比较多时，常常会遇到需要处理代码冲突的时候。常规的代码冲突只需要通过代码片段确认逻辑就可以解决，而有些文件格式，可读性很差，解起来很麻烦，例如 Xcode 项目文件(project.pbxproj)。Kintsugi 是一个轻量级工具，可以自动解决 Xcode 项目文件中的冲突。只需要通过 gem 安装：
```
gem install kintsugi
```
然后执行下面的命令，kintsugi 会帮助解决冲突，非常方便
```
kintsugi App/project.pbxproj
```

## 代码

### [Flipper](https://github.com/facebook/flipper)

[@Barney](https://github.com/BarneyZhaoooo)：Flipper 是 Facebook 开源的一个面向移动端（Android/iOS）开发者的桌面调试平台。

其主要包含:

- macOS 的桌面应用程序
- Android 和 iOS 的原生 SDK

## 摸鱼周报

[@摸鱼周报 #41](https://mp.weixin.qq.com/s/DNXrfZgx0JaXyvfVZ4sYVA)：第四十一期摸鱼周报来啦，一起来看下本期概要吧：

- 话题：In-App Events 数据分析上线了；线上沙龙：抖音 iOS 基础技术大揭秘。
- Tips：在 Objective-C 中标记构造器为指定构造器。
- 面试模块：如何检测内存泄露。
- 优秀博客：野指针的捕获与防护。
- 学习资料：一份可视化的 Web 技能列表。
- 开发工具：SwiftInfo 是一个 CLI 工具，用于提取、跟踪和分析对 Swift 应用程序有用的指标。

## 内推

老司机周报团队联合知识小集和 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）
