# 老司机 iOS 周报 #50 | 2019-01-02

![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://github.com/SwiftOldDriver/iOS-Weekly)

这是周报成立一周年的第 50 期，也是我们新年的第 1 期。过去 2018 年里，在编辑团队的努力和大家的支持下，我们达成了以下几点小成就：

- 一共连续为大家贡献了 49 期周报
- GitHub 累计获得 2000+ star
- [掘金账号](https://juejin.im/user/5a52075e6fb9a01c9d31b107) 收获大家 8500+ 关注，近 2400 次获赞，平均每篇约获赞 40 次，总阅读数约 12.5w，并从近一个月开始尝试不定期推送沸点
- 微博话题 [#iOS 周报](https://s.weibo.com/weibo/%23iOS%20%E5%91%A8%E6%8A%A5%23) 共 188w 阅读
- [SwiftOldDriver 精选](https://xiaozhuanlan.com/olddriver-selection) 发表 23 篇文章，获得 255 个订阅
- 联合兄弟团队 [知识小集](https://github.com/awesome-tips/iOS-Tips) 和 [SwiftGG 翻译组](https://swift.gg/) 共同参与了掘金 [WWDC 2018](https://juejin.im/post/5b1d284df265da6e572b3d87) 专题活动，并在近期组织了 [iOS 再就业联盟](https://www.yuque.com/iosalliance/article/ycyhf3)
- 周报编辑团队也不断成长，目前已有来自一线 iOS 开发的 28 位伙伴加入我们

另外，我们在 12 月初向大家发起了问卷活动，收集大家对周报的建议和希冀，目前我们正在整理和汇总，并尽快在最近几期周报中根据建议作出调整。祝愿周报在 2019 年和大家一起继续成长~

### 🌟 [老司机周报x知识小集xSwiftGG：iOS 内推职位召集](https://juejin.im/post/5c22deebe51d451a6b513aa3)

最近很多公司的裁员的消息相信大家都有所耳闻，与此同时也有不少公司逆势而上在持续招聘技术人员。因此我们三大组织决定牵头收集一些可靠的招聘，元旦结束后在我们的资讯发布渠道上发布 [iOS 内推职位专题文章](https://www.yuque.com/iosalliance/article/bhutav)。

## 🌟 他们的 2018 年总结

2018 已经悄然离开，2019 已经站在我们面前。这一年，相信大家都有收获，也有过遗憾，这都是常事。下面几篇文章，是几位小伙伴自己的年终总结或者是 2018 年 iOS 的技术发展总结，相信看了他们的总结之后，大家也会有所收获。

- [2018 年终总结及下半年文章汇总 - 知识小集](https://mp.weixin.qq.com/s/m1ldQrRdFlaoh56WcGqbMQ)
- [2018 年终总结 - J_Knight_](https://juejin.im/post/5c1fa32751882537c0766e30)
- [2018 年终总结 - 提拉拉拉就是技术宅](http://corpus.enumsblog.com/corpus/18037)
- [2018 年终总结 - Lefex](https://mp.weixin.qq.com/s/PeNEft0iMQvC_pONo1AXwg)
- [2018 年终总结 - limboy](https://limboy.me/essay/2018/12/28/my-2018.html)
- [2018 年终总结 - 小道消息](https://mp.weixin.qq.com/s/ZqaTvVaJAM1oIvLJ7ASVHQ)
- [2018 年终总结 - Bang](http://blog.cnbang.net/living/3625/)
- [iOS 技术发展史：2018](https://www.jianshu.com/p/e37184b8587b?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo)

## 文章

### 🌟 🐢 [The Layer Cake](https://medium.com/flutter-community/the-layer-cake-widgets-elements-renderobjects-7644c3142401)

Flutter 现在有多火，相信已经无需多说。尤其 1.0 版本发布后，各个厂也都有在进行先关的调研，不少已经在实际项目中使用了。之所以选择 Flutter，一方面是因为跨平台，另一方面我相信很大一部分原因是因为其高效的渲染性能。相信很多同学对 Flutter 如何进行渲染的也比较好奇，本文讲了 Flutter 的渲染层级及如果工作的，并且在处理负责视图结构中如何保持高效。本文对于正在学习或使用 Flutter 的同学，在思考 Flutter 的架构以及性能的优化等问题上，会很有帮助。

### 🐕 [Advanced UIView shadow effects using shadowPath](https://www.hackingwithswift.com/articles/155/advanced-uiview-shadow-effects-using-shadowpath)

虽然扁平化设计的 iOS 7 舍弃了大量的阴影，但最近几年阴影正在不断回归，以增加界面的深度。谨慎地使用阴影可以对 UI 中的内容进行区分、增加深度、吸引用户的视线。这篇文章介绍了用阴影实现的几种效果，全部通过操作图层属性实现。这些效果有的很简单有的很复杂，希望它们可以激发你的创造力！

### 🐎 [A guide to writing your own iOS CI/CD integration script](https://medium.com/appssemble/a-guide-to-writing-your-own-ios-ci-cd-integration-script-186be1b99575)

[Fastlane](https://docs.fastlane.tools/)、[Jenkins](https://jenkins.io/) 是构建 CI/CD（持续集成/持续部署）工作流的常用工具。本文另辟蹊径，不使用第三方工具，只基于苹果的基础工具链构建一个包含编译、测试、检查代码覆盖、签名、分发等相对完整的 CI/CD 工作流。
如果你还不了解 CI/CD 原理，不妨对着本文做一遍，相信可以快速掌握其运行过程。

### 🐎 [ISO-8601, YYYY, yyyy, and why your year may be wrong](https://ericasadun.com/2018/12/25/iso-8601-yyyy-yyyy-and-why-your-year-may-be-wrong/)
小写 `yyyy` 是我们常用的格式化日期 `年` 参数，如果误写成大写 `YYYY`，会有什么问题？
大部分情况下，它们似乎没有区别，但在每年的最后一周，`YYYY` 又会给我们带来意外的结果。
本文作者将带你了解 `YYYY` 对应的 [ISO 周日历](https://zh.wikipedia.org/wiki/ISO週日曆)，从而真正理解它们的不同。

### 🐎 [系统学习 iOS 动画之一：视图动画](https://juejin.im/post/5c246b8a518825644e62434e)

动画制作很有趣，可以为用户界面注入活力。如果使用得当，动画还可以向用户传达信息，并将用户注意力吸引到界面的重要部分。

作者学习《iOS Animations by Tutorials》系列笔记共 7 篇包括如下几部分内容：[视图动画](https://juejin.im/post/5c246b8a518825644e62434e)、[自动布局动画](http://andyron.com/2018/iOS-Animation-2-Auto-Layout)、[图层动画](http://andyron.com/2018/iOS-Animation-3-Layer-Animations)、[视图控制器的转场动画](http://andyron.com/2018/iOS-Animation-4-View-Controller-Transition-Animations)、[3D 动画](http://andyron.com/2018/iOS-Animation-6-3D-Animations)、[其它类型的动画](http://andyron.com/2018/iOS-Animation-7-other-Animations)等。

本文是作者系列笔记中的第一篇，文章以实例的形式由浅入深的讲解了弹簧动画、过渡动画、关键帧动画的实现过程。推荐对动画感兴趣的读者跟着教程实践一遍，相信你会有收获。

### 🐎 [函数式编程 - 酷炫 Applicative（应用函子）Swift 描述](https://juejin.im/post/5c1d3bae5188252a9412e71b)

函数式编程中，三个核心概念分别是 Functor，Applicative 和 Monad。其中，讲 Functor 和 Monad 的资料都不少，但 Applicative 一直都处于一个爹不亲娘不爱的地位，属实尴尬。核心原因还是其应用范围比较有限。本文以 Swift 语言为载体，介绍了 Functor 和 Applicative 的基本知识，讲述的方法借鉴了函数式编程领域教学中比较经典的“盒模型”，没有复杂的数学概念，算是比较不错的入门教材。最后还找到了一个 Applicative 的应用场景作为例子，对函数式编程感兴趣的同学可以仔细阅读，虽然 Applicative 的应用范围比较狭窄，但对于一些细分领域的问题，的确可以构造出非常优雅的解决方案。


### 🐎 [『译』Hacking Hit Tests](https://swift.gg/2018/12/27/hacking-hit-tests/)

[35 期周报](https://github.com/SwiftOldDriver/iOS-Weekly/blob/59bfdf3859a67d5667319000e4ee70f8f9cd6f76/Reports/%2335-2018.09.10.md#-hacking-hit-tests)我们曾向大家推荐了它的原文，而这周 SwiftGG 则为大家做了翻译，再次温习 iOS 系统基于 Hit Test 的触摸事件处理机制。

### 🐕 [How to test iOS networking code the easy way](https://www.hackingwithswift.com/articles/153/how-to-test-ios-networking-code-the-easy-way)

测试网络层代码总是很困难，因为代码运行地飞快，并且不好重现。文中给出的方案便是 `URLProtocol`，一个用于处理特定协议数据的抽象类。你可以编写一个 `URLProtocol` 的子类来注入你需要的数据，而无需改变你原有的代码，不妨一试。

### 🚧 🐢 [Building an Interactive Voice App Using Custom Siri Shortcuts in iOS 12](https://medium.com/appcoda-tutorials/building-custom-siri-shortcut-intent-ui-extension-to-display-remote-data-alfian-losari-efe891a44a70)

Siri Shortcut 是 Apple 在 iOS 12 中基于 SiriKit 框架引入的新 API。它为开发人员提供了自定义用户在应用程序中经常使用的活动创建快捷方式的方法。用户通过向 Siri 发出语音命令来调用快捷方式，可以通过记录与快捷方式关联的自定义短语来自定义实际短语。你可以实现例如：

- 订购一些东西（例如披萨，咖啡，早餐😋）
- 信息搜索
- 连接到任何 API
- 做我们想要的任何自定义动作
- 执行 Siri
- 还有更多...

本文还提供了一系列实现上述功能的参考代码，希望能给感兴趣的朋友提供帮助。

### 🐎 [GitHub Actions: Continuous Delivery of Swift Packages](https://shashikantjagtap.net/github-actions-continuous-delivery-of-swift-packages/)

GitHub Actions 是 GitHub 在 GitHub Universe 2018 开发者大会上发布的新功能，它能够让开发者直接在 GitHub 上根据特定的事件自动执行预设的任务。

本文记录了通过构建 Swift Packages 来使用这个功能的整个流程，也总结了使用过程中发现的一些问题。虽然 GitHub Actions 还处于公测阶段，但大家对这个功能都表示很看好。因为它能让每个开源项目都有自己统一开放的自动化工作流程，它使得 GitHub 服务从代码托管延伸到整个软件开发周期，它很有可能会改变大家使用 GitHub 甚至维护开源项目的方式，所以就让我们拭目以待吧。

### 🐢 [深入浅出 iOS 编译](https://blog.csdn.net/Hello_Hwc/article/details/85226147)

在日常开发中，并不会常用到编译原理相关的知识，但不代表我们不需要了解它。本文系统的讲了 iOS 编译的各个环节，连签名环节都有涉及，深入浅出，也比较容易看懂。在编译原理层面，分为前端和后端，在众多概念中比较重要的是 Parser 和 CodeGen，了解一定的编译原理相关知识，对我们做更深层次的架构、语法设计会很有帮助。

## 工具

### [SwiftRewriter - Swift code formatter using SwiftSyntax](https://github.com/inamiy/SwiftRewriter)

基于 [SwiftSyntax](https://github.com/apple/swift-syntax) 的 Swift 代码格式化工具，要求 Swift 4.2 和 Xcode 10。可以方便灵活的定义和组合自己想要的代码格式。

### [Shapeshift](https://github.com/JohnSundell/Shapeshift)

快速让一组 Swift 文件兼容 iPad 上的 Playground，甚至可以将转换后的文件放置在 iCloud Drive 中的 Swift Playground documents 文件夹内，以便立即拿起 iPad 开始编程！🚀

### [Woodpecker](https://itunes.apple.com/cn/app/woodpecker/id1333548463?mt=12)

我们曾在 18 年初的 [第 5 期周报](https://github.com/SwiftOldDriver/iOS-Weekly/blob/48427eac5663bacdb00beddf2653ff1c32f4d5d1/Reports/%235.md#woodpecker) 推荐过  Woodpecker 这款工具，它可以在 Mac 上查看 App 信息，提高开发测试效率。但现在这款工具 Mac 商店已提供免费下载，免费版本可使用绝大多数功能。

目前功能：

- 只需一步，即可查看、修改沙盒文件；
- 监控 App 网络 http(s) 请求，无需设置代理；
- 查看，修改 UserDefaults；
- 在线调试 WebView；
- 简单强大的插件支持。

> 由 [@张小刚哟](https://weibo.com/u/3127372955) 自荐

### [Code Friend](https://github.com/qvcodefriend/CodeFriend)

使用提供的 JavaScript 接口，可以简单快捷地开发出 Xcode 插件的 Xcode 插件。

### [USB Keyboard](https://github.com/everettjf/USBKeyboard)

通过 USB 连接 iPhone 到 Mac 后，可以实现在 Mac 端打字，iPhone 上输入的输入法应用。

### [woza](https://github.com/woza-lab/woza)

越狱 iOS 的砸壳工具，类似 clutch、dump-decrypted，是 AloneMonkey 开发的 frida-ios-dump 的 node 版本。另外，[woza-desktop](https://github.com/woza-lab/woza-desktop) 是 woza 的桌面版本，实现了“点点鼠标就能砸壳”的目的。

## 代码

### 🌟 [Stinger](https://github.com/Assuner-Lee/Stinger)

知名 iOS AOP 库 Aspect 的另一种实现思路。使用 libffi 及解析方法签名构建壳函数，替换原方法实现以感知方法调用和捕获参数；使用同一 cif 模板及函数指针直接执行原实现和所有切面 block;不使用消息转发指针替换原实现，hook 兼容性更好；调用方法不经过消息转发过程，执行原实现及切面代码过程中无手动构建 invocation 等，效率更高。

正在实现 hook 单个实例对象。

### 🌟 [LeetCodeAnimation](https://github.com/MisterBooo/LeetCodeAnimation)

现在无论是准备参加校招还是社招，怎么能不去刷刷 LeetCode 呢？但是刷题的过程是枯燥乏味的，而现在广大程序员同胞的福音来了，  [LeetCodeAnimation](https://github.com/MisterBooo/LeetCodeAnimation)  的作者立志将 LeetCode 上所有的题目都用动画的形式演示出来，相对枯燥的算法，使用动画演示将更容易理解铭记。目前已实现了部分算法，并将持续更新。

## 音视频

### [ggtalk | 创业那点事：听莲叔和羊叔回忆峥嵘岁月](https://talk.swift.gg/9)

这一期内容，对于大多数程序员都挺有指导意义，羊叔和莲叔分享了自己曾经创业的经历，同时引出了关于程序员职业发展话题的讨论。面对可能高回报但同样高风险的创业机会，作为工程师应该如何判断，如何抉择，创业公司的股份和期权能不能拿，意味着什么，这些问题，你都能在节目中找到答案。

## 内推

- [北京-百度网盘 持续招 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。

## 关注我们

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

![](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)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@kyo](https://github.com/KyoLi)，[@anotheren](https://anotheren.com)，[@水水](https://www.xuyanlan.com)，[@looping](https://github.com/looping)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@邦ben](http://weibo.com/linwenbang)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)，[@JimQ](https://github.com/waz0820)，[@XanderXu](https://github.com/XanderXu)，[@老峰](https://github.com/GesanTung)，[@zvving](https://github.com/zvving)

## 说明

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

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