# 老司机 iOS 周报 #113 | 2020-05-18

![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 web 最新进展: 发掘更多可能！](https://mp.weixin.qq.com/s/NGqF2OTvsV1A2KLiMXE2PQ)

[@老驴](https://www.weibo.com/6090610445)：Google 又来更新 Flutter Web 的进展啦。在最新的版本中，Flutter 已经提供了 PWA 的支持，也有越来越多的插件开始提供对 Web 的支持，同时 Flutter 也进一步改进了 Web 的调试与测试。

虽然 Flutter Web 支持还是处于 beta 阶段，但是，Google 正在努力一步一步提升 Flutter 的表现，也希望广大开发者也能加入进来，一起完善 Flutter Web。

## 新手推荐

### [Settings Bundles Management in Xcode](https://swiftsenpai.com/xcode/settings-bundles-management/)

[@极速男孩](https://github.com/ztlyyznf001)：Settings Bundles 支持开发者在 iOS 设置中加入一些自定义的内容。本文主要介绍了如何通过 shell 脚本来在设置中根据不同的 Configuration 或者不同的 Targets 来加入不同的内容。


## 文章

### 🌟 🐕 [TrampolineHook 学习笔记](https://blog.dianqk.org/2020/05/11/trampolinehook-study-notes/)

[@五子棋](https://github.com/satanwoo)：虽然这个库是我写的，但是没想到竟然有大神这么详细的剖析了里面的每一方面。太赞了，必须推荐。

### 🌟 🐕 [超详解析 Flutter 渲染引擎|业务想创新，不了解底层原理怎么行？](https://mp.weixin.qq.com/s/xxdgoEBIC3Bg4OCOZcm-aQ)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：小编强烈推荐在用 Flutter 的小伙伴仔细阅读这篇文章，本文由手淘技术产出，从渲染引擎层面详细分析了一个控件是如何展示到屏幕上的，细致入微。文末简要地提了一下，手淘在 Flutter 上的一些探索，也是社区内常提到的把 Flutter 引擎作为小程序的渲染引擎👍。

### 🐕 [What’s new in Swift 5.3?](https://www.hackingwithswift.com/articles/218/whats-new-in-swift-5-3)

[@享耳先森](https://github.com/iblacksun)：Swift 5.3 即将发布，本文给你介绍 Swift 5.3 的新特性，最显著的两个就是 多尾随闭包(`Multiple trailing closures`) 与 多重异常捕获(`Multi-pattern catch clauses`)，其余特性请阅读原文。

- 5.3 以前尾随闭包只能作于最后一个 `closure` 类型参数，对于有多个 `closures` 参数的情况，也不建议使用尾随闭包，Swift 5.3 开始将支持多 `closures` 参数使用尾随闭包模式。
- 以前一条 catch 语句中只能匹配一种 error，5.3 开始将支持多个 error

    ```
    do {
        let result = try checkReactorOperational()
        print("Result: \(result)")
    } catch TemperatureError.tooHot, TemperatureError.tooCold {
        print("Shut down the reactor!")
    } catch {
        print("An unknown error occurred.")
    }
    ```

### 🐕 [Flutter 在 PLUS 业务中的探索和实践](https://mp.weixin.qq.com/s/eJxmeAJ0ljmbPbgNVkGttQ)

[@looping](https://github.com/looping)：本文介绍了京东 PLUS 会员业务团队入坑 Flutter 的原因，以及当时需要探索和解决的问题调研结论，并且详尽地描述了 Flutter 在 PLUS 业务中的实践过程，这对正在研究 Flutter 的同学是一份很好的学习交流资料。


### 🐕 [WKWebView 默认缓存策略与 HTTP 缓存协议](https://juejin.im/post/5df75e3a6fb9a016266459da)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：WKWebView 默认缓存策略完全遵循 HTTP 缓存协议，苹果并没有做额外的事情。WKWebView 默认缓存策略流程总结如下：

 * 1. 是否有缓存，没有则直接发起请求，有则进行下一步
 * 2. 是否每次都得进行资源更新校验（响应头是否有 Cache-Control:no-cache 或 Pragma:no-cache 字段），不需要则进入 3，需要则进入 4）
 * 3. 缓存是否过期（响应头，Cache-Control:max-age、Expires、Last-Modified 启发式缓存），没过期则使用缓存，不发起请求，过期了则进入 4
 * 4. 客户端发起资源更新校验请求（请求头，If-Modified-Since: Last-Modified 值、If-None-Match: ETag 值），如果资源没有更新，服务器返回 304，客户端使用缓存；如果资源有更新，服务器返回 200和资源
 

> 推荐阅读： [可能是最被误用的 HTTP 响应头之一 Cache-Control: must-revalidate](https://zhuanlan.zhihu.com/p/60357719)

### 🐕 [The different categories of Swift protocols](https://www.swiftbysundell.com/articles/different-categories-of-swift-protocols/)

[@EyreFree](https://github.com/EyreFree)：本文作者提供了一种新的 Protocol 分类设计思路，即根据它们所属的类别来区分它们。概括地说，作者将协议分为四个类别：

- 动作使能器：使我们能够对每种符合类型执行统一的操作。它们通常具有以 `able` 结尾的名称，例如 `Equatable`；
- 需求定义：使我们可以将需求形式化为某种对象，例如 `Sequence`、`Numeric` 和 `ColorProvider`；
- 类型转换：协议用于让各种类型声明它们可以转换为另一种类型，或者可以通过原始值或文字进行表达（例如 `CustomStringConvertible` 或 `ExpressibleByStringLiteral`）；
- 抽象接口：充当可以多种类型实现的统一 API，从而使我们可以按需快速替换实现代码而无需改动调用方代码，封装第三方代码或在测试中模拟某些对象。

你是否认可这种分类方式呢？或许看完本文你能够有自己的看法。

### 🐕 ["零"学习成本：使用 Web 标准开发动态化 Flutter 应用](https://mp.weixin.qq.com/s/57CprMfvTtIeq6AdgcDdcw)

[@邦Ben](https:weibo.com/linwenbang)：该文介绍了阿里的一个 Kraken 项目，该项目核心是用 Web 标准进行开发，Flutter 进行解析渲染。简而言之就是，HTML -> Flutter Render，基本有也可以理解为小程序的模式，最大的特点就是使用 W3C 标准规范，Web 童鞋入坑成本低。同时也介绍了其配套工具和一些性能特性，但是还没开源，可以作为一个思路进行参考。


## 工具

### [How to add a shield on the App Icon of beta builds](https://diamantidis.github.io/2020/05/10/add-shield-on-the-app-icon-of-beta-builds)

[@红纸](https://github.com/nianran)：如果你还在烦恼装了太多测试包，却不能直观看出测试包版本/构建信息的话。不妨尝试下本文中的这个工具 [「Badge」](https://rubygems.org/gems/badge/versions/0.8.5)，其允许你在 App 的 Icon 中添加你指定的版本信息。集成也非常方便，可以通过 Xcode 中的 Run Script Phase 或者通过 Fastlane 中对应的 badge 插件进行集成。

## 内推

> 上海 - 字节跳动：TikTok iOS/Android/前端/后端工程师
>
> TikTok是目前全球最火爆，国内出海最成功的短视频App，全球累计下载接近20亿次。
>
> 目前团队规模落后于需求增长，非常缺人，经验不限，应届生老司机专家都欢迎。
>
> 简历发送至 martin.lv@bytedance.com

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

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

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

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

## 关注我们

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

![](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）
