# 老司机 iOS 周报 #173 | 2021-08-30

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

## 新闻

### 🌟 [Apple 与美国开发者就 App Store 更新达成一致，这些更新将支持开发者业务，并持续为用户带来精彩体验](https://www.apple.com.cn/newsroom/2021/08/apple-us-developers-agree-to-app-store-updates/)

[@Parsifal](https://github.com/ParsifalC)：本周我们推送了一则短文 - [IAP 或将不再是唯一支付方式](https://mp.weixin.qq.com/s/vK3ilfP8MqdURooXEDH7kg)，文章的主要内容便来自于苹果官方的这则新闻。新闻内容比较多，但最值得我们注意的便是苹果对于 IAP 使用条款的改变。虽然目前并没有明确说明，我们可以直接在应用内使用第三方支付，但从描述上看，苹果已经做出了比较大的改变，从原来不允许引导用户使用其他支付变为了可接受邮件等方式的引导。这些变更起源于美国的开发者群体与苹果的诉讼案，因而所有变更都仍需要那边的法庭最终同意才能正式推行。

## 新手推荐

### 🌟 [重磅首发｜闲鱼构建Flutter企业级应用开发电子书新鲜出炉](https://mp.weixin.qq.com/s/DTLgVwUjfORBY5NCd9C-8g)
[@CrazyCoderShi](https://github.com/CrazyCoderShi): 单看标题相信大家已经知道是什么了，没错，咸鱼团队出品的企业级 Flutter 应用开发指导书籍，本书从深度，广度，以及实用性几个方面着手，切合咸鱼项目的实际经验。对于正在学习和需要进阶的同学来说，可谓是不可多得的好资料，关键还免费 😄

## 文章

### 🌟 🐕 [How iOS 15 makes your app launch faster](https://www.emergetools.com/blog/posts/iOS15LaunchTime)

[@Leo](https://github.com/leomobiledeveloper)：对于 deployment targe 是 iOS 15 或者 macOS 12 的 App 来说，苹果使用了一种新的二进制格式来存储启动时候需要 bind 和 rebase 的信息。新的格式下 bind 和 rebase 被合并存储在 LC_DYLD_CHAINED_FIXUPS 段，合并后意味着更少的安装包占用，启动时需要的 page fault 也更少，进而提高启动速度。

### 🌟 🐕 [Building a token refresh flow with async/await and Swift Concurrency](https://www.donnywals.com/building-a-token-refresh-flow-with-async-await-and-swift-concurrency/)

[@Barney](https://github.com/BarneyZhaoooo)：本文简述了如何使用 async/await 和 Swift Concurrency 构建刷新流，并配有流程图和代码示例，方便大家开启实践思路。

- 流程了解
- **AuthManager** 的实现
- 网络请求实践

### 🌟 🐕 [Flutter 疑难杂症系列：键盘原理及常见问题解决方案](https://mp.weixin.qq.com/s/snU-mNlmEnOUHw3I-DrJ_w)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：Flutter 的键盘、输入框在双端的实现，大致都是借助 Native 的输入能力，通过 Channel 在 Flutter 和 Native 侧进行数据的同步。具体到 iOS 上，则是通过 FlutterTextInputPlugin 调用到了 Native 的 FlutterTextInputView 上，再调用 becomeFirstResponder 实现键盘弹出。

本文详细介绍了 Flutter 在如何实现：键盘调起之后页面的重绘逻辑、页面收缩动画。同时还列举了一些问题发现以及定位方法，值得细细钻研。其中Android部分机型的问题也有助于我们理解重绘的逻辑，具体如下：

- 锁屏后键盘无法收回
- Android 键盘动画卡顿
- iOS 上搜狗输入法长按发送未换行
- iOS 光标动画使得 CPU 飙升
- iOS 上键盘收起之后，光标依旧存在
- iOS12+ 长按系统输入法空格光标卡顿不灵敏

### 🐎 [Why Conditional View Modifiers are a Bad Idea](https://www.objc.io/blog/2021/08/24/conditional-view-modifiers/)
[@zvving](https://github.com/zvving)：SwiftUI 中通过自定义视图修饰符(View Modifiers)，能复用项目中的的定制视图逻辑，简化 View 声明代码。但是对于条件视图修饰符，并不像看起来那么美好。

使用条件视图修饰符(Conditional View Modifiers)，初始样式一切正常，但是当条件变化时，动画可能并不符合你的预期，状态值也会在条件变化时莫名消失。这本质与 SwiftUI 中 if-else 内部实现有关：条件变化并非修改视图属性，而是对应的不同视图——在条件变化时移除或插入。文章详细解释这些问题背后的成因，相信能帮助你更好的使用 SwiftUI。

### 🐕 [降低 APP 卸载率，测试人员可以做些什么？](https://mp.weixin.qq.com/s/ogiOlV-eXkDFlGEp-pLgMQ)

[@Smallfly](https://github.com/iostalks)：随着移动互联网竞争白热化，各大厂商都希望能多抢占一些用户时间，App 的使用体验就变得越来越重要。对于不满足预期的 App，用户很可能会毫不留情的卸载。

闲鱼借鉴了马斯洛人类需求层次结构，从安全性、功能性、稳定性、易用性、愉悦性等五个逐级递增的层次，抽象出 App 用户体验金字塔模型。并介绍了他们在各个层次上做的具体改善措施，分别是：
* 隐私安全是底座
* 跳出功能测试“陷阱”
    * 探索性测试
    * 新用户视角测试
    * Bug Bash
* 重视全链路性能
* 引入可用性测试

### 🐎 [Deprecating Workarounds](https://www.basbroek.nl/deprecating-workarounds)

[@xiaofei86](https://github.com/xiaofei86)：当我们在最新的系统版本遇到 BUG 时，往往直接判断当前版本，并提供将解决方案。这种情况下，如果下一个系统版本仍然存在此问题，就会导致线上 BUG。如果为大于当前版本的系统都应用此解决方案，如果下一个系统版本修复了此问题，那么我们的修复方案也会出现不可预知的情况。

本文提供了一个小 Tips 来更好的处理这种问题。我们定义单独的方法来解决此版本的问题，并将此方法标记为在下个版本废弃，这样我们可以在升级后获得一个编译警告提醒，以便于重新判断此问题是否已经被系统修复。如果没有被修复，就继续在下一个版本提醒，如果被修复就改为在特定版本应用。

## 摸鱼周报

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

* 话题：跟一位刚入职某一线大厂的同学聊一下最近的面试感受。
* Tips：设计 OC 版本的 defer 功能；使用现有证书创建 Fastlane match 格式加密文件。
* 面试模块：离屏渲染相关知识点。
* 优秀博客：整理了Swift 闭包相关的文章。
* 学习资料：介绍两个仓库，一个是大家容易读错的开发词汇汇总，一个是微软出品的物联网课程。
* 开发工具：一款免费开源的跨平台密码管理工具：KeeWeb。

## 代码

### [swift-custom-dump](https://github.com/pointfreeco/swift-custom-dump)

[@Damien](https://github.com/ZengyiMa)：swift-custom-dump 库是针对 Swift App 中的数据进行调试、Diff 以及测试功能的工具集合，除此之外还具备了自定义扩展功能，有数据调试需求的同学不妨一试。

### [PreviewView](https://github.com/theoriginalbit/PreviewView)

[@JonyFang](https://github.com/JonyFang)：PreviewView 的作用是利用 SwiftUI 预览画布快速制作 UIViewController 和 UIView 原型。有类似需求的同学可以一试～

## 赞助者

### flomo 浮墨笔记

新一代卡片笔记，像聊天一样无压力输入，帮你积累知识的复利。还有极简的 API 可打通更多产品。老司机读者专属注册码（可以获得 45 天 PRO 会员）：https://flomoapp.com/register2/?Mjk4Njk

### 产品沉思录

一份由少楠& fonter 打理的付费邮件周刊及知识库，创建于 2017 年，累计 3000+ 用户付费订阅。涵盖了产品设计，服务设计，互联网技术，经济学，社会学等领域。我们尽量选择那些半衰期较长的内容，以确保这些知识能跨越时间。欢迎访问我们的免费精选集：https://index.pmthinking.com

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

## 内推

>  抖音生活服务（上海/成都）招人，Android / iOS / Server 工程师，我们致力于将用户创建内容与用户兴趣相关业务、生活服务连接，通过生活服务带动抖音用户活跃度提升。
>  
>  简历发送至：fuxiang.666@bytedance.com

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