# 老司机 iOS 周报 #190 | 2022-01-24

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

## 文章

### 🌟 🐕 [Bazel](https://bazel.build/)

[@红纸](https://github.com/nianran)：Bazel 是最近比较热点的话题之一。作为新的构建系统，它具有远端缓存、远端执行、跨平台、高度扩展、高性能等诸多特性。不仅仅局限于 iOS 的构建领域，在其 Rules 的帮助下，可以扩展很多可能性。
这边为大家稍作整理，给大家作为参考：
- 几篇入门：
    - [Bazel 官网](https://bazel.build/)
    - [Bazel 入门 - 放浪者](https://zhuanlan.zhihu.com/p/262171925)
    - [Bazel - Sunxxxxx丶](https://www.jianshu.com/p/727cbf544c47)
- 几篇分享：
    - [用 bazel 更快更稳定的构建 iOS 项目](https://bilibili.github.io/2020/07/22/bazel_ios.html)
    - [基于 Bazel的 iOS MonoRepo 实践](https://mp.weixin.qq.com/s/zFrKoHPBv3qz8TiwdqP8Fw)
    - [Improving Build Performance of LINE for iOS with Bazel](https://engineering.linecorp.com/en/blog/improving-build-performance-line-ios-bazel/)
- 几个工具、库：
    - [PodToBUILD](https://github.com/pinterest/PodToBUILD)：将 Cocoapods 的仓库转化为 Bazel 的 BUILD 文件
    - [cocoapods-bazel](https://github.com/bazel-ios/cocoapods-bazel)：Cocoapods 的 bazel 插件
    - [tulsi](https://github.com/bazelbuild/tulsi)：将 Bazel 的 BUILD 工程转成 Xcode 识别的 xcodeproj 工程
    - [xchammer](https://github.com/pinterest/xchammer)：将 Bazel 的 BUILD 工程转成 Xcode 识别的 xcodeproj 工程
- Awesome Rules：
    - [bazelbuild/rules_apple](https://github.com/bazelbuild/rules_apple)
    - [bilibili/rules_apple](https://github.com/bilibili/rules_apple)
    - [line/rules_apple_line](https://github.com/line/rules_apple_line)

> PS1: 内容比较多，大家可以慢慢消化一下。关于 Bazel 的讨论，也欢迎加入我们粉丝群进行交流，详情 @老王。
> PS2: 字节于 2022/01/22 进行了 JoJo 构建系统的分享，Bazel 作为其核心的组成部分之一。分享文章跟视频暂时没有发布，大家可以等待一下。

### 🌟 🐕 [GCDAsyncSocket 在 iOS15 出现 -[_NSThreadPerformInfo dealloc] 崩溃排查笔记](https://mp.weixin.qq.com/s/Tn8SN1eNaGkR1ddEKTkzPQ)

[@邦Ben](https://weibo.com/linwenbang)：从 iOS 15.0 Beta5 开始，集成开源库 GCDAsyncSocket 的 APP 开始出现 -[_NSThreadPerformInfo dealloc] 相关的崩溃，作者从堆栈开始分析，讲述整个排查过程思路，并且每个步骤的分析以及原理都进行了很深入的研究，从而得到了最后的 crash 原因以及给出解决方案，结论先放出来，但是过程非常推荐一看。

- 结论：经过前面的分析，我们可以得知，iOS 的新系统中存在一个 bug，该 bug 导致即使我们通过将参数waitUntilDone 设置为YES 的方式阻塞当前线程时，仍然存在触发悬垂指针的可能。
- 方案：
    1、通过单例持有 GCDAsyncSocket，避免调用 -[GCDAsyncSocket dealloc]
    2、先主动调用-[GCDAsyncSocket disconnect]，再释放GCDAsyncSocket的实例
    3、通过调整withObject:的参数，避免将 GCDAsyncSocket 的实例进行传递

### 🐕 [浅谈软件开发架构模式](https://mp.weixin.qq.com/s/cWp4J-XmvaoWHRMeuVDzPQ)

[@Smallfly](https://github.com/iostalks)：架构对开发者来说都不陌生，然而相同的架构模式在不同场景下可能有所区别。本文作者结合具体的问题和案例，从个人角度阐述了对 MVC/MVVM/VIPER 等架构模式的理解及运用。

### 🌟 🐕 [字节跳动 iOS Heimdallr 卡死卡顿监控方案与优化之路](https://mp.weixin.qq.com/s/qzA1g4mAH_Kgzc4fwVK2Rw)

[@Leo](https://github.com/leomobiledeveloper)：卡顿、卡死会造成应用体验大幅下降，进而影响留存、时长等核心业务数据。本文介绍了字节 APM 框架 Heimdallr 是如何监控卡顿卡死的，细节在字节系应用上验证和完善，被证明了是一套全面、稳定、可靠的技术方案。

### 🐢 [移动域全链路可观测架构和关键技术](https://mp.weixin.qq.com/s/grW6r_cpmrxEJ-pMacKtGg)

[@xiaofei86](https://github.com/xiaofei86)：监控告诉我们系统的哪些部分是工作的，而可观测性告诉我们那里为什么不工作了[[1]](https://xie.infoq.cn/article/598fd893709f01ae751dbd7b8?utm_medium=article)。相比传统的监控，可观测性能够通过结合数据，并且将数据有机联系在一起，产生更好的连接，帮助我们更好的观察系统的运行状况，快速定位和解决问题。

本文淘宝 App 基础团队通过对可观测理念的理解并结合客户端在运维排查、度量监控、全链路优化等方面遇到的实际问题，阐述团队对移动领域全链路技术理念的原创性应用。读者将收获移动技术域体验优化的思路转变，以及软件定义体验的沉淀和研发实践。

### 🐕 [iOS 如何记录堆栈信息？](https://juejin.cn/post/7049267131036205086)

[@AidenRao](https://weibo.com/AidenRao)：在 APP 卡顿、Crash 以及某些特定时机，开发者会想记录一下当前的堆栈信息。这篇文章主要从 [BSBacktraceLogger](https://github.com/bestswifter/BSBacktraceLogger) 源码入手，去理清记录堆栈信息的原理：回溯栈帧，获得函数调用地址，解析 MachO 文件获取函数名。

### 🌟 🐕 [从 0 到 1：美团端侧 CDN 容灾解决方案](https://mp.weixin.qq.com/s/BA55Op8A29sXq-_SHv1igg)

[@JonyFang](https://github.com/JonyFang)：本文结合美团外卖业务中的具体实践，介绍了一种在端侧感知 CDN 可用性状况并进行自动容灾切换的方案，通过该方案可有效降低业务对CDN异常的敏感，提高业务的可用性，同时降低CDN运维压力。

### 🐎 [静态库冲突问题思路全解](https://mp.weixin.qq.com/s/LAFS-6Oycnzu5kOhS9d7pA)

[@AidenRao](https://weibo.com/AidenRao)：iOS 开发中经常会遇到静态库冲突的问题，Xcode 报错关键词是duplicate symbol xxx，造成冲突的常见原因一般有两种：

- 项目中引入了命名不同的同一个静态库。
- 引入了不同的 SDK，SDK 中引用了同一个静态库。

本文介绍了解决冲突的多种方案，并对优缺点进行了对比。

### 🐕 [淘宝小部件 Canvas 渲染流程与原理全解析](https://mp.weixin.qq.com/s/o772Ziaxj64IOXXnckPFNQ)

[@Barney](https://github.com/BarneyZhaoooo)：本文主要阐述 Canvas 在小部件下的渲染原理。从端上技术视角看，小部件首先是一个业务容器，它的特点是**DSL标准化、跨平台渲染、跨场景流通**

- **端侧整体技术架构**
- **多视角看渲染流程**

### 🐎 [從前端視角看 SwiftUI](https://blog.kalan.dev/2022-01-09-learn-swiftui-from-frontend-view/)
[@Smallfly](https://github.com/iostalks)：SwiftUI 和 React 同为声明式框架，在使用上存在相似之处。本文站在前端视角，分别从组件化，响应式机制，状态管理，数据绑定等几个维度对比了两者使用上的异同点。而在开发体验上，Swift 作为静态编译型语言和 JavaScript 的动态性相比仍有差距。

### 🐎 [Apple’s use of Swift and SwiftUI in iOS 15](https://blog.timac.org/2021/1219-state-of-swift-and-swiftui-ios15/)

[@anotheren](https://github.com/anotheren)：在最新的 iOS 15 中，Swift/SwiftUI 在内置 App 的使用率进一步提升，如果你还在犹豫新技术的使用，看看 Apple 对于有内置 App 的改变。

### 🌟 🐕 [iOS 之深入理解 Image 与 MachO](https://juejin.cn/post/7053289480131706911)

[@J_Knight_](https://github.com/knightsj)：本文介绍了 Mach-O 以及其三个主要部分：Header、Load Commands 和 Data 的数据结构和功能。也介绍了 image、 Segment 和 Section 的相关操作 API

### 🌟 🐕 [iOS 线上野指针探测实践与展望](https://mp.weixin.qq.com/s/BNIWBwemmz4isbjBb9-pnQ)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：野指针问题线下难以复现，crash发生时的堆栈也大概率不是问题的直接原因，因此线上的野指针检测方案是很值得探索的。为了尽量减小对帧率与内存的影响，作者也进行了三个方向的优化：

- 仅监控必要的类型，对于系统类则通过基于 Bind 信息的方案，监控项目中使用到的系统类
- dealloc 中减少耗时操作：不要调用任何 OC 代码、不要使用 objc_setAssociatedObject、先判断 isTaggedPointer
- 多线程处理对象释放与入池；用堆栈距离 (UInt64)&_mh_execute_header 的偏移替代堆栈，用 memcpy 替代 vm_read_overwrite

### 🐕 [用 SwiftUI 实现一个开源的 App Store](https://juejin.cn/post/7051512478630412301)

[@JonyFang](https://github.com/JonyFang)：App Store 在 iOS 11 之前，App 排行榜一直是衡量开发者 App 活跃度的指标，在 iOS 11 后苹果弱化了榜单功能，改为了二级入口，相对之前榜单查询变得困难。编者通过 SwiftUI 结合开放 API 实现了一个可查看 App 榜单、搜索、信息、发布生效等功能的 App，该项目已开源。入门 SwiftUI 的同学，可以作为参考项目学习 SwiftUI。

### 🌟 🐕 [干货 | Dart 并发机制详解](https://mp.weixin.qq.com/s/WCvv7DXzWXNRaMtM-0u7pA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 在日常的 Flutter 开发中最常接触到的便是 async-await 异步机制，鲜少有碰到使用 isolate 的情况，本文从 async-await 切入带你详细了解 isolate 的原理，生命周期、多 isolate 之间通信等，小编推荐所有 Flutter 开发同学仔细学习。 

### 🐕 [在 SwiftUI 下定制手势](https://mp.weixin.qq.com/s/V_8jP3OPJa58eRz442LlQA)

[@老峰](https://github.com/gesantung): SwiftUI 目前提供了 5 种预置手势，分别为点击、长按、拖拽、缩放和旋转，其本身没有采用对 UIGestureRecognizer（或 NSGestureRecognizer）进行包装的形式，而是重构了自己的手势体系，由于缺乏提供底层数据的 API，严重制约了开发者的深度定制能力，本文通过如下示例讲解了 SwiftUI 下定制手势：
- 轻扫：DragGesture 获取判断移动方向的数据，根据偏移量判断方向
- 实现一个可以记录时长的按压手势：通过计时器在指定时间间隔后向闭包传递当前按压的持续时间。使用 GestureState 保存点击开始的时间
- 实现提供触摸位置信息的点击手势：使用 simultaneously 将两种手势联合起来，从 DrageGesture 中获取位置数据，从 TapGesture 中退出

### 🐕 [iOS瘦身！一个让50%本地图片消失的方案](https://juejin.cn/post/7053978539523047437)

[@水水](https://www.xuyanlan.com)： 安装包瘦身一直是老生常谈的问题，这篇文章尝试了一个比较有意思的图片管理尝试 - 云端图片资源管理方案。基本思路是把可能未使用的图片通过脚本剔除出项目，在App启动后动态加载那些被剔除图片的zip包。具体实施方案和注意事项文章中都有提到，正在为安装包瘦身烦恼的读者朋友，感兴趣的可以看看~

### 🐕 [手机 APP 是不是在偷听我说话？](https://mp.weixin.qq.com/s/FCOrMXeV53YcoKgQ869aYw)
相信很多读者会有一个疑问，手机是不是在偷听我说话？可能今天刚刚跟同事说了买什么东西，结果一打开某个 app，第一页就正好显示了刚说的东西，这看起来很可怕。最近一期“猿桌派”节目，几位嘉宾就告诉了我们这个问题的答案，想知道答案的不妨听一听这期界面，除了这个问题，还有很多关于数据打点等的干活哦。

## 摸鱼周报

[@摸鱼周报 #42](https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU2MDQzMjM3Ng==&scene=124#wechat_redirect)：第四十二期摸鱼周报来啦，一起来看下本期概要：

* 话题：2022年1月31号之后提交的应用需提供账号删除功能。
* Tips：openssh 8.8 默认禁用 ssh-rsa 加密算法导致 git 验证失效。
* 面试模块：如何治理 OOM。
* 优秀博客：一些优秀开发者的年终总结。
* 学习资料：程序员考公指南；Vim 从入门到精通（中文）。
* 开发工具：摸鱼单词，专注于利用碎片时间学习记忆英语单词。

## 代码

### [XMachOViewer](https://github.com/horsicq/XMachOViewer)

[@Damien](https://github.com/ZengyiMa)：XMachOViewer 是支持 Windows、Linux 和 MacOS 的 MachO 文件查看器和编辑器。它具备以下能力：

* 启发式扫描
* 字符串查看器
* 十六进制查看器
* 汇编查看器( x86/64, ARM, PPC, m68k)
* 熵值查看器
* 哈希查看器
* 密码搜索
* 名称符号解析 


### [PAG](https://mp.weixin.qq.com/s/FncvW2ObIJGafk4X7EAZ-A)
[@莲叔](http://github.com/aaaron7)：PAG 是近期技术社区比较热门的话题。PAG 是腾讯出品的一款特效 SDK，能够直接将设计师在 AE 设计的特效转换后直接在手机端展示，应用场景复杂的可以延伸至视频编辑的各种转场、贴纸特效，简单的也可以作为 Lottie 的替换，来实现端内一些 UI 动画效果。腾讯开放这款 SDK 的使用已经有一段时间，近期正式宣布了开源。开源意味着接入的成本与风险大大降低，对于业务有了更大的可控性，同时能享受到 PAG 的各种性能优化。如果你的业务有相关的场景，不妨可以了解一下。


## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 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）
