# 老司机 iOS 周报 #86 | 2019-10-14

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

## 新闻

### [Twitter 重新上架 macOS 客户端](https://apps.apple.com/us/app/twitter-for-mac/id1482454543?mt=12)

[@张嘉夫](https://github.com/josephchang10)：10 月 11 日，Twitter 重新上架了经过 Project Catalyst 重写后的 Twitter for Mac 客户端。新版 Twitter 客户端支持拖拽、深色模式、多窗口浏览以及快捷键操作等功能。

## 文章

### 🐕 [Swift 的字符串为什么这么难用？](https://kemchenj.github.io/2019-10-07/)

[@Damonwong](https://github.com/Damonvvong): **Swift** 的字符串的设计可以说是 **Swift** 中最难以理解的语法之一了。不过，我们周报的小伙伴 [@kemchenj](https://github.com/kemchenj) 同学写了一篇通俗易懂的文章，详细阐述了

- 为什么会存在 `Collection.Index` 这个设计
- 目前的 `Collection.Index` 是怎么设计的，存在哪些问题
- 未来的 `Collection.Index` 会怎么改进

感兴趣的同学可以仔细阅读一下，算是一篇不错的 **Swift** 语法进阶文章。

### 🐕 [iOS 端 h5 页面秒开优化实践](https://juejin.im/post/5d8da122f265da5b5a7209fa)

[@莲叔](https://weibo.com/aaaron7)：基于移动端的 H5 快开优化已经成为各大 App 的标配模块，通常的做法有资源缓存、离线包、data prefetch等等。本文作者首先分析了 H5 页面加载的流程，并在 iOS 上基于 WkWebview 通过实现请求的拦截，实现了资源缓存的机制。文章整体不算体系，因为并没有包含很多 state of the art 的优化方式，但在 WkWebview 的使用技巧上介绍的还比较详细，仍是一篇值得一看的文章。

### 🐕 [The Simple Life(cycle) of a SwiftUI View](https://medium.com/flawless-app-stories/the-simple-life-cycle-of-a-swiftui-view-95e2e14848a2)

[@老驴](https://www.weibo.com/6090610445): 相信大家对 UIKit 中 UIView，UIViewController 的生命周期一定是熟悉到不能更熟悉了，这些知识点也一直是面试中的常考问题。那么在 SwiftUI 中，View的生命周期又是怎么样的呢？这篇文章就介绍了作者对其的理解。有兴趣使用 SwiftUI 的同学么可以简单的了解一下。

### 🐕 [Reducing iOS storyboard merge hell](https://medium.com/flawless-app-stories/ios-storyboard-merge-hell-b4cbb2e57dfc)

[@J_Knight_](https://github.com/knightsj)：作者介绍了几种避免在合并代码时在 storyboard 引起的冲突的方法：使用 SwiftUI，使用 nib，Diff 工具，锁定文件等方法。经常使用 storyboard 开发的朋友可以看一下。

### 🐕 [iOS 13](https://nshipster.com/ios-13/)

[@老峰](https://github.com/GesanTung)：本文来自
Mattt (@mattt) 分享了 iOS 13 中的一些新的 API 及框架：

- [Presentation framework](https://developer.apple.com/documentation/LinkPresentation)：App 通过 URL 获取站点元数据，以富文本形式展示 URL, 可以丰富 URL 的展现形式。
- [SFSpeechRecognizer](https://developer.apple.com/documentation/speech/sfspeechrecognizer)：设备内置语音识别，支持离线语音识别。
- [URLSessionWebSocketTask](https://developer.apple.com/documentation/foundation/urlsessionwebsockettask)：提供 Web Socket 系统原生框架，不在需要使用三方框架。
- [BackgroundTasks framework](https://developer.apple.com/documentation/backgroundtasks?language=objc)：新的 Background Tasks 框架可以更方便的执行后台任务。
- [OperationQueue progress](https://developer.apple.com/documentation/foundation/operationqueue/3172535-progress)：OperationQueue 通过 progress 属性可以方便的获取运行队列的进度。

[文章](https://nshipster.com/ios-13/)还分享了 MapKit、JavaScriptCore、UIKit 等新的 API，限于篇幅不一一列举。

### 🐎 [Alternatives to protocols in Swift](https://www.swiftbysundell.com/articles/alternatives-to-protocols-in-swift/)

[@四娘](https://kemchenj.github.io/)：Swift By Sundell 这周探讨的是 protocol 的替代品，虽然 Swift 称自己为 protocol-oriented，但实际上有很多问题都不适合使用 protocol，作者列举了一些例子并且提供了更好的解决方案。

### 🐎 [重磅|庖丁解牛之——Flutter for Web](https://mp.weixin.qq.com/s/krR2XsDXvakMlZWbV-VvSg)

[@邦Ben](https://weibo.com/linwenbang)：众所周知，1.9 版本加入了 Flutter Web 的支持，但也仅限于技术预览。该文通过移动端原理和 Web 方式进行对比，直观感受到两者区别（差异主要在 dart:ui 和 engine 这一层）。

优点：通过 HTML + CSS + Canvas 的方式更好的兼容，低成本迁移（Flutter 上层直接兼容）
缺点：dart2js 生成的代码过大，功能尚不完备，使用的 BitmapCanvas 会导致一些缩放场景有性能问题

在这么一个优秀的分层设计中，Flutter Web 仍值得继续期待，等到可用版本出现。

### 🐕 [A Comprehensive Guide to All 120+ Settings URLs Supported by iOS and iPadOS 13.1](https://www.macstories.net/ios/a-comprehensive-guide-to-all-120-settings-urls-supported-by-ios-and-ipados-13-1/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B424)

[@享耳先森](https://github.com/iblacksun)：iOS 的 `Settings` App 一直都支持通过 URL Scheme 的方式打开某一个子项，本文作者收集了 120+ 个在 iOS 13 下支持的 URL，大家可以浏览看是否有满足自己需求的点。需要注意的是：这些 URLs 随时可能在未来 iOS 版本中移除或被 Apple 审核团队以 Private API 为由拒绝上架。

### 🐕 [Reverse Engineering Swift Applications](https://github.com/iOS-Reverse-Engineering-Dev/Swift-Apps-Reverse-Engineering/blob/master/Reverse%20Engineering%20Swift%20Applications.pdf)

[@极速男孩](https://github.com/ztlyyznf001)：本篇文章主要介绍了如何去反编译一个 Swift 的 app 。首先介绍了使用如何通过 Name Mangling 和 swift-demangle 来反编译得到一个 Swift 的 app 中的方法。Class Dump 现在已经对 Swift 提供了有限的支持。最后探索了去 hook swift 中的方法的可能。

## 代码

### [基于 NSProxy 开发的支持数据绑定、事件绑定的库](https://github.com/ghwghw4/GICDataBinding)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：GICDataBinding 是一款基于 NSProxy 开发的数据绑定库，支持数据绑定(单向、双向)和事件绑定，重要的是支持 JS 表达式，当然也支持 Swift 开发，但是要求 Swift 中的数据类型必须是 NSObject 子类。基于 GICDataBinding 数据绑定系统，可以做一些之前实现起来比较复杂的功能，比如重新思考 ViewModel 的定义，将 ViewModel JS 化、配合 Texture 实现整个 UI  基于绑定系统的可响应式设计等。

### [Flutter 动画组件](https://juejin.im/post/5d9c701e6fb9a04e187c9799?from=timeline&isappinstalled=0)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：[Flutter Animation Set](https://github.com/YYFlutter/flutter-animation-set) 由 YYFlutter 团队开发, 简洁的 API , 简化了动画实现, 特别是组合动画. 项目默认实现了不少酷炫的效果, 开箱即用.

### [Yaap: Yet Another (Swift) Argument Parser](https://github.com/hartbit/Yaap)

[@anotheren](https://github.com/anotheren)：Yaap 是一个 Swift 写的 CLI 库，它使用了 `Mirror` 和 `Property Wrapper` 简化参数和选项的声明，并具有以下特性：

* 强类型的参数和配置解析；
* 自动生成帮助和使用信息；
* 多命令路由；
* 智能拼写错误提示

如果你也在从事命令行相关的开发，不妨试一试。

### [xcderiveddata](https://github.com/NSHipster/xcderiveddata)

[@Jimq](https://github.com/waz0820)：用于打印 Xcode 工程的派生数据目录（derived data directory）的命令行工具，也支持把结果传递给 xcodebuild 或其他命令去自行化你的构建过程。

## 音视频

### [ggtalk | 互联网公司的开发流程](https://talk.swift.gg/47?from=timeline&isappinstalled=0)

[@ggtalk](https://talk.swift.gg/)：最近几个月翻译组的大事之一，就是蓉老师的开发流程调研。为了获得最新最全的信息，专程去广州和各位大佬讨论开发流程。蓉老师基本聊遍了国内的一线互联网公司，整理了一份文档，会在这期中详细介绍。

除了介绍流程，我们还讨论了一些相关内容，比如流程存在的问题、国内流程做的好的公司、研究流程对我们自己的意义等等。如果你的团队正面临流程问题，应该能从这期节目中获得一些灵感。

这期讲的内容比较长，容易走神，大家可以对照着文字版来听：[文字版流程整理摸我](https://github.com/numbbbbb/ggtalk-rss/blob/master/development_process.md)。

## 内推

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