# 老司机 iOS 周报 #49 | 2018-12-24

![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://www.wjx.top/jq/32164990.aspx)

周报已经快陪伴大家走过一年的时间，非常感谢各位朋友的支持和厚爱。为了在 2019 年能更好地为大家服务，我们举办了一个问卷调查活动。在 12 月 27 日，我们会在参与问卷的朋友中选取合适的几个人赠与学习大礼包和现金奖。至于奖品是什么，大家可以在[这条微博](https://weibo.com/3165754627/H6t1EmqRh)中了解，转发还有额外的抽奖~我们渴望听到你们的声音！

## 新闻

### 🌟 [周报支持邮件订阅啦！](https://github.com/SwiftOldDriver/iOS-Weekly#订阅周报)

在接下来的周报发布中，我们将会采用 GitHub 最新的 **GitHub Release** 特性进行，读者朋友们可以到我们 [GitHub 主页](https://github.com/SwiftOldDriver/iOS-Weekly#订阅周报) **点击 watch -> 选择 Release only**  订阅。之后每期周报发布，你 GitHub 账号关联的邮箱就会收到我们的发布邮件。

除新增的邮件模式之外，我们还提供了以下三种方式，大家可以按照自己的需求进行选择：

- 公众号：[OldDriverWeekly](https://github.com/SwiftOldDriver/iOS-Weekly/raw/master/assets/qrcode_for_wechat.jpg)
- RSS：[点击获取 RSS 源](https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom)
- 掘金：[老司机 iOS 周报](https://juejin.im/user/5a52075e6fb9a01c9d31b107/posts)

### [Cydia 商店宣布关闭](https://www.ithome.com/html/iphone/400752.htm)

对 iOS 越狱有这些影响：

- Saurik 决定关闭的仅仅只是 Cydia Store，也就是其中的支付系统，不会影响原有的安装/卸载/管理应用程序的功能，免费或已经付费的应用，依旧可以进行下载。如果希望继续购买付费应用，需要去其他存储库（如 Packix，Chariz 或 Dynastic Repo）进行下载
- Saurik 决定关闭商店跟一个 BUG 有关，其可以通过用户的 PayPal 帐户启用任意 Cydia Store 软件包购买
- Sileo 是 Cydia 的计划替代品，但是其还在开发阶段

## 文章

### 🌟 🐕 [我从写技术博客中收获到了什么](https://knightsj.github.io/2018/12/03/我从写技术博客中收获到了什么%20-%20J_Knight_/)

相信不少程序员都有写博客/文章的习惯，或者正计划写，因为一方面可以总结和加深对技术的理解，另一方面也可以一定程度上增加一些知名度，这也有助于拿到更多的面试机会。但是，由于多数人工作毕竟已经很忙，真正能坚持写下来的人却不多。本文作者作为一个工作刚满 3 年的开发者，但写博客却有两年半的时间了。笔者大概看了下，大概写了有 50 多篇，可以说是很高产了。

本文分为三个部分

- 写技术博客的历程
- 写技术博客的收获
- 回答一些朋友（粉丝）的一些关于写博客的几个问题

在技术道路的探索上，每个人有每个人不同的方式，但对于任何一个人，坚持都是很重要也难得的品质。相信这篇文章能够解答你心中的一些疑问。

### 🌟 🐢 [从零开始学基于 ARKit 的 Unity3d 游戏开发系列](https://zhuanlan.zhihu.com/p/32224102)

作者王寒，国内首批 iOS 应⽤开发者，首批 VR 应⽤开发者，知乎专栏 [笨猫学编程](https://zhuanlan.zhihu.com/kidscoding) 作者。[《Cocos2D权威指南》](https://item.jd.com/11206205.html)，[《虚拟现实-引领未来的人机交互革命》](https://item.jd.com/11942259.html)，[《Unity AR/VR开发：从新手到专家》](https://item.jd.com/12269697.html)的作者。  

在本系列的教程中，作者带大家一起学习，如何从零开始学习基于 ARKit 的 Unity3d 移动游戏开发。全系列的教程都是基于实战项目的，而且尽可能考虑到初学者可能会遇到的种种困难和障碍，可谓是手把手教学。

虽然名称是零基础，这个课程有个前提是本身对 Unity 及 3D 图形有一定的了解，不是完全零基础。当然也不必灰心，作者还贴心地为初学者准备了 [iOS 入门课程系列](https://github.com/eseedo/iOSCourse) 和 [AR-VR 入门课程系列](https://github.com/eseedo/AR-VRCourse)。

- iOS 入门系列包括：[iOS7+OC 开发](https://github.com/eseedo/iOSCourse/tree/master/iOS%20Basic/iOS7%2BObjective-C)、[iOS12+Swift4.2 开发](https://github.com/eseedo/iOSCourse/tree/master/iOS%20Basic/iOS12%2BSwift4.2)、[ARKit 原生开发](https://github.com/eseedo/iOSCourse/tree/master/ARKit/ARKit%20Native)、[ARKit+Unity3d 开发](https://github.com/eseedo/iOSCourse/tree/master/ARKit/ARKit%2BUnity3d/pdf)、[CoreML 开发](https://github.com/eseedo/iOSCourse/tree/master/CoreML)；

- AR-VR 入门系列包括： [HTC Vive+Unity3d 开发](https://github.com/eseedo/AR-VRCourse/tree/master/HTC%20Vive%20Course)、[HoloLens 开发](https://github.com/eseedo/AR-VRCourse/tree/master/HoloLens%20Course)、[UE4 入门课程](https://github.com/eseedo/AR-VRCourse/tree/master/UE4%20入门课程)、[UE4 VR 开发](https://github.com/eseedo/AR-VRCourse/tree/master/UE4%20VR%20Course)、[Unity5.3 官方 VR 教程](https://github.com/eseedo/AR-VRCourse/tree/master/Unity%205.3官方VR教程)、[Unity AR:VR开发入门](https://github.com/eseedo/AR-VRCourse/tree/master/Unity%20AR:VR开发入门)。

### 🐕 [TikTok（抖音国际版）逆向，全球的小姐姐们，我来啦!](https://juejin.im/post/5c19a38ae51d453e0a209256?utm_source=gold_browser_extension)

在 iOS 日常的开发过程中我们通常会做一些竞品分析或者研究竞品某些功能点的实现方案，其中就需要使用到逆向技术。

本文作者以逆向抖音国际版为例，通过 Frida 砸壳，Hopper 静态分析，配合 Reveal 动态分析，以及 Charles 抓包等一系列分析，编写 Hook 代码完成逆向功能，最后实现突破地区限制、移除水印、日区视频分享下载。文章思路清晰明了，带我们理清了 iOS 逆向工程的整个分析过程。

### 🐕 [Mocking With Protocols in Swift](https://www.bignerdranch.com/blog/mocking-with-protocols-in-swift/)

单元测试可以覆盖我们的很多场景提高代码健壮性，但同时也有很多的代码其实是很难单元测试的，比如和数据相关的删除操作，逻辑迟早都是会跑到的，不在开发阶段就在上线后用户使用阶段，所以这类 “untestable code” 越多，软件的质量就会越有问题。本文作者通过使用 Swift 的 Protocol 的相关特性，来巧妙的构造一些测试机制来测试一些没那么好写单元测试的代码，并给出了一个具体的例子。值得借鉴！

### 🐕 [Data-Driven Table Views](http://www.vadimbulavin.com/data-drive-table-views/)

UITableView 称为所有 iOS 开发者最熟悉的控件并不为过，但 UITableView 存在代码重复、控制流过于复杂、违反依赖性倒置原则等痛点。文章前半部分指出了以上痛点，以及相对于 UITableView 来说 UITableViewController 所拥有的特性；后半部分针对上述痛点，基于 UITableViewController 逐步实现了一个基础版的数据驱动业务的模型，设计轻量，用法简洁，且方便扩展。

### 🐢 [Optimizing Images](https://www.swiftjectivec.com/optimizing-images/)

图片一直是 App 内存消耗大户，本文从图片的`加载`、`解压`、`呈现`开始，特别介绍了列表型应用应该如何优化图片内存问题。

### 🐢 🚧 [How to convert your Xcode plugins to Xcode extensions](https://medium.freecodecamp.org/how-to-convert-your-xcode-plugins-to-xcode-extensions-ac90f32ae0e3)

Xcode 插件和扩展，是我们日常开发中工具，作者针对它的发展做了以下几点的总结：

1. 什么是插件：只是一个类型的包，Xcode 启动时的同时，会去加载指定的 Info.plist 文件
2. 优秀的插件推荐：Alcatraz（包管理工具）、Xvim（ vim 编辑器）、SCXcodeMiniMap（代码地图面板）、FuzzyAutocompletePlugin（函数模糊搜索）、KSImageNamed（图像名称列表）、ColorSense（颜色转换）、LinkedConsole（控制台打印跳转代码文件）
3. 插件的制作：作者以 [Xmas](https://github.com/onmyway133/Xmas)、[XcodeColorSense](https://github.com/onmyway133/XcodeColorSense) 和 [XcodeWay](https://github.com/onmyway133/XcodeWay/tree/1.0) 的制作为例向我们展示了如何 Hook Xcode 的方法，以及如何与 Xcode 中 UI 元素进行交互
4. 插件的禁止：由于 2015 年末，[XcodeGhost](https://en.wikipedia.org/wiki/XcodeGhost) 事件，苹果从 Xcode8 开始禁止加载插件。当然，你可以通过 Xcode 重签名这种方式去绕过苹果的检查，重新加载插件
5. 扩展的崛起：苹果爸爸关上了一扇门，肯定会开一扇窗。从此 Xcode8 中的扩展进入了人们的视线当中。利用现有的 XcodeKit，去获取文档信息，修改当前文档内容，但是跟以前优秀的插件相比，这个方式能实现的东西是在太少了。作者以 [XcodeColorSense2](https://github.com/onmyway133/XcodeColorSense2) 为例，向我们介绍了，如何去实现/调试/安装扩展。另外作者以 [XcodeWay](https://github.com/onmyway133/XcodeWay) 向我们介绍了如何使用去用新的扩展去调用 Apple Script

### 🐕 [美团开源 Graver 框架：用“雕刻”诠释 iOS 端 UI 界面的高效渲染](https://tech.meituan.com/waimai_graver.html)

美团开源了一款高性能的图文混排渲染框架，其特点是整个页面不使用 UIKit 的界面层级与布局渲染，而是采用自己的图文排版引擎，将所有元素绘制在一张 bitmap 上，然后辅助轻量级的交互控制。在这一整套自研的图文排班引擎的支持下，可以做到网络下载/排版算法/图形渲染都通过异步来进行控制，从而实现复杂界面的高性能渲染效果。

### 🐎 [Image Analysis Solutions for Mobile Apps](https://www.netguru.co/codestories/image-analysis-solutions-for-mobile-apps)

本文介绍了几种移动端图片分析的解决方案。其中包括：

- 云解决方案
- Apple Vision API
- OpenCV
- BoofCV

我们希望，通过这篇文章，我们可以让您更轻松找到最佳解决方案。

### 🐕 [Improving code testability with Swift protocols](https://medium.com/flawless-app-stories/solving-dependencies-in-swift-9ee6ad4a8941)

Swift 是一门建议面向协议编程的语言，测试驱动是时下比较热门的工作方式。因此，提升 Swift 的 protocol 可测试性就非常重要了。本文介绍了一些接地气的方法

- 用工厂模式来封装 init 的细节
- 通过 mock 的方式来只关注行为是否符合预期
- 协议的设计要符合依赖倒置原则

## 工具

### [How to Add a Recent Items Folder to Your Mac's Dock](https://www.macrumors.com/how-to/how-to-add-a-recent-items-folder-to-your-macs-dock/)

如何将最近打开的项目文件夹添加到 Mac 的 Dock 中？相信工作中很多同学都有这个需求。本文作者就图文并茂的给我们演示了整个过程，过程并不复杂，重要的是一劳永逸，可以有效提升我们日常的工作效率。

## 代码

### [iWeChat - 通过逆向还原和探索微信](https://github.com/lefex/iWeChat)

iWeChat 项目作者希望通过逆向还原微信来学习构建微信用到的技术架构和交互设计，同时也想借此教会大家如何分析一款第三方 App。

项目介绍中罗列的逆向技巧、步骤和工具等，都是不错的入门实战教程，对逆向以及微信的设计感兴趣的同学可以关注下。

## 音视频

### [ggtalk | 和 Cee 聊聊如何拿 Google Offer](https://github.com/SwiftOldDriver/iOS-Weekly/issues/997)

想来有很多程序员对 Google 非常憧憬，也一直希望能有机会去 Google 工作。 这期 Swiftgg 的 ggtalk 节目就和最近拿到 Google Offer 的翻译组同学 Cee 聊了这个话题。主要集中在 Google 的面试流程，怎么准备上。

有兴趣的同学可以听听看，虽然北美的面试准备这些会和国内的有一些区别，但是依然值得了解一波。

如果对北美面试有兴趣的同学们，还可以配合我们之前发的小专栏：[北美软件工程师面试简单介绍](https://xiaozhuanlan.com/topic/4263189057) 一起“食用”，效果更佳。

## 内推

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

## 说明

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

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