# 老司机 iOS 周报 #35 | 2018-09-10

![ios-weekly](../assets/ios-weekly.png)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### [Swift Server 工作组](https://swift.org/server/)

Swift Server 工作组现在正式宣布进入下一个阶段，工作组接下来的目标是建立一套健康强壮的生态系统，让开发者可以更容易找到高质量的库和工具。其实早在 2016 年这个工作组就已经成立了，当时的目标是创建一套通用的底层 API，供上层的 Swift 服务端框架使用，这就是 [Swift-NIO](https://github.com/apple/swift-nio)，那么接下来实际要做些什么呢？

类似于 Swift 的核心开发团队，这个工作组会负责提供总体的技术方向和制定标准，围绕 Swift Server 去构建一系列的服务端生态，工作组的成员包括了来自苹果，IBM 和 Vapor 的工程师，他们也会积极参与开发，并且希望社区也可以参与到这个过程中，目前工作组已经[在论坛里列了一份草稿](https://forums.swift.org/t/server-work-group-new-focus-areas/15969)去描述未来的工作方向，包括了工具链，Database Driver，分布式系统架构等等。

BTW，Swift 官网把 Server Work Group 放到了 Focus Areas 那一栏里，表现出了对于服务端重视。（同一栏里的还有 ABI Stability）

### [10 月 3 号起所有 App 必须在 App Store Connect 里配置隐私政策链接](https://developer.apple.com/news/?id=08312018a)

10 月 3 日起，所有新的应用和更新的应用程序都必须在 App Store Connect 里配置隐私政策链接。隐私政策必须清晰且直白的告知用户，他们的应用会收集什么数据，以及根据他们的隐私保护协议，这些被收集好的数据会被如何利用，幷确认是否有第三方机构有权接触到这些数据。

## 文章

### 🐕 [Early returning functions in Swift](https://www.swiftbysundell.com/posts/early-returning-functions-in-swift)

Early Return, 顾名思义，就是早点儿 return 的意思。作者指出当我们做一些分支逻辑的时候，结合 guard 来在不满足条件的时候直接 return 掉 function，可以使得我们的代码更加清晰，以及更易于 debug。不过我个人认为对于类似的逻辑，更合理的逻辑应该是用 `do{} while(false)`, 在不满足条件的时候直接 break 这样确保函数有一个单一的 exit point，更有可维护性。除了 Early Return，文章还推荐使用函数来封装复杂的条件判断，使代码更具可读性。

总体来说，文章深度一般，但是探讨的 case 还是比较有趣的，可以看看。

### 🐎 [TODO FIXME And Compiler Directives](https://useyourloaf.com/blog/todo-fixme-and-compiler-directives/)

Swift 4.2 中添加了两个新的编译器命令，`#warning("message")` 和 `#error("message")`，可以让你的代码在编译的时候，产生警告及错误。

### 🐎 [iOS App 连接外设的几种方式](https://segmentfault.com/p/1210000009602953/read)

如果开发的应用功能涉及到和硬件交互，那么知道 iOS app 连接外设有几种方式就很重要了。

- 无线的连接是日常里非常常见的蓝牙、WIFi。
- 有线分成两派：
  - MFI：苹果认证的外设。亲儿子 CarPlay 是特供的 NCM。其他外设则是基于 External Accessory Protocol，通过引入 ExternalAccessory.framework 进行通讯。但是 MFI 的申请门槛非常高。
  - 没什么卵用的 USB 热点共享。

> [spirit-jsb](https://github.com/spirit-jsb) 推荐

### 🐎 [iOS 如何精确还原 UI 稿多行文字间距](http://joeshang.github.io/2018/03/29/ios-multiline-text-spacing/)

大家开发中一定遇到过文字间距如何精确还原的问题，不论是 `PhotoShop + 标注工具`还是 `Sketch` 。文章介绍了通过设置 `minimumLineHeight ` `maximumLineHeight `，然后利用 `baselineOffset` 修正完美还原多行文本间距。

### 🐎 [Why you’re not supposed to call description](https://oleb.net/2018/dont-call-description/)

大家在使用 Swift 的时候，一定会经常把一些任意的字符串、整型或者对象作为调试信息的一部分来输出到控制台。可能你注意过 CustomStringConvertible 和 CustomDebugStringConvertible 这两个协议，还有 String(describing:) 但是却不太清楚其中有什么区别。本文作者讲解了这几个类型分别做些什么，以及为什么使用时调用 String(describing:) 和 String(reflecting:) 是最佳的选择。

### 🐎 [Practical Dynamic Type](https://medium.com/livefront/practical-dynamic-type-d2b5774e8a8a)

在 iOS 11 之前，如果想根据 iOS 系统字体大小来动态调整字体尺寸，只能观察 UIContentSizeCategoryDidChange，并在变动发生时手动渲染视图。但 iOS 11 推出了一些改进，方便 app 针对视弱用户开发辅助功能，作者在这篇文章里展示了如何实际利用 iOS 11 对 Dynamic Type 的提升，对视弱用户提供完整的辅助功能，同时还能支持之前的 iOS 版本。

### 🐎 [iOS App 后台任务的坑](https://mp.weixin.qq.com/s/MW02G1qiyce9v2cRYHCzLQ)

Peak 最近一直在调研和分享 Background Crash 相关的知识，比如 32 期周报中推荐的『[iOS App 后台 Crash 调查](https://mp.weixin.qq.com/s/8yOhyTDzFjFlqj_3tol-GQ)』一文。而这篇文章则是他最近这段时间调研结果的总结。文中提到，涉及 Background Task 的 Crash 主要有以下三种类型：

- 0xdead10cc - 为了保证 Extension 和 Host App 对 DB 操作的数据库完整性，系统强杀应用；
- 0xbada5e47 - 发起过多的 Background Task，或者 Background Task 在超时之后会调用 expiry handler 超过几秒钟，都会被系统强杀；
- 0x8badf00d - 主线程卡死，被系统的 WatchDog 强杀；

另外此类 Crash 第三方的收集框架捕获不到，所以需要借助苹果自带的 Crash 日志才能排查。

### 🐎 [打造高可拓展的 iOS KeyValueStore](https://xiangwangfeng.com/2017/01/20/打造高可拓展的-iOS-KeyValueStore/)

本文循序渐进地讲解了如何打造一个高可拓展的 iOS KeyValueStore。从最开始一个 Key,一个 Data 的表,逐步讲解如何支持存储元数据，分组，索引。行文流畅，没有废话，值得一看。

### 🐢 [MacOS 的安全和隐私指南](https://github.com/drduh/macOS-Security-and-Privacy-Guide/blob/master/README-cn.md)

本文翻译自 drduh 的一篇文章， macOS Security and Privacy Guide。如今用户电脑的安全及隐私问题越来越被重视起来，无论是公司还是个人。本文对于想要提高个人 Mac 的安全性以及隐私性的人比较有帮助。文章从 Web、 VPN、防火墙、系统服务等很多点详细讨论了 MacOS 的安全和隐私问题，读完这篇文章，相信对于这方面的很多疑问都可以迎刃而解。

### 🐎 [Swift Knowledge Base updates for Swift 4.2](https://www.hackingwithswift.com/articles/124/swift-knowledge-base-updates-for-swift-4-2)

Swift 4.2 正式版再过几天就要发布了，这一次更新虽然只跨了一个小版本，但还是带来了许多实用的新特性，还没来得及了解的同学推荐看一下这篇文章。

### 🐎 [Hacking Hit Tests](http://khanlou.com/2018/09/hacking-hit-tests/)

来自 Soroush Khanlou 的一篇文章。文章介绍了 HitTest 这个来自 UIKit 的快被大家遗忘了的方法。

在一些特定情况下，开发者可能会需要 Override HitTest 方法来达到一些特定的目的。作者就遇到了类似的情况。而 Override HitTest 在很多时候能给开发带来更多的可能。相信大家若是对 HitTest 有更深入的了解，也能对 iOS 开发有更深的理解。

### 🐢 [CLI: improved](https://remysharp.com/2018/08/23/cli-improved)
作为开发人员，一般都离不开命令行工具，本文的作者分享了自己在命令行工具上的一些积累和经验，帮助大家更好地提升工作效率
* `cat`的升级工具
  1. 你可以使用 [ccat](https://github.com/jingweno/ccat) 来对`cat`的结果进行颜色分类
  2. 你可以使用 [bat](https://github.com/sharkdp/bat) 来对`cat`的结果进行二次检索和分页
* `ping`的升级工具
  1. 你可以使用 [prettyping](https://github.com/denilsonsa/prettyping)，这个工具对ping的返回结果做了一层GUI的封装
* `ctrl+r`（回溯过往输入的命令）的升级工具
  1. 你可以使用 [fzf](https://github.com/junegunn/fzf) 来更好地进行回溯匹配
* `top`的升级工具
  1. 你可以使用 [htop](https://github.com/hishamhm/htop) 获得更多的交互命令来显示系统硬件信息
* `find`的升级工具
  1. 你可以使用 [Alfred](https://www.alfredapp.com/)，这个 app 能够帮助你更好地检索文件
  2. 你可以使用 [fd](https://github.com/sharkdp/fd) 来获得更好的文件检索功能
* `du`的升级工具
  1. 你可以使用 [ncdu](https://dev.yorhel.nl/ncdu)，这个工具可以跟 iTerm2 更好地结合使用
  2. 你可以使用 [nnn](https://github.com/jarun/nnn)，这是一个磁盘空间管理的高性能工具
* `man`的升级工具
  1. 你可以使用 [tldr](https://github.com/tldr-pages/tldr) 更好地阅读帮助文档
* `grep`的升级工具
  1. 有些时候，`grep`的对于复杂的过滤规则力不从心，这个时候可以考虑用`ack || ag`来代替
* `grep et al`的升级工具
  1. 你可以使用 [jq](https://github.com/stedolan/jq) 来更好地处理 json 转换的问题
* 更多更好的工具等待挖掘中
  1. [ponysay](https://github.com/erkin/ponysay)替代`cowsay`
  2. [csvkit](https://csvkit.readthedocs.io/en/1.0.3/)替代`awk et al`
  3. [noti](https://github.com/variadico/noti)替代`display notification`
  4. [entr](http://www.entrproject.org/)替代`watch`



## 设计

### [Lessons Learned From the RWDevCon 2018 Design Lab](https://www.raywenderlich.com/5548-lessons-learned-from-the-rwdevcon-2018-design-lab)

在今年 RWDevCon 2018 大会的 Design Lab 中，两个资深 UI/UX 设计师解答了 Ray Wenderlich 读者有关 app 设计的问题，其中包含了很多常见解决方案，具体分为以下四个方面：格式塔理论、原生组件及行为、竞品研究和产品文案。阅读这篇文章可以让你在创建移动应用时避免犯同样的错误。

## 书

### [Mac 高效开发指南](https://xiaozhuanlan.com/Effective-Mac)

bestswifter 同学一直非常的重视工作效率，本书从系统配置、Mac 工作流、编辑器之神：Vim、Git 从入门到进阶、终极武器 Zsh 等方面去打造一个高效的工作流，致力于提高 Mac 工作效率的实用手册。不管你是入门新人，还是撸码老手，都能从书中学习到很多你平时不会注意的，提升工作效率的点。效率上去了，你才能有更多的时间，去对自我进行提升。

## 音视频

### 泊学技术视频

[构建自己的Docker镜像](https://boxueio.com/series/docker-based-vapor-env/episode/421)
Docker用类似git的方式管理了我们对容器的修改，这也就意味着，我们可以“提交”这些修改，查看修改的历史记录，以及制作新的镜像。

[使用Dockerfile自动化镜像构建](https://boxueio.com/series/docker-based-vapor-env/episode/422)
如何自动化镜像的定制过程呢？你可以把每一步修改的动作写在Dockerfile里，然后执行docker build就好了。

[通过Docker执行任意版本的Swift](https://boxueio.com/series/docker-based-vapor-env/episode/423)
这段视频里，我们基于Swift官方提供的二进制程序，制作一个可以执行任意版本Swift的镜像，有了它，我们就能更方便、安全的实验各种Swift新特性了。
[视频链接]

## 内推

- [北京-蚂蚁金服 招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://weibo.com/1926303682/profile)，[@四娘](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)，[@JasonYuh](https://weibo.com/jasonyuh)，[@老老老老老老老驴](https://weibo.com/u/6090610445)

## 说明

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

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