# 老司机 iOS 周报 #51 | 2019-01-07

![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) 提出。

## 新闻

### [iOS 靠谱内推专题](https://www.yuque.com/iosalliance/article/bhutav)

号外号外~这里有一份靠谱的 iOS 内推职位列表，希望能给大家在这个裁员寒冬带来一点暖意。

## 他们的 2018 年总结

在看完 [50](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/Reports/2019/%2350-2019.01.02.md) 期 *他们的 2018 年终总结*，相信大家都有所收获。本期同样也为大家带来了一些小伙伴们自己的年终总结，希望这些总结能够帮助到大家。

- [2018 年终总结 - 瓜地](https://www.desgard.com/summary-2018/)
- [2018 年终总结 - 唐巧](http://blog.devtang.com/2019/01/01/2018-summary/)
- [2018 年终总结 - 犀利豆](https://xilidou.com/2019/01/01/2018/)
- [2018 年终总结 - 筑梦师Winston](https://www.jianshu.com/p/14ec3016a69c)

## 文章

### 🌟 🐢 [Understanding Xcode Build System](http://www.vadimbulavin.com/xcode-build-system/)

本文介绍了`Xcode Build System`的各个部分，帮助我们提升对于 Xcode 编译的基础知识。很多的包体积减少方案也是基于这个基础知识之上，对于 iOS 开发人员来说很有必要了解

1. Preprocessor（预处理）：这个阶段处理一些语法糖的东西，譬如一些编译宏的展开
2. Compiler（编译）：将 Swift 工程编译成一个中间语言，一般采用两个编译器，一个是 Swift 语言编译器，一个是 OC、C++/C 编译器（为了解决混编的问题）
3. Assembler（汇编）：将中间语言统一转成操作系统能理解的二进制代码
4. Linker（链接）：将一切依赖的外部库加入到二进制包中
5. Loader（装载）：变成一个可执行程序，添加程序执行的入口，以便操作系统能够直接跑起来

### 🌟 🐎 [OCEval - 动态执行 ObjectiveC 的热修复方案](https://juejin.im/post/5c24a8396fb9a049d5198dfc)

苹果在18年多次对基于 runtime & JavaScriptCore 的热修复方案进行全面的打压，导致 JSPatch 以及其混淆 or 变种，变得难以过审。但是本文作者依然在热修复的探索上寻找并实现了一条新的方案 OCEval。OCEval 的本质是作者自己实现了一个 OC 语法的简单解释器，包含了基础的词法分析与语法分析，从而能够在运行期将 OC 代码生成抽象语法树 AST 然后进行执行。这样就可以将OC这种原本必须经过编译再运行的语言，扩展为 js 那样的解释执行，从而能够做到动态下发代码并且运行。同时再通过 runtime 进行 aspect 那样的 hook 操作，实现热修复线上代码。整个代码都已经开源，对编译原理有兴趣的同学值得深入好好学习一下。

### 🐢 [[App 探索] JSBox 中幽灵触发器的实现原理探索](https://juejin.im/post/5c2c16b66fb9a049e12a4f0e)

JSBox 中有一项奇特的功能 - 幽灵触发器，它在 App 进程被杀死的情况下，也可以将通知固定在通知栏，即便用户点击清除，也能马上再弹出，永远不消失。本文作者通过一系列的实践研究分析了这个 “幽灵触发器” 功能的实现原理，最终以 [Demo](https://github.com/577528249/NotificationForever) 的形式给出了一个可行的实现方案，希望对感兴趣的读者提供帮助。

> JSBox 是由钟颖开发的一个提供 JavaScript 集成开发环境的 iOS 应用，可以通过它来构建各种有趣的效率工具，其中有很多巧妙的功能实现值得我们研究探讨。

### 🐢 [10w+ 字详解 Runtime](https://github.com/DeveloperErenLiu/RuntimePDF)

如题，本系列 Runtime 文章总共九篇，总字数为 10w+。一个技术要点能写 10w+ 不容易，能把一个技术要点循环渐进、细致确当、系统全面地讲清楚，真正做到一个系列搞定，足见作者的匠心。如果不想再被 Runtime 题材的文章“碎片化”，那就从这里开始吧！

### 🐎 [技术年货：美团技术沙龙合辑大放送——85 个演讲，70+ 小时视频](https://mp.weixin.qq.com/s/wamJkpq3HWpKsBc3okqUwg)

虽然美团近期在面临裁员风波，但不可否认的是美团是国内对技术分享做的最好的公司之一了。本文详细整理了今年所有线上线下美团技术沙龙的演讲稿和视频，覆盖前端、后台、系统、数据、算法、测试、运维等技术领域。这份“饕餮盛宴”必然会深受追求卓越的同学的喜爱。

### 🐎 [How to use raw strings in Swift 5](https://www.hackingwithswift.com/articles/162/how-to-use-raw-strings-in-swift)

当字符串应用于正则或初始化 JSON 等场景时，转义字符会给我们带来一些小烦恼。比如试试查找 `\(sth)` 的正则如何实现？
Swift 5 中，新增了 Raw String 语法(用井号包裹，`#"raw string"#`)， 通读本文，可以快速了解 Swift 5 中的原始字符串该如何应用。

扩展阅读：[SE-0200](https://github.com/apple/swift-evolution/blob/master/proposals/0200-raw-string-escaping.md)

### 🐢 [iOS 性能优化之计算多行 Label 高度的新方法](https://mp.weixin.qq.com/s?__biz=MzU3NTY3MTQzMg==&mid=2247484307&idx=1&sn=06d33d349ab6019b25a268f316ce7eb9&chksm=fd1ede74ca6957628d59c222767105b54fcd57b9efb085e868dae995fcd46d50e4023d4e0d7c&mpshare=1&scene=23&srcid=0103uUtd8RIuQxhWoWbXEcTh#rd)

本文中“根据字体来计算字符串总宽度，从而得到多行 Label 高度”的想法，也比较新颖，网上也没有找到资料，但是某些读者日常开发中可能会碰到，本文比较系列的从发现问题到解决问题进行了阐述。如果这篇文章能够给读者们造成一些启发，也能够让这篇文章发挥价值。

### 🚧 🐎 [Swift CoreNFC as quick as possible](https://medium.com/@myrickchow32/swift-corenfc-as-quick-as-possible-79544796cd0a)

正如标题所写的，这是一篇快速使用 CoreNFC 的教程。本文总结了使用 CoreNFC 的主要流程和一些需要注意的细节。文章内容足够用来了解 CoreNFC 了，但如果想感受或者弄清一些细节，最好还是实践一下。

## 设计

### 🐎 [[译] 色彩无障碍性产品设计指南](https://juejin.im/post/5c2c233d6fb9a049bd4266b7)

数字产品的无障碍设计旨在为所有人提供精致的使用体验，这些人包括有视觉、语言、听觉、身体或者认知障碍的人。关于无障碍设计的讨论有很多，但你是否想过色彩的无障碍设计？这篇文章会介绍如何使用你已经知道的设计原则来进行色彩无障碍设计。

## 工具

### [少数派 2018 年终盘点以及编辑推荐](https://sspai.com/page/2018#page1)

本统计中列举了这过去一年里，文章，APP，编辑的受欢迎的榜单。在这份年终报告中，我们可以看到一些耳熟能详的应用，也看到一些我们并没有留意到，但别人很喜欢的应用。各位童鞋不妨看一下 2019 是否有适合你新应用。

### [AssetImportKit](https://github.com/eugenebokhan/AssetImportKit)

AssetImportKit 是一个用 Swift 编写的跨平台库（macOS、iOS），可以在运行时将 [Assimp](https://github.com/assimp/assimp) 支持的文件转换为 SceneKit 场景。

### [Mach-O Kit](https://github.com/DeVaukz/MachO-Kit)

Mach-O Kit 是一个 Objective-C 框架，用来分析 Darwin 平台的 App 所使用的 Mach-O 二进制文件。Mach-O Kit 简单易用，并且是安全的，即使解析一个格式错误的 Mach-O 文件也不会导致程序崩溃，可以放心使用。

## 代码

### [DynamicJSON](https://github.com/saoudrizwan/DynamicJSON)

DynamicJSON 使用了 Swift 4.2 中引入的新特性 `@dynamicMemberLookup` 来实现 JSON 数据的快速访问。相比传统方式，你不再需要使用方括号和双引号。

## 音视频

### [ggtalk | 创业那点事：普通开发者的回忆、反思和迷茫](https://talkorigin.swift.gg/10)

这是 ggtalk 创业系列的第二期，从在创业公司工作过的普通开发者的口中了解对于很多工程师而言，在创业公司是一种怎样的感受, 主要由翻译组的梁杰、珂珂和 MM 来做分享。其中最典型的，就是个人发展和公司发展频繁的冲突和变化。公司业务经常变化，虽然能够磨炼工程师不断的接受新的挑战，但也会造成无法在某一个细分领域不断深入。工程师在类似的境遇下该如何权衡，如何选择，相信大家听完这一期节目，会有新的感受。

### [Typed Notifications](https://talk.objc.io/episodes/S01E27-typed-notifications-part-1)

通过 `Notification` 时其中一个问题就是发送方跟接收方都必须通过约定去传值，Swifter Talk 这一集就探讨了如何通过类型化 `Notification `，统一使用对应类型的 `Descriptor` 去完成 payload 的编码和解码，去完成一套类型安全的通知系统。

## 内推

- [北京-百度网盘 持续招 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)，[@tom510230](https://xiaozhuanlan.com/u/6682065345)，[@anotheren](https://anotheren.com)，[@水水](https://www.xuyanlan.com)，[@looping](https://github.com/looping)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@邦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）
