# 老司机 iOS 周报 #28 | 2018-07-23

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

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


## 文章

### 🐕 [How not to be a mediocre developer](https://hackernoon.com/how-not-to-be-a-mediocre-developer-c59a49f97fc5)

成为优秀程序员的 12 条 Tips，涉及到代码习惯，学习方法以及态度等多个方面，值得大家学习和思考。

### 🐎 [移动应用架构演变及泛前端趋势下移动团队破局](https://mp.weixin.qq.com/s/iHehLneIYibWq6IRjuefxg)

看到这样的标题是不是被吓了一跳。我一直觉得一般标题太牛逼的文章都会有点刻意感，不过看完这篇文章之后打消了我的偏见。这篇文章核心是两部分，首先是回归了移动端工程体系发展的历史，然后是讨论了在现在这个局势下，技术团队和工程师个人的发展方向。作者分析总结的很到位，虽然作者是从 Android 工程师的角度来看的，但是很多建议对 iOS 工程师也同样适用。

文章的最后作者提炼了目前值得投入的几大方向：容器化技术、跨平台开发方案（RN,Weex,Flutter）,体系化运维以及垂直领域技术（音视频，图形图像）。对于目前觉得自己技术深度提升遇到瓶颈的同学，可以参考。

### 🐕 [mock in iOS](https://juejin.im/post/5b4ede9151882536e5177c49)

mock 并不是一种特定的操作或者编程手段，它更像是一种剖析工程细节来解决特殊环境下难题的解决思路。无论如何，如果我们想要继续在开发领域上继续深入，必然要学会从更多的角度和使用更多的工具来理解和解决开发上的难题，而 mock 绝对是一种值得学习的开发思想。本文作者详细列出了什么时候用 mock 以及如何实现 mock 。

### 🐕 [How to write a good software design doc](https://medium.freecodecamp.org/how-to-write-a-good-software-design-document-66fcf019569c)

一般来说在一个大团队或者大公司里，开始动手实现一个新功能之前，开发者需要写好 Design Doc ，然后进行 Design Review 。Design Doc 作为记录，描述设计，并阐述未来实现方案的文档，其重要性不言而喻。然而现实中很多人并不知道怎么去写一份好的 Design Doc 。

而在本文中，作者从她的角度出发，阐述了她心中理想的 Design Doc 的样子。作者同时还在文中提出了几个合理的建议用来判断一个 Design Doc 是不是一个好的 Design Doc ， 值得学习。

### 🐕 [2018年 iOS 面试心得](https://juejin.im/post/5b4cd5aae51d455b5d3efa2c)

关于 iOS 面试的详细攻略，适合最近想要换工作的同学们学习。如果想成为一个合格的 iOS 工程师，赢得面试官的认可，必须要沉下心来，多花精力在各个领域里耕耘，不光是日常应用层面，也需要练习数据结构和算法基本功，同时调整好心态。作者分别从这几个角度出发，给出了自己的一些经验和建议。

### 🐕 [Bug Reporting](https://nshipster.com/bug-reporting/)

“Radar” 是苹果的 bug 追踪系统，不仅可以用于追踪软件、硬件中的功能和 bug，还适用于追踪文档、本地化、web 属性甚至是 Siri 回答的问题。对于苹果员工来说，Radar 指导了从问题报告到问题验证的整个工作流程。但外部开发者是无法直接访问 Radar 的，所以在这篇文章里，知名 iOS 开发者 Mattt 会为你介绍作为外部开发者应该如何报告 bug，包括使用 Apple Bug Reporter、Feedback Assistant 以及一些第三方工具，此外还包括如何撰写 bug 报告，最后还介绍了如何避免让自己提交的 bug 报告石沉大海、杳无音讯。

### 🐢 [苹果 iOS 系统源码思考：对象的引用计数存储在哪里？- 从 runtime 源码得到的启示](https://juejin.im/post/5b4c59a55188251ac9767872)

对框架原理的掌握程度一直是大厂招人考核的一个重点。这篇文章通过对 Objc 源码抽丝剥茧，层层递进地从底层原理解释了 OC 是如何实现引用计数的内存管理方式。这类文章总是不可避免地会包含大量源码片段，不过作者能通过自己的阅读和理解后，梳理出一个清晰的学习目录，且对每段源码的分析都比较到位，很值得同在啃底层源码的同学借鉴。

### 🐕 [WWDC18: A Basic Guide to App Store Connect API](https://medium.com/xcblog/wwdc18-a-basic-guide-to-app-store-connect-api-366208651ac6)

Apple 将 Apple Developer Portal 和 iTunes Connect 结合起来，并将其重新命名为“App Store Connect“。也带来了一些新的改变：

- Transporter 工具支持 linux 系统
- TestFlight 支持可以直接下载安装的公开链接
- 销售和趋势页面的展示
- 更强大的 App Store Connect 移动端

App Store Connect API 是基于 JWT(JSON Web token) 的标准 RESTful API，具备跨平台性以及拥有完整的使用说明文档。通过该 API 我们可以自动化的去管理几乎所有 App Store 相关的内容。例如管理证书、管理配置文件，管理设备和安装包 ID，管理用户、设置用户角色以及 app 的访问权限，管理 TestFlight、公测用户以及公开链接，下载财务和销售报告。在使用 App Store Connect API 之前，你必须生成一个 token。苹果使用 JWT(JSON Web Token)标准在 App Store Connect 和您的终端设备之间建立连接。登录 App Store Connect 网站创建新的 API 密钥，根据密钥生成有时限的 JWT token，就可以通过传递授权标头来使用 App Store Connect API。

### 🐕 [An Introduction to AR Quick Look in iOS 12](https://www.appcoda.com/arkit-quick-look/)

在 iOS 12 里 Quick Look 支持了预览 AR 对象，也就是说可以在邮件、信息和任意支持 Quick Look 的应用中分享 `.usdz` 文件，接收者可以打开并查看 AR 对象而不需要下载其它 app。而且 AR Quick Look 不仅局限于在 app 中使用，甚至连网页也可以整合 AR Quick Look！这篇教程会教你如何在 iOS 应用中整合 AR Quick Look，并且还会用 GitHub Pages 构建一个非常基本的 HTML 网页，为你展示如何给网站添加 AR Quick Look 功能。

### 🐕 [Automatic Screenshots With fastlane snapshot](https://agostini.tech/2018/07/15/automatic-screenshots-with-fastlane-snapshot/)

Fastlane 是一个自动化的工具集，主要用于自动化的打包，发布等工作。本文介绍的是 Fastlane 的一个控件，主要用于自动截屏工作。自动截屏在平时的开发中可能使用的不多，但在自动化测试领域上，是很重要的一个模块，例如对错误时候页面的现场截屏，测试结果的比对等等。Fastlane 只需要简简单单的一点代码，以及一些设置，就可以集成到我们的项目中，使用起来非常方便。对自动化方面有需求的同学不妨看一下。

### 🐕 [Refactoring Swift code for testability](https://www.swiftbysundell.com/posts/refactoring-swift-code-for-testability)

代码的可测试性是衡量代码质量的一个重要标准。如果你还没有写过测试用例，那我建议你应该先补一下这方面的功课。这篇文章为如何更好的测试你的 Swift 代码，提出了两点重构思路：纯粹的函数（Pure functions）与依赖注入（Dependency Injection），并都给出了示例代码。值得想要提高代码质量、以及获得新思路的同学借鉴。

### 🐢 [GraphQL 在微服务架构中的实践](https://draveness.me/graphql-microservice)

之前老司机周报已经介绍了 GraphQL 与 RESTful 之间的异同，GraphQL 对于资源的管理提供了比 RESTful 更多的灵活性，同时也增加了后台服务治理的复杂性。对于大型团队+大型系统的协同开发场景，微服务是已被证明有效的一种后台架构方案，然而微服务架构本身也是一种复杂抽象的架构。当灵活多变的 CGI 设计方案遇上复杂抽象的后台架构，需要考虑的事情将会异常的多，大部分情况下都要摸着石头过河。本文作者通过半年多以来的实践经验，阐述了在工作当中遇到的问题和采用的解决问题的思路，提供了很多很有价值的经验供各位架构师参考。

### 🌟🐢 [The Lotus MVC Pattern: Solving the 5 Issues of the MVC, MVVM and VIPER patterns](https://matteomanferdini.com/ios-architecture-lotus-mvc-pattern/)

> 长文宜细读。

这是一篇长文，作者分析了现有架构的优缺点，之后提出了自己的架构：Lotus MVC `(名称的由来是此架构下各模块之间的类图非常象莲花)`，文章大题分为三个部分：
- 现有 MVC、MVVM、VIPER 架构是怎么分层的，解决了哪些问题，但带来或还有哪些问题没解决；
- Lotus MVC 各模块的角色及关系；
- 通过 Github client app 来讲解 Lotus MVC。

## 代码

### [美团客户端响应式框架 EasyReact 开源啦](https://mp.weixin.qq.com/s/TSu50PihKjy9rvg2zuF6bQ)

在我们日常开发中，状态可以说无处不在，就像笔者最近参与的一个项目的开发，一个数据的改变牵扯到多出 UI 的变化，这时候，就很自然想到用响应式编程的方式去解决这个问题。恰好，就在最近，业界期盼已久的响应式框架 EasyReact 终于开源了。美团一直是 FRP（函数响应式变成）的重度使用团队。他们在此之前很早就引入了 ReactiveCocoa 这个框架，对推动 ReactiveCocoa 框架本身以及 FRP 的编程思想起到了重要的作用。但随着美团业务及团队的发展，在使用 RAC 上，美团也遇到了一些问题。例如 RAC 本身公认的学习曲线较为陡峭，调试困难等问题。为了改善这些问题，同时保持响应式编程带来的种种便利，美团团队自研了响应式编程框架 EasyReact 。从官方的说法中，EasyReact 在性能上，测试的便利性上，写法的统一上都更胜一筹。虽然目前笔者还不能确定这些说法是否都是对的，但无论如何，在响应式编程这一领域上，美团无疑带给我们了一个很重磅的开源框架。对此方面有兴趣的同学现在可以 Down 下来代码尝试学习或者使用啦！

### [RxReduce](https://github.com/RxSwiftCommunity/RxReduce)

Redux 在前端是一个很流行的框架，在 iOS 上根据相同的思路与之对应的框架是 [ReSwift](https://github.com/ReSwift/ReSwift)。因为所有的变化都是响应状态的变化，所以天生带着响应式属性，非常适合 Rx 体系。这次 Rx 社区推出了 RxReduce 来实现这个框架。所以如果现在项目里打算使用单向数据流的架构，可以考虑接入 Rx 全家桶。

### [ZJAttributedText](https://github.com/syik/ZJAttributedText)

ZJAttributedText 是一个富文本框架。和 YYText 对比起来，更轻量级，并且能通过链式调用进行富文本的样式编辑。

### [Twitter Network Layer (TNL)](https://github.com/twitter/ios-twitter-network-layer)

Twitter Network Layer (TNL) 是 Twitter 开源的一套基于 NSURLSession 的扩展性强且功能丰富的 iOS 网络层框架。建议对构建基础网络层感兴趣的同学都深入学习下，据说该框架在 Twitter 内部已经用了 4 年，并且最近 18 个月都是处于 no bugs 状态，具体介绍可以看下 Twitter 官方发布的博客文章 🚧 [Introducing Twitter Network Layer iOS framework for open source](https://blog.twitter.com/engineering/en_us/topics/open-source/2018/opensourcetnl.html)。

## 内推

### [字节跳动北京 iOS 团队持续招人中](https://job.toutiao.com/society)

这是一家非常年轻的创业公司，充满活力与激情，希望能有更多优秀的人，加入字节跳动，一起让人们看见更大的世界（今日头条、西瓜视频、悟空问答、懂车帝 、TopBuzz、News Republic...），也让更多人的美好生活被看见（抖音、火山小视频、Musical.ly、图虫、Faceu...），我的邮箱 raozhizhen@bytedance.com，或者添加我的微信 jingmu1994 了解更多公司及岗位信息。

### [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)

如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

### [杭州/广州/深圳 奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)

奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。Mesh 在运用 yarn, rollup, vue 等技术栈的同时，利用 Couchbase 设计多端数据同步方案，并深入研究 React Native。也可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

### [百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)

部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

### [上海-加入即刻](https://www.okjike.com/careers)

即刻 iOS 团队从一开始就使用纯 Swift 开发，至今已有三年多时间，是国内较早大规模使用 Swift 的团队。我们比较偏爱 RxSwift 和 Texture 等框架，追求和最优秀的工程师一起，用最高的标准做用起来最爽的 app。
如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给 Jason（即刻 iOS leader）: jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

### [北京-蚂蚁金服 招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) 了解情况。

## 关注我们

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

![](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)，[@mmoaay](https://weibo.com/u/1302422271)，[@享耳先森](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）
