# 老司机 iOS 周报 #32 | 2018-08-20

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

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

## 新闻

### [最亲民的 HomeKit：用 Siri 控制米家智能硬件](https://weibo.com/ttarticle/p/show?id=2309404273586260070285)

一直以来，HomeKit 配件因为[过于昂贵的原因](https://www.apple.com/cn/shop/accessories/all-accessories/homekit)，阻碍着它进入寻常百姓家。另一方面，国内小米的生态布局已经初见规模：开关、插座、灯等品种繁多。但是，Apple 的生态中，使用 Siri 来控制家中的硬件无疑是最方便的。而通过米家应用来控制硬件总有点隔靴搔痒的感觉。为此，先行者们曾考虑使用树莓派来曲线救国，不过操作复杂，对一般用户还门槛颇高。这一次，米家原生的 HomeKit 控制器来了，使用原汁原味的家庭和 Siri。如果你正准备做智能化改造，不妨试一试。

## 文章

### 🌟 🐎 [为什么大公司还在采用过时的技术？](https://mp.weixin.qq.com/s/4ndekCuS9n4eYpUIj80Eiw)

本文描述了一个很现实的问题，就是部分人费劲心力加入的大公司，实际上却跟自己想的不一样。其实很多大公司都是从小公司发展来的，不可避免会遗留一些古董，甚至不良风气。从公司盈利的角度看，成本是首先需要考虑的，如果重构后带来的收益大于继续修补维护，那么大部分老板会愿意进行改良。但假如没有过硬的技术能力，大公司是不太可能会让你拿新技术试水的。并不是大公司技术不行，而是他们懂得风险控制，想寻找最合适的人来做而已。正如作者在文中所说，“工作中，不断的提升自己，少一些抱怨吧”。所以我们更应该努力成为公司老板们努力寻找的 —— 我们需要的就是你这样的 —— 人。

### 🐕 [Let it Rip](https://indiestack.com/2018/08/let-it-rip/)

作者记录了一次用 LLDB 的 regular expression breakpoints（正则表达式断点） 和 breakpoint commands 结合起来有效地追踪一个看起来毫无头绪的问题根源的过程。下一次当你面对貌似束手无策的 warning / error 时，考虑设置一个广泛的、基于正则表达式的断点和一系列命令来帮助你吧。

### 🐕 [谈谈 RxSwift 和状态管理](https://juejin.im/post/5b6d72636fb9a04fd93e611b)

现在大前端的概念非常深入人心，在大前端中一个体系是几乎无法被忽略的：React 体系。React 体系深入地影响了前端、客户端近几年的技术发展。从基于 JS 的 React，Vue，Rax 到基于客户端语言的 RxSwift，RxJava，虽然实现细节各有各的不同，但背后反映的思想都出奇的一致：通过利用函数式和响应式编程的思想，总结出了一套新的模式来更好的实现业务需求。

这篇文章探讨了在前端中已经取得广泛应用的两个模式，基于 React 的 Redux 和基于 Vue 的 VUEX，在 Swift 中的落地实现，分析了其中的优劣，并且在最后提出了一种相对简化的模式。文章写得循序渐进而且介绍相对全面，即便是之前并不熟悉这些概念的同学也能很容易看懂，推荐。

### 🐎 [把 Objective-C 类迁移到 Swift](https://oleb.net/2018/objc-swift-transition/)

30 期周报中 [Migrating an Objective-C class to Swift](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/Reports/%2330-2018.08.06.md#-migrating-an-objective-c-class-to-swift-a-piecemeal-approach) 的续篇，在重构的同时保持原有功能并且继续添砖加瓦，除了 extension 之外最显而易见的方法就是继承，逐渐把 Objective-C 类的抽象挪到 Swift 类里就可以平滑地完成迁移，其中的优劣势可以看 Ole 给你细细分析。

### 🐕 [Scalable bulleted lists with UILabel or UITextView](https://bendodson.com/weblog/2018/08/09/bulleted-lists-with-uilabel/)

一个使用 UILabel 实现段落样式的范例，主要是通过一个 NSParagraphStyle 的 headIndent 属性来完成整体段落缩进（首行除外）。

### 🐎 [iOS App 后台 Crash 调查](https://mp.weixin.qq.com/s/8yOhyTDzFjFlqj_3tol-GQ)

Peak 最近在调查一个诡异的 crash，该问题无法通过 App 内部的 crash 捕获框架获取日志，但可以通过 Xcode 查看系统自带的崩溃日志看到。经过排查，最终将问题锁定在了系统为了保证本地共享目录下数据库的同步，从而强杀 App 生成 code 为 `0xdead10cc` 的闪退日志。

在这次问题排查后，Peak 还总结了现在 iOS 后台任务运行的一些场景以及一些无法通过 App 内部 crash 收集工具的 crash 类型，对于我们平常排查闪退问题，有一定参考意义。

### 🐎 [Creating a Bottom Sheet](https://skagedal.github.io/2018/08/03/bottom-sheet.html)

这篇文章比较详细的描述了如何实现一个类似于系统地图首页的底部带有一个列表的界面。虽然说这并不是一个很难的问题，但是作者提供的思路包括他的代码实现，都给人以一种十分精简的感觉。特别是通过组合的控制器，而不是在一个控制器上面操作不同的视图方式也给我带来不少新的思考。

### 🐕 [端内外融合拉新，用户增长 -- 相关技术方案选型分析](https://juejin.im/post/5b762f876fb9a009b03623a8)

H5 网页端有着便于传播，方便在各类 APP 与浏览器容器中进行推广，而 APP 客户端用来承接，有着更好的体验与长久用户存留的收益与价值。如果能将用户从 H5 -> APP 的流程进行打磨，将体验进行优化，就能极大程度的提高拉新的转化率，而这其中的关键就是打破 H5 -> APP 之间传递数据，进行无缝衔接的方式。

众所周知，从 H5 -> APP 传递数据广泛使用 deeplink ，也就是通过 Scheme/UniversalLink 直接唤起 APP 进行无缝衔接。那么假如你在浏览 H5 网页的时候未安装 APP，那么如何无缝的实现 APP 刚一安装就能自动拿到H5数据，从而进行体验上的无缝衔接呢？本文会带给你答案。

### 🐎 [The 5 Whys for Product Managers](https://www.bignerdranch.com/blog/the-five-whys-for-product-managers/)

“5 个为什么”是借鉴自丰田产品系统的分析技术，用于寻找问题的根本原因。这个模型鼓励连续回答几个简单的“为什么”，然后会发现每个看似是技术上的问题，最后归根结底都是人的问题。但是“5 个为什么”并不是为了归责，而是为了找出异常出现的根本原因，以便让团队不断进步，让类似的问题不再发生。

### 🐢 [How to Build Swift Compiler-Based Tool? The Step-by-Step Guide](https://www.polidea.com/blog/how-to-build-swift-compiler-based-tool-the-step-by-step-guide)

Polidea 开源了一个名为 Sirius 的代码混淆工具，他们同时也根据在实现 Sirius 过程中遇到的问题和相关经验，写了一篇关于如何使用 Swift Compiler-Based Tool 的文章。

文章分两部分介绍他们在实现 Swift 代码混淆工具过程中的经验：

1. 如何拓展 Swift 编译器，让其可在编译和集成阶段调用自己写的工具。
2. 如何使用编译器内部方法，从 LLVM，Clang 和 Swift 本身提供的功能来增强写的工具。

文章比较长，最好大家能亲自动手实践一次，才能更好的理解文章。

### 🐕 [Sourcery - Swift元编程实践，告别样板代码](https://juejin.im/post/5addec4df265da0b7025860e)
Swift Codable 优化了解析 JSON 的体验。但是如果有一个属性的解析名称需要自定义，或者跳过某个属性的 JSON 映射，都需要自己手写全部的 Codingkey。本文介绍了利用 Sourcery 的元编程能力来优化一些需要手写 Codingkey 的场景。

### 🐎 [Trimming long argument lists in Swift](https://www.swiftbysundell.com/posts/trimming-long-argument-lists-in-swift/)

当我们想为一个已有的方法增加新功能，但又不想重新写一个类似方法的时候，通常会往参数列表里增加新的参数。虽然每一次修改看起来都没什么问题，但是久而久之参数列表会变得冗长，对其他维护者来说也越来越难以理解。作者列举了几个小技巧，包括通过封装相关联的几个参数为新类型、通过拆分/组合的方法解耦复合逻辑等，展示了如何在扩展功能的同时，最大可能保持代码的整洁性。

## 代码

### [可视化调试时将指针地址转为 emoji](https://gist.github.com/cellularmitosis/d425aae5f1a2e5d9bfa1d4c1a5968d22)

我们调试时经常需要判断两个变量是否是同一个实例，然而大部分时候 `po obj` 只能得到得到一串内存地址，需要人眼去比对。这个 gist 扩展了 `NSObject`，使得 `print obj.asPointer.asEmoji` 可以打印出 emoji 字符(比如 🌰)，而不是指针地址。

## 内推

### [北京-蚂蚁金服 招iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)

蚂蚁金服招聘，负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。虽然招聘链接只给了 iOS 的 JD，但前端/安卓/iOS 都要，要求相近。有兴趣的同学欢迎将简历发送到：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@bytedance.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）
