# 老司机 iOS 周报 #47 | 2018-12-10

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

## 福利

🌟 [我们发福利啦~](https://www.wjx.top/jq/32164990.aspx)

周报已经快陪伴大家走过一年的时间，非常感谢各位朋友的支持和厚爱。为了在 2019 年能更好地为大家服务，我们举办了一个问卷调查活动。在 12 月 27 日，我们会在参与问卷的朋友中选取合适的几个人赠与学习大礼包和现金奖。至于奖品是什么，大家可以在[这条微博](https://weibo.com/3165754627/H6t1EmqRh)中了解，转发还有额外的抽奖~我们渴望听到你们的声音！

## 新闻

### 🌟 [Result 类型将加入标准库](https://forums.swift.org/t/accepted-with-modifications-se-0235-add-result-to-the-standard-library/18603)

Result 类型经历了一整个月的讨论终于决定加入标准库，预计 Swift 5 就能完成实现，这次的提案关注的人非常多，经历了两次修改三次讨论才最终通过。

讨论的焦点主要集中在 Result.Error 的定义上，喵神也写了一篇文章[讨论这个问题](https://onevcat.com/2018/10/swift-result-error/)，一句话总结就是，Swift 出于兼容性和实现的考虑，一直没有实现 Typed Throw，所以 Result.Error 很难实现为一个泛型参数，甚至在草案阶段决定让 Result.Error 不遵循 Swift.Error。

后来 Swift 团队专门给这个提案开了后门，调整了[泛型参数的实现](https://github.com/apple/swift/pull/20629)，让 Swift.Error 成为了目前唯一一个可以作为泛型参数存在的泛型类型，以便与 Cocoa 的 API 进行更好的交互，才结束了这场讨论。

从这一次也可以看出，Swift 核心团队还是希望让抛出的错误能够有具体的类型（而不是一个泛型的 Swift.Error），所以才会开后门使用这种过渡性的方案，这次的提案让我感觉 Typed Throw 还是有希望的。

另外如果大家有兼容性方面的担忧的话，由于提案的作者是 Alamofire 负责人之一，所以最终通过的版本与 Alamofire 采用的 Result 差异很小，如果你采用的是这个版本的 Result 的话，就不必过多担心。

### [Flutter 1.0 正式版: Google 的便携 UI 工具包](https://mp.weixin.qq.com/s/hCIN42OMmmc6HkOveegwWQ)

万众瞩目的 Flutter 1.0 终于正式发布，从我们首次看到 Flutter 的 Beta 测试版，到如今的 1.0 正式版，总共经过了 9 个多月。Flutter 的高性能跨平台渲染与热重载等优秀的特性相信会让移动开发者们眼前一亮，在早先 beta 期就已经有很多公司与团队进行了这方面实践，现在 1.0 来了，作为移动开发者当然要感受一下
 Flutter 的魅力。
 
## 文章

### 🌟 🚧 🐢 [Dependency Injection on iOS — part 1-4](https://medium.com/@fernandodelrio/dependency-injection-on-ios-part-1-4-8847f302b3d9)

本长文的主题是关于架构的，切入点是依赖注入在 iOS 上的应用，共分成了四篇文章。作者从描述模块耦合的概念，到介绍使用依赖注入能带给我们的好处（可复用性、可维护性、可扩展性和可测试性），以及推荐了一款依赖注入的框架（Swinject）后开始进入正题 —— 通过编写和优化一个简单应用来实践依赖注入的概念和感受它带来的好处。全文结构非常清晰，举例也很详尽，是一篇学习和感悟架构，特别是依赖注入的好文章。

### 🌟 🐢 [iOS App冷启动治理：来自美团外卖的实践](https://mp.weixin.qq.com/s/jN3jaNrvXczZoYIRCWZs7w)

文章整理了 APP 冷启动的三个阶段，对三个阶段分别提出了存量解决方案、管理增量方案和监控体系。下面几点是文章观点的总结：
- 冷启动阶段T1： 点击 APP 图标进入至 main 函数，这两者之间的耗时
    - 代码瘦身，废弃无用代码和资源文件
    - 延时 +load 函数，将函数延迟到合适的触发时机，比如说冷启动结束之后
- 冷启动阶段T2： main 函数后至 didFinishLaunchingWithOptions 函数执行完毕，这两者之间的耗时
    - 整理 APP 启动阶段，顺序化子项目的启动顺序
    - 分阶段启动，利用自验的 `Kylin` 项目，将子项目的注册信息（启动阶段、启动需要执行的代码等）写入 `__DATA` 数据段中，运行期读取 `__DATA` 段代码，并赋予执行。
    - 利用工具（Time Profile/自研的 Caesium）整理执行过程中的一些隐晦耗时，比如归档操作、IO操作、资源任务等
- 冷启动阶段T3： didFinishLaunchingWithOptions 函数至首页渲染完成，这两者之间的耗时
    - 将 APP 的 RootViewController 设置为闪屏，同时进行首页UI的构建，加快 RootViewController 的加载
    - 整理首页加载的串行操作，优化体验成并行操作
- 数据监控：除了上述的优化外，建立监控体系，保证持续优化成果
    - 冷启动的开始与结束时间对比，值得注意的是这里的开始时间采用了 APP 进程创建时间
    - 冷启动过程中的关键节点都有手动添加的测速点，并自动上报

### 🐕 [如何提高工作效率 - 自动化篇](https://juejin.im/post/5bfac61ee51d454af013a900)

在本文中，作者向我们介绍了 `macOS` 环境下几种自动化的实现方案，并以自己的亲身实践案例为我们讲述了大体的实现流程，以下为文中的案例：
- 利用 `Shell Script` 和启动加载任务，在开机过程中自动配置双网卡
- 利用 `Apple Script` 访问 `Microsoft Outlook` 自动生成和填充邮件，完成每日邮件汇报工作
- 利用 `Apple Script` 和热键，快速定位当前 Finder 路径到 iTerm 的窗口当中
- 利用 `Apple Script` 和 `Alfred WorkFlows` 进行快速保存/搜索记录瞬间想法
- 利用 `Shell Script` 和 `Apple Script` 定时拉取并编译代码

### 🐢 [iOS 内存管理的那些事儿](https://juejin.im/post/5c0744f6e51d45598b76f481?utm_source=gold_browser_extension)

`iOS` 中的内存管理一直是令开发同学们比较头痛的事情，自 `ARC` 问世以后，虽然不再需要我们手动管理内存，但是掌握内存管理的相关知识依然是十分有必要的。

作者通过研读源代码的方式向我们详细讲解了内存管理的实现原理，并列举了一些日常开发中容易导致内存泄漏的常见场景，掌握这些有助于我们在复杂业务场景中更好的避免内存相关的问题。并且作者后续会介绍一些开源检测内存泄漏的工具及实现，大家可以持续关注。

### 🐕 [Rethinking Design Patterns in Swift: State Pattern](https://khawerkhaliq.com/blog/swift-design-patterns-state-pattern/)

这篇文章展示了如何在 Swift 中实现状态模式（State pattern），借助 Swift 强大的能力，让模式实现变得简单而又灵活。此文通过一个实例来探索状态模式的各个方面，并且评估其处理需求变更的能力。然后还会讨论实现该模式的关键考量、收益以及实际应用。

### 🐎 [技术人的成长](https://xiaozhuanlan.com/topic/8719460352)

作者从自身的经验和感悟出发，从三个维度描述了技术人的成长道路
- 抵御所谓“全栈”的诱惑，聚焦领域。
- 扩大视野，提高技术敏锐程度。
- 多看多尝试，不要空想

总体来说，就是到了一定的技能熟练度以后，从广度上拓展自己的知识面，从深度上钻研某一个垂直领域，将能够极大的帮助大家从普通工程师进阶到高级工程师。

### 🐕 [Category：从底层原理研究到面试题分析](https://juejin.im/post/5c0332ba6fb9a049d4418cac?utm_source=gold_browser_extension)

随着移动端的发展，从 `weak` 面试题的一步步升级就能明白，我们应该多进行深入了解底层实现细节。

作者从源码进行一步步分跟踪和分析，整理 `Category` 整个的执行顺序，非常适合想了解其工作原理的同学们看。并且还提供了一个简单动画示意图。通过阅读，可以清晰地回答面试中常见的几个 `Category` 相关的问题。

另外 `load` 和 `initialize` 也给出了源码分析和对比表格。在准备面试的同学，尤其适合阅读一番。

### 🐢 [iOS: ARM64不定函数传参问题调试剖析](https://github.com/SwiftOldDriver/iOS-Weekly/issues/950)

从实际开发中遇到的一个平台相关的 crash 问题出发，通过代码对比，研究了在 x86-64 架构和 ARM64 架构对于不定函数参数传递的方式——特别是 iOS 系统的不同之处，同时也解答了为什么在调用带不定参数类型的 C 函数指针时，应该显示将其强转为对应参数类型的函数指针问题。

### 🐢 [【译】Swift 中的面向协议编程：是否优于面向对象编程？](https://swift.gg/2018/12/03/pop-vs-oop/)

本篇是 SwiftGG 最新出炉的译文，原文在上月 [周报第42期](https://juejin.im/entry/5bdf9f8ae51d453bab19e546) 推荐过，可以再回顾一下。

### 🐢 [Swift Protocols: Tips and Tricks](https://www.hackingwithswift.com/articles/138/swift-protocols-tips-and-tricks)

`Protocol` 是 `Swift` 的基础，我们可以定义方法，甚至提供默认实现。本文介绍了 `Protocol` 的一些小 tips，比如 `协议组合`、`Protocol extensions`、利用  Protocol 实现`模板方法设计模式`等。

### 🐎 [8 Useful Swift Extensions](https://www.hackingwithswift.com/articles/141/8-useful-swift-extensions)

文中列举了 8 个Swift中比较实用的 Extensions，比如字符串中字符个数、计算两个日期之间的天数，给字符串添加前缀等。当然，我觉得这 8 个远远不能满足于日常的开发，所以我更推荐大家看一下 [SwifterSwift](https://github.com/SwifterSwift/SwifterSwift) 这个库，里面都是很实用的 Extension。如果你有什么不错的 Extension 推荐，也可以给这库贡献自己的代码哦。

### 🐕 [simctl](https://nshipster.com/simctl/)

`simctl` 是苹果提供给开发者驱动 Xcode Simulator 的命令行工具。我们能够通过它做到：启动模拟器，在桌面和模拟器之间复制和粘贴，进行视频录制等。

### 🐢 [Swift Program Distribution with Homebrew](https://nshipster.com/homebrew/)

本文介绍了当你创建了 mac 上的命令行工具的时候，如何进行分发，文中介绍的工具是 Homebrew 。
1. 创建一个 Makefile 文件
2. 编写一个 Homebrew formula （相当于编译打包）
3. 自测需要，可以先试试本地安装，确保安装过程顺利
4. Homebrew 安装 formula 是基于 Tap 的，所以需要发布一个 Tap 
5. 用户可以根据远端的 Tap 来安装 formula 了

### 🐢 [与 JOSE 战斗的日子 - 写给 iOS 开发者的密码学入门手册](https://onevcat.com/2018/12/jose-3/)

JOSE (Javascript Object Signing and Encryption) 定义了一系列标准，用来规范在网络传输中使用 JSON 的方式，本文介绍了 如何使用 Security.framework 处理 JOSE 中的验证。对比已有的 JOSE 实现框架，譬如 [JOSESwift](https://github.com/airsidemobile/JOSESwift) ，[JSONWebToken.swift](https://github.com/kylef/JSONWebToken.swift) ， [Swift-JWT](https://github.com/IBM-Swift/Swift-JWT) ， [vaper/jwt](https://github.com/vapor/jwt) 等等，作者的方案优势在于同时支持 RSA 和 ECDSA ，并且不需要引入复杂的依赖关系

## 设计

## 工具

### [Publish Your Flutter App on macOS](https://feather-apps.com/)

最近 Flutter 扩张势头似乎没有停下来的意思，反而看起来越来越凶猛了。

Flutter 除了可以写 iOS，Android App 之外，其实，也是“支持” macOS， Windows 和 Linux 的。只是这并不是那种官方支持，而只是把移动版 App 直接跑在 Desktop 上， 类似明年 macOS 要支持 iOS App 运行一样。

Google 的 Github Repo 下有一个叫 [flutter-desktop-embedding](https://github.com/google/flutter-desktop-embedding/) 的项目，就是做这样的桥接工作的，只是这库确实不是很好用，使用比较麻烦。

于是有第三方开发者做了基于 flutter-desktop-embedding 的工具，可以方便的将你已有的 Flutter 工程打成 macOS 包。同时他们还做了一个小型商店，开发者可以一键上传，其他人也可以很方便的下载安装。

有兴趣的童鞋可以尝试一下把自己的 Flutter App 跑在 macOS 上，来看看那是什么样的感觉。

## 音视频

### [ggtalk | 聊聊 Swift 这四年（下）](http://talk.swift.gg/6)

上周推荐了上部，收到了不错的反响。在这期（下）中，几个程序员聊了最近几年 Swift 领域发生的事情，比如 jspatch 导致的大规模下架事件，第二第三届 Swift 开发者大会的一些故事。最终探讨了 Swift 的未来，内容同样精彩，不容错过。

## 内推

- [北京-百度网盘 持续招 iOS 开发](https://talent.baidu.com/external/baidu/index.html#/jobDetail/2/102507)：社招、应届、实习均可。项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来切磋，也欢迎计算机基础好的小白来共同学习。简历发邮箱 xuyafei01@baidu.com，暂不考虑的也欢迎微博私信 [@小非86](https://weibo.com/xuyafei86) 聊聊~

- [北京-蚂蚁金服 招iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)：负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到：weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com （同一个邮箱）或者微博私信 [@折腾范儿_味精](https://weibo.com/agvicking) 了解情况。

- 上海即刻：如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给 Jason（即刻 iOS leader）: jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

- [杭州奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)：奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

- [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)：如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

- [北京字节跳动 iOS 团队持续招人中](https://job.toutiao.com/society)：简历可以发送到邮箱 raozhizhen@gmail.com，或者添加我（[@AidenRao](https://weibo.com/AidenRao)）的微信 jingmu1994 了解更多公司及岗位信息。

- [北京百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)：百度教育事业部，地点：北京西二旗。部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

## 关注我们

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

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 本期编辑

[@四娘](https://kemchenj.github.io)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)，[@kyo](https://github.com/KyoLi)，[@tom510230](https://xiaozhuanlan.com/u/6682065345)，[@anotheren](https://anotheren.com)，[@水水](https://www.xuyanlan.com)，[@looping](https://github.com/looping)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@邦Ben](http://weibo.com/linwenbang)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)，[@JimQ](https://github.com/waz0820)

## 说明

🚧 表示需翻墙，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
