# 老司机 iOS 周报 #27 | 2018-07-16

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

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

## 新闻


### [WWDC18 Video Transcripts Now Available](https://developer.apple.com/news/?id=07092018a)
WWDC 2018 的字幕支持全文关键词检索了！而且通过这个关键词打开的视频会直接定位到关键词所在的位置，另外分享的视频也支持分享某个特定的时间点了。

## 文章

### 🐎 [Swift GYB](https://nshipster.com/swift-gyb/)

大家经常听到 boilerplate 这个单词，一般都用来指代一些相似但又不完全相同的代码结构。这篇文章讲述了关于这个单词由来的趣闻，而且还介绍了在 Swift 开发中最常用的一个处理 boilerplate 代码的工具：[gyb.py](https://github.com/apple/swift/blob/master/utils/gyb.py)。如名字所示，gyb.py 是一个 python 脚本，这个脚本可以理解成一个模板生成器，你可以按照规定的格式书写一个 Swift 模板文件（其中可以使用 python 的代码来做一些重复代码的生成）。然后使用 gyb.py 执行该模板文件即可生成最终的 Swift 代码文件。

除了基本使用方法的介绍，文章中还介绍了如何将 gyb.py 配合 Xcode 一起使用。工程中有不少 boilerplate 代码但又苦于 Swift 没有宏支持没办法很好的简化的小伙伴们，不妨试试看这个方案。


### 🐕 [Web Architecture 101](https://engineering.videoblocks.com/web-architecture-101-a3224e126947)

曾经有一段时间很流行一个面试题：请描述一下用户在浏览器输入一个网址点击访问，到最终网页显示出内容这之间都发生了什么。如果你对这个问题感到困惑，这篇文章就是为你而生。该文剖析了一个时下流行的网站系统最常见的组成部分。内容很新，比如还介绍了时下流行的 “Data” 系统的概念，现在大数据时代，越来越多的公司会专门开一个 Data Service 来解决日志数据存储、分析、挖掘、模型训练等需求, 和 Database Service 这样仅仅完成数据存储的目的不同，Data Service 往往指一整套数据生命周期的逻辑，而在之前这类数据往往只是扔到一个日志系统里进行定期存档。除此之外，经典的负载均衡、DNS、Cache、搜索等组件也有逐一介绍，是不可多得的 web 系统入门文章，墙裂推荐。

### 🐕 [[译]Create ML 教程: 开始入门](https://juejin.im/post/5b2f66a9f265da59a1172896)

Core ML 把机器学习的模型应用变得如此简单，而唯一的问题就是如何快捷地训练自己的模型。为此，Apple 在 WWDC18 推出了 Create ML。这篇文章以图片分类器为例，同时使用了 Create ML 与 [Turi Create](https://github.com/apple/turicreate) (WWDC17 后被苹果收购，使用 Python 来自定义模型）作为对比，让你对图形化的模型训练有一个直观的认识。如何训练、评估、改进模型都是值得进一步深入思考的。

很明显，你能在 Create ML 的身上看到许多 Turi Create 的影子，在 Create ML 上实现所有 Turi Create 的功能也只是时间的问题。另一方面，Swift for TensorFlow 也已经来势汹汹。想要使用 Core ML 又不会训练模型的同学，绝对值得推荐。唯一的问题是，Create ML 需要 macOS 10.14 Mojave Beta。

### 🐕 [腾讯社招 iOS 面试记录](https://juejin.im/post/5b3c40f4e51d45191a0d0aae)

最新出炉的面试真题，一面常规基础问题，帮助你查漏补缺。二面聊项目，看完也可以回顾一下自己的项目，对使用到的技术，解决的问题是浅尝辄止，还是层层深入，从原理层面理解技术，理解问题。

### 🐕 [Flutter混合工程改造实践](https://juejin.im/post/5b3f098ce51d45199840f4bb)

咸鱼团队作为国内 Flutter 的先行者，给我们带来了好多优秀的 Flutter 实践，这次给大家带来的便是 Flutter 与原有 iOS 工程混合改造实践。在 RN/Weex 的框架机制下，原 iOS 工程只需要引入基础 SDK ，js 开发的功能只需要将打出来的 jsbundle 下发/资源引入到原有 iOS 工程即可。而 Flutter 由于在机制上和他们截然不同，在 Release Mode 下，dart 开发的功能需要编译成 iOS 的 framework ，再由原工程引入，因此在工程混合上会需要对现有工程的持续集成打包构建体系进行不小的改造工作。闲鱼团队针对此给大家带来了他们的解决方案。

### 🐕 [Better iOS projects: How to manage your tooling with mint](https://www.number42.de/blog/2018/07/03/mint-2018-07-03-mint.html)

Number42 的 "Better iOS projects" 系列旨在收集能够方便高效处理 iOS 项目的一些工具和环境。这次介绍的是 [Mint](https://github.com/yonaskolb/Mint) —— 一个通过 Swift Package Manager 来构建 Swift 命令行工具的依赖管理器。Mint 最大的亮点就是可以指定工具在不同项目环境下运行不同的版本，解决由于环境配置不一致会影响开发效率的问题。同时它也支持通过 Mintfile 来配置和隔离不同项目中使用的工具，确保各个项目在所有开发环境里使用的工具都是相同的版本。一直被环境配置问题困扰的 Swift 开发团队可以尝试下，不管是设计思路，还是使用体验都是不错的。

### 🐕 [你可能会忽略的 Git 提交规范](http://jartto.wang/2018/07/08/git-commit/) [约束你的git操作，让你生无可恋。](https://juejin.im/post/5b44d0cc5188251aa0162abe)

现今，Git 已经非常广泛的应用了。它不仅仅被用在代码的版本控制上，甚至类似 UI 设计图（ Sketch ）这种工程都开始用 Git 进行版本控制。然而，当团队到了一定规模的时候，没有一个统一，合理的 Commit Message 会成为严重阻碍开发效率的障碍。

这两篇文章都是通过介绍一些相关的工具来展示如何规范 Commit Message ，进而通过规范化的 Commit Message 来生成 Changelogs 等。虽然文中案例都不是 iOS 相关，但是依然值得学习参考。

### 🐕 [Video Streaming Tutorial for iOS: Getting Started](https://www.raywenderlich.com/188867/video-streaming-tutorial-for-ios-getting-started)

Ray Wenderlich 的入门教程基本都是通过一个具体，渐进式的案例，来介绍做法，非常适合刚接触某个领域的开发者。

本文通过几个简单的播放器案例来介绍如何使用 AVPlayer 进行开发。对于刚接触 iOS 视频的开发者来说，是个很不错的入门资料。

### 🐕 [实现一个优雅的 iOS 事件总线](https://blog.csdn.net/Hello_Hwc/article/details/81023561)

iOS 开发中与不同事件打交道是家常便饭，苹果提供了不同的方式来订阅各种类型的事件。比如通过观察者模式订阅不同的 Notification，通过代理模式实现不同回调的订阅，或者通过 Target-Action 模式 UIButton 等控件的用户事件。那么能不能有一种更加优雅的方式来处理这些事件呢？接触过函数响应式编程的同学应该都会知道 ReactiveCocoa，它通过 Signal 订阅的方式提供了一系列的 API 来帮助我们方便地处理这些事件。本文则自己实现了一套优雅的事件总线机制，只要通过『定义事件』、『订阅事件』和『发布事件』三部曲，就可以优雅地使用这套事件总线。

### 🐎 [带着《iOS应用逆向与安全》，我还在路上](http://bbs.iosre.com/t/ios/12301)

距离庆哥新书『[iOS应用逆向与安全](https://item.jd.com/12361729.html)』发布已经有一个多月了，这篇文章上半部分庆哥发表了自己对学习与选择的一些看法，下半部分则通过《逆向世界杯直播App 央视影音 - iOS 客户端》的实战，为大家演示了如何完成一次简单的逆向。

文中关于学习的看法，深表认同，摘录一部分与大家分享：

>还有就是总会想为什么别人这么优秀，都是“大佬”，其实并没有什么大佬，或者说每个人都是大佬，只是在不同领域不同方向别人比你多花那么一点点时间和多那么一点经验，换一个领域我们都是小白。或者你有没有想过，你在做什么事情的时候总是想着推迟一点点再想，晚一点点再做，或者每一点点就是现在的你和优秀的你之间的一点点差距。

### 🐕 [Anti-If: The missing patterns](https://code.joejag.com/2016/anti-if-the-missing-patterns.html)

代码中如果有大量嵌套的 if 逻辑判断会增加代码的理解难度，降低可维护性。文中针对几个使用 if 的场景提出了优化的方案。

### 🐎 [深入理解 iOS Crash Log](https://blog.csdn.net/Hello_Hwc/article/details/80946318)

有一定开发经验的同学对 crash 日志分析相信都已经非常熟悉了。不论是自研或者第三方的，还是苹果自带的 Crash 收集框架，我们往往都能够通过 dsym 文件将日志符号化后找到有用的异常信息。这篇文章通过系统自动收集的一个微信 Crash Log，很系统地介绍了如何获取 Crash 日志文件，以及如何解读 Crash 日志文件中的每个信息。最后作者还分享了自己的一些常见的 Code 和 Debug 技巧。

### 🐢 [So, you want to build a “Silicon Valley-like” software developer culture](https://medium.com/men-in-healing/so-you-want-to-build-a-silicon-valley-software-culture-f5674d22dcf6)

我们经常谈论“工程师文化”，而其中说的最多的是“硅谷的工程师文化”。作者从五个角度来分析工程师文化到底是什么，包括效率、自我驱动、激励、试错、成长这几个角度。过程和结果同样重要，而“怎么做每一件事”恰恰是铸就工程师文化的基础，尤其对于带团队的 team leader 们来说非常值得一看。

### 🐕 [New in iOS 12: Adding a Custom UI and Interactivity in Local and Push Notifications](https://www.appcoda.com/user-notifications-ios12/)

从 iOS 10 开始，苹果陆续增强了系统推送通知的能力，包括推送中附带图片、重按快捷操作等等。在 iOS12 中苹果进一步拓展了推送通知的能力，支持在推送详情中直接加入按钮等控件，给开发者带来更丰富的可能性。作者介绍了实现新特性所需要操作的每一个步骤，写的非常详细。

### 🐕 [iOS 界面性能优化浅析](https://coderzsq.github.io/2018/07/iOS-%E7%95%8C%E9%9D%A2%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%B5%85%E6%9E%90/)

随着硬件升级及系统优化，日常开发中需要针对性的做性能优化的地方可能不多，但遇到问题时需要大量预备知识来应对。本文着重讲复杂页面的性能优化，包含了`布局预排版`、`重用池`、`图片预解码及预渲染`、`异步绘制`及在异步绘制实现时候遇到的坑，推荐阅读。

### 🐎 [@autoclosure what, why and when](https://medium.com/ios-os-x-development/https-medium-com-pavelgnatyuk-autoclosure-what-why-and-when-swift-641dba585ece)

Swift 真是门常用常新的语言，如果你之前没用过 `@autoclosure`(不是 `@autoreleasepool`)，我相信你看完本文后会说「哇，还能这样」。

### 🐎 [Swift 里的原子属性](http://www.vadimbulavin.com/atomic-properties)

虽然 Swift 里没有任何语言层面的支持让我们去声明属性的原子性，但苹果平台的框架里却有多种锁的 API，这篇文章就介绍了原子性的定义，各种锁的定义和应用场景，以及通过各种锁实现出来的原子属性。

### 🐎 [减少 ViewController 的继承](https://www.swiftbysundell.com/posts/subclass-free-view-controllers-in-swift)

这周 Swift by Sundell 的文章尝试着不使用继承去写页面，一个 ViewController 对应一个页面已经成为我们常识，但我们很多时候其实并不需要那些 ViewController 相关的功能，尝试着打破这样常识是改善我们代码的开始。

### 🐕 [How To Make Your Code Readable](https://medium.com/@chbchb55/the-importance-of-readable-code-165895e939c7)
代码写得好与坏，很多时候不是跟技巧性有关，其实也是一种产品意识，即使是自己单干，3个月以后看自己如天书般的代码（尤其是带着傻气的算法实现）也往往无法追忆当时的思路，更何况大部分的项目都是团队协作型的，一份代码往往会由多个人负责维护，这个时候代码的可读性和可维护性就显得格外重要了。本文从一个常见的 bad case 出发，一步步展示代码的优化思路，让读者对于好代码和坏代码有一个直观的认识。如果想要了解更多的案例，可以读一下经典书籍[《重构：改善既有代码的设计》](https://book.douban.com/subject/4262627/)

### 🐕 [Two Years of Functional Programming in JavaScript: Lessons Learned](https://hackernoon.com/two-years-of-functional-programming-in-javascript-lessons-learned-1851667c726)

本文的作者是一位有着十年以上开发经验的资深的工程师，本文是他在接触函数式编程两年后所获得的心得和体验。首次面对函数式编程应该如何入手；函数式编程的重点不在于`monads`等晦涩的概念，而在于编写简洁清晰，无副作用的函数；函数式编程在团队协作中应该如何看待；明白刚开始切换到函数式编程时的困难。作者对以上几点都做了很不错的分析和解答。这是一篇值得对函数式编程感兴趣的小伙伴们阅读的好文章。

### 🐕 [Debugging on iOS With Unified Logging System](https://agostini.tech/2018/06/24/unified-logging-system/)
介绍了 iOS10 新特性标准日志的特性以及使用方式。标准日志会对日志进行基本的分类，并且会附带一些关键信息，所以可读性将会大大增强，建议大家尝试一下。

### 🐕 [iOS视频开发（一）：视频采集](https://www.jianshu.com/p/eccdcf43d7d2)

本文作者采用图文结合的方式清晰的介绍了 iOS 视频采集的相关概念及视频采集的工作原理，并给出了其在使用过程中的踩到的一些坑，是作为 iOS 视频开发快速上手不错的参考文章。

### 🐕 [Design Ops — A New Discipline](https://clearleft.com/posts/design-ops-a-new-discipline)
当项目越来越大，参与的人员越来越多的时候，即使在目前很多公司已经做了诸如敏捷开发这样的流程来保证项目的迭代，但或多或少也会面临一些其他问题。例如设计标准的统一，工作流程的冲突，各种质量问题等等，尤其对于一些可能多地协同办公的公司就更加明显。 DesignOps 是一种全新的工作方式，通过这种方式，可以有效协调产品、设计、以及开发人员，通过设计即代码的理念，保证产品从规划、设计、开发、交付整个过程不至于出现流程上的问题，并且提高整个团队的效率。DesignOps 不是一个只存在于理论上的东西，像 Airbnb 团队就已经尝试使用这一工作模式，也有相关文章的分享，有兴趣的同学可以 google 一下。而且，目前国外甚至已经有一些公司开始招聘这个方面的职位了，相信后面会有越来越多的公司开始重视这一块。

## 工具

### [iOS 调试线上 app 中 WebView 的方法](https://github.com/PixelCyber/Thor/blob/master/tips-zh-Hans/breakpoint.md)

在 JSBox 这款工具中提供了一种 Safari 浏览器插件，可以注入 Eruda / vConsole 等知名 web 控制台调试工具，来调试已经上线的 Web 页面。但是面对线上三方 App 就无从下手了。这里介绍一款调试工具 Thor ，以 HTTP 代理的方式修改网页中的内容，插入了调试脚本，从而实现调试已上线 app 中 WebView 的能力。


## 代码

### [Awesome macOS open source applications.](https://github.com/serhii-londar/open-source-mac-os-apps/blob/master/README.md)

Mac 上的高质量开源应用列表，包含大量原生或跨平台的 app，这个 repo 的主要目的是帮助开发者找到免费的开源 app 并贡献代码。这个列表按照功能将应用分为 36 个大类，包括浏览器、通讯、数据库、开发者工具等等，此外还列出了每个项目的开发语言。无论是希望参考代码，还是希望找到优质的开源软件，这个列表都很有价值。

### [GPUImage3](https://github.com/SwiftOldDriver/iOS-Weekly)
GPUImage 的作者实在是太高产了。GPUImage3 的 shader 处理部分完全使用 Metal 框架重写了。当然 GPUImage 的 pipeline 还是和 swift2 一样，基于 Protocol，利用 ImageSource 和ImageConsumer 两个 protocol 来处理多滤镜的链接问题。
因为 Metal 的 shader 不是用 glsl 写的。用的是 C++，所以 Brad Larson 也用 C++ 重写了一部分shader 的代码。
如果研究过 GPUImage2 的同学看 3 应该也不会有什么压力。毕竟刨去 Metal 的内容，GPUImage3 和 2 区别很小。

## 内推

### [字节跳动北京 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), [@叶孤城](https://weibo.com/u/1438670852)

## 说明

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

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


