# 老司机 iOS 周报 #52 | 2019-01-14

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

## 新闻

### [GitHub 宣布创建私有仓库免费且不限量](https://blog.github.com/2019-01-07-new-year-new-github/)

微软在今年 6 月收购了 GitHub，而在半年后，它给广大开发者带来了第一个福音 - 私有仓库转为免费且不限量。但值得一提的是，私有仓库目前最多仅支持 3 个协作者，如果超过 3 个，仍然需要购买付费服务。

另外，在个人主页，GitHub 还在本周更新了一个小 feature - 个人主页的状态管理。我们可以在自己的主页为自己设置状态，包含一个 emoji 以及一句描述。

> 推荐人：[tyrad](https://github.com/tyrad)

### [Flutter 示范应用现已开源 — 万物起源 (The History of Everything)](https://mp.weixin.qq.com/s/GwBlb4SM2BusWC_bfVL8gA)

在本月初举办的 Flutter Live 活动上，Flutter 团队向大家展示了一款名为 The History of Everything（万物起源）的应用，向大家展示了 Flutter 的精美的界面和优秀的性能，现在这款应用的源代码已经在 GitHub 上开源。这款应用不仅突出了 Flutter 的强大，也展示了如何高保真的还原设计师设计并保持原生的应用体验。它构建了一个精美的时间轴，你可以上下滑动以及任意缩放整个时间轴，时间轴上的历史事件会随着缩放跟着消失或者出现。

### 他们的 2018 年总结

2019 已经过去了2周，相信小伙伴们对于 2018 年都有自己的总结。本期同样也为大家带来了小伙伴的年终总结，希望对大家有所帮助。往期 2018 年总结可以查阅 [50期](https://github.com/SwiftOldDriver/iOS-Weekly/blob/78d50e213079e100b24f19b05ddd4778700108bc/Reports/2019/%2350-2019.01.02.md)、[51期](https://github.com/SwiftOldDriver/iOS-Weekly/blob/78d50e213079e100b24f19b05ddd4778700108bc/Reports/2019/%2351-2019.01.09.md)。

- [2018 年终总结 - 补锅匠（掘金 iOS 开发者）](https://juejin.im/post/5c27119d6fb9a049df2425cf)

## 文章

### 🌟 🐢 [It Looks Like You Are Trying to Use a Framework](https://www.bignerdranch.com/blog/it-looks-like-you-are-trying-to-use-a-framework/)

Frameworks 是打包资源和拆分代码的常用方式。拆分 Frameworks 的作用不仅仅是避免构建时的重复编译，合理的使用 Frameworks，可以让代码库层次清晰，提升调试效率，确保代码结构保持最大的可重用性。

[第一篇文章](https://www.bignerdranch.com/blog/it-looks-like-you-are-trying-to-use-a-framework/) 包含 Frameworks 相关的基础知识：
- 静态库
- 动态库
- Frameworks 及其内部结构
- 在 Xcode 中链接和嵌入 Frameworks
- 使用 Frameworks 前要考虑的因素
- 一些方便探索 Frameworks 的命令行工具

[第二篇文章](https://www.bignerdranch.com/blog/it-looks-like-you%27re-still-trying-to-use-a-framework/) 则引导我们在逐步解决构建错误的过程中理解 Frameworks，还会介绍 Swift 和 Objective-C 混编时接口间是如何找到对方的。

### 🌟 🐕 [The Complete Guide to iOS and Swift Job Interviews](https://www.hackingwithswift.com/articles/157/the-complete-guide-to-ios-and-swift-job-interviews)

这篇文章的作者是 [Hacking with Swift](https://www.hackingwithswift.com/store) 的创始人，文中分享了 iOS 程序员找工作的一些心得，值得注意的是，现在 iOS 招聘一般都要求熟悉 Swift 相关知识。

1. 日常做好一些找工作的准备，譬如写播客，参加外部的技术交流，参与 GitHub 项目等
2. 写一份好的简历，让人知道你过去的工作经历和价值，注意，复制粘贴和假大空的文字描述一点用都没有
3. 准备面试，一般最好刷一些面经，也要做好手写算法的准备
4. 面试时平复好紧张的情绪，越紧张越回答不上来问题
5. 一般公司的面试题在网上都可以看到类似的，不用过于担心
6. 初级工程师和高级工程师的面试侧重点有些不一样，不过尽可能地展示一下你的知识深度是没错的
7. 编码能力现在在面试时都考察得比较多，千万不要轻视这个事情
8. 每次面试都做好总结，让自己在面试中成长

### 🐕 [开发者如何突破那被限制的视野](https://juejin.im/post/5c37022d51882523ea6de697)

尽管作者的一些观点可能值得商榷，但更多的可以给我们一些指引。文末作者的高度提炼，“输出倒逼输入, 只有你真正知道自己要做什么了, 你学习的方向就会变的异常明确”，更是发人深省。

1. 自我接纳，这是精准学习的前提
2. 技术储备，要认识到技术只是一个工具，而工具是可替换的
3. 动手实践，转换视角，学以致用

### 🐎 [为什么我觉得 Flutter 短期内不会流行但依然选择学习它](https://limboy.me/essay/2019/01/07/is-flutter-the-future.html)

最近 Flutter 的文章越来越多了，也有越来越多的人去尝试了 Flutter。有更多的人参与到 Flutter 生态中来，对 Google 来说，对 Flutter 团队来说都是一件乐见之事。

本文作者在自己尝试了 Flutter 的基础上，详细说了自己的开发体验，也说了自己对 Flutter 的观点。对于还没尝试的同学来说，本文可以提供一个初步的了解。

### 🐎 [Swift: memory leak gotcha with 'weak self'](https://blog.haloneuro.com/swift-memory-leak-gotcha-with-weak-self-67293d5bc060)

这是一篇挺有意思的文章，讲述的是在 Swift 的 closure 多层嵌套中，何时建立弱引用而有可能出现的问题。

相信这个问题，有很多人之前曾经遇到过，或者说曾经思考过那样的情况应该怎样处理。有兴趣的同学们不妨阅读。

> 推荐人：[ApolloZhu](https://github.com/ApolloZhu)

### 🐎 [The iOS Menu](https://codea.io/blog/the-ios-menu/) & [Detailing the iOS Menu](https://codea.io/blog/detailing-the-ios-menu/)

这两篇系列文章讲述了 Codea (iPad lua 编辑器) 作者在 iOS 上设计一个 macOS 风格的下拉菜单。文章中，可以了解到作者一步步的思考过程，以及相关的技术细节想法，例如：毛玻璃效果，贝塞尔绘制圆角，选择交互动效果等等。同时，代码也[开源](https://github.com/TwoLivesLeft/Menu)了。

> 推荐人：[ApolloZhu](https://github.com/ApolloZhu)

### 🐕 [State Restoration Tutorial: Getting Started](https://www.raywenderlich.com/1395-state-restoration-tutorial-getting-started)

State Restoration（状态恢复）是在应用重新启动时恢复到上一次结束时的状态。当 APP 切到后台，很难保证应用不被用户或系统杀掉。在 iOS 6.0 中，Apple 为我们提供了 `UIStateRestoration` 来实现应用状态的保持和恢复。

本文作者通过实例 Pet Finder 向我们展示了应用如何实现状态恢复，主要有以下几个步骤：

1. `AppDelegate` 中实现 `shouldSaveApplicationState` 和 `shouldRestoreApplicationState`。
2. 设置 views 或 view controllers 恢复标识符 Restoration ID。
3. 在需要恢复的 views 或 view controllers 中 实现 `encodeRestorableStateWithCoder`、`decodeRestorableStateWithCoder`、`applicationFinishedRestoringState` 并处理相关的恢复业务逻辑。

另外文中作者也给出了恢复基于代码创建的 view controllers 实现方法，状态恢复尤其适用于恢复用户草稿状态的业务场景，有兴趣的读者可以实践一番。

> 原文中提供的 Demo 基于 Xcode 7.3、iOS 9.3 和 Swift 2.2，在 Xcode 10 中编译 Error 99+，编辑在实践中已对 [Demo](https://github.com/GesanTung/PetFinder) 进行更新，支持 Swift 4.2。值得注意的是 `applicationFinishedRestoringState` 是在 `viewWillAppear` 之后执行，很多资料对此描述有误。

### 🐕 [ARKit Pods — SCNPath](https://medium.com/@maxxfrazer/arkit-pods-scnpath-d4b491803019)

很多 ARKit 开发者的首选框架是 SceneKit，因为 SceneKit 可以访问 iOS 的原生功能。SceneKit 提供了一些默认的几何体，SCNBox、SCNSphere、SCNPyramid 和 SCNShape，但如果你想构建点不一样的东西，就要深入钻研来创建自己的几何体了。作者最新的开源框架用于根据 SCNVector3 点数组来创建路径，在这篇文章里作者用一个实际的例子介绍了如何利用开源的 SCNPath pod 来创建路径。

### 🐕 [Swift Import Declarations](https://nshipster.com/import/)

本文中讲述了 `import` 在 Swift 中的使用。

- 如果 import 复数 module 中有重复的字符，可以使用 `ModuleA.func ModuleB.func` 来区别调用。
- 可以指定引入某个 Module 的单一方法、变量等，如：`import func Module.funcA`（第二个为 funcA 类型）。
- Swift 同名处理优先级：本地声明 > 引入指定声明 > 引入模块。
- 引入模块中常量，变量的时候，最好使用 `import type Module.var` 的方式，更好让其理解作者的意图。
- 引入子模块 `import Module.subModule`，以防止其他子模块的影响，明确使用范围。（但不会使你的程序编译更快）。

### 🐕 [[NSMutableAttributedString initWithData:options:documentAttributes:error] 崩溃分析](https://www.jianshu.com/p/184a57f12c6e)

本文从汇编的角度，逐步定位了 `NSMutableAttributedString initWithData:options:documentAttributes:error` 概率崩溃的问题，其定位问题的过程、思路和方法值得借鉴。另外文中提到的 [优雅解决 iOS 8 UIScrollView delegate EXC_BAD_ACCESS](http://ziecho.com/post/ios/avoiding-uiscrollview-exc_bad_access-on-ios8) 中的方法也推荐参考。

### 🐕 [Why is there a "lag" in iOS gesture detection near the edges of the screen?](https://blog.kulman.sk/why-ios-gestures-lag-at-the-screen-edges/)

作者分享了一次排查屏幕边缘手势延迟 bug 的过程，小编觉得这个 bug 非常有意思，很值得大家花一些时间去了解它，让大家对手势有更多一点了解。

### 🐎 [App thinning checklist](https://oldoldb.com/2019/01/09/App-thinning-checklist/)

本文作者总结了他对 iOS 版的 Microsoft Edge 进行安装包瘦身时所用到的一些思路、方法和工具，各位可以收藏以便需要做应用瘦身时拿来参考用。文章中提到把监控包大小加入到持续集成环节中是非常值得去实践的一种做法。

### 🐕 [饿了么物流移动端业务可用性监控体系建设](https://juejin.im/post/5c3577e0f265da616c65ca80)

本文介绍了饿了么物流团队在移动端业务可用性监控体系建设上的一些探索和实践，这为有在做可用性监控体系的朋友们提供了一些很好的参考方案和思路。他们把监控体系大致分为了四层，从大盘趋势到异常实时告警以及使用日志进行现场还原，同时还可以通过大数据分析业务健康程度。之后分享了一个排查网络层问题的实战经历来说明这套监控体系的价值。在文末他们提到了一些目前遇到的问题和接下来的发展方向。

### 🐕 [Implenting Promises in Swift](https://felginep.github.io/2019-01-06/implementing-promises-in-swift)

目前网上很少有 Swift 实现 Promises 相关的文章，所以作者写了一篇文章分享了相关的内容，并且作者选择了测试驱动开发，不断地构建测试，然后再不断地调整代码满足测试，非常值得一看。

### 🐕 [How to read Apple’s developer documentation](https://www.hackingwithswift.com/articles/167/how-to-read-apples-developer-documentation)

阅读技术文档是工程师必备的技能之一，但很有趣的是，阅读技术文档不只是国人入门编程的一道坎，其实很多以英语为母语的人也一样不擅长。Swift 技术网站 Hacking With Swift 过去一年收到最多的文章请求，就是帮助读者阅读和理解苹果的代码文档，所以就诞生了这么一篇文章。

作者首先帮助大家理清技术文档的内容和结构，接着以具体的例子带着大家一起“查文档”，找到对应的定义，例子和代码，最后还鼓励大家，其实苹果的文档也有很多不足的地方，大家找不到自己需要的东西的时候也不需要灰心。

### 🐢 [The Many Offline Options for iOS Apps](https://medium.com/device-blogs/the-many-offline-options-for-ios-apps-2922c9b3bff3)

本文作者比较了 iOS 中的各种存储数据以达到 App 无网正常使用的方案，根据统计，如果加载速度超过 3 秒，有 40% 的用户会放弃使用。而在美国，有 15% 的 App 使用时间是处于无网状态下。因此，一个合理的离线运行方案将会为你的 App 带来更高的用户留存率。

- 使用数据库：Realm、Core Data、Sqlite  等
- KV 形式存放数据：plist、NSUserDefaults、NSKeyedArchiver、leveldb 等
- 使用云数据库方案：Realm Platform、Firebase 等
- 考虑一下将用户离线下的操作重放
- 通过 React 的方式来监听数据变化

## 工具

### [iOS 模拟器录屏工具](https://github.com/alexp2ad/record-ios-simulator)

Xcode 的模拟器自带有截屏功能，但是并没有录屏功能，通常我们需要使用其他的录屏工具（QuickTime、LICEcap等），但这个工具让你可以方便地直接使用 Alfred workflow 或者 CLI 去触发模拟器录屏。

## 代码

### [CoreML-in-ARKit](https://github.com/hanleyweng/CoreML-in-ARKit)
本项目利用 CoreML 运行机器学习模型来识别出摄像头拍到的物体，并利用 ARKit 为其加上 3D 标签，实现简单的 AR 效果。项目代码简单，创意好，非常适合入门，学习如何使用机器学习模型处理图片及如何在 AR 场景中添加 3D 标签。苹果官方也推出了一个类似的官方 Demo：[Using Vision in Real Time with ARKit](https://developer.apple.com/documentation/arkit/using_vision_in_real_time_with_arkit)，供大家参考学习。

### [iOS 混合开发库（GICXMLLayout）](https://juejin.im/post/5bfce9d56fb9a04a102ef8ba)

很多尝试过前端开发 Vue 开发的 iOS 同学，都感慨用 Vue 开发前端 UI 界面的时候，非常的方便，非常的强大。优秀的布局能力/数据绑定 MVVM/模板式的开发。如果能在 iOS 里也能如此方便的进行UI开发，相信也会大幅度提供页面开发效率，[GICXMLLayout](https://github.com/ghwghw4/GICXMLLayout) 这个库就是这样的一个库。

GICXMLLayout 能干什么？有什么特点？

- 使用 XML 来描述 UI、动画、事件绑定、数据绑定。
- 数据绑定。
- 支持 MVVM 模式。
- 优秀的布局系统。
- 模板系统。
- 简单、优秀的自定义扩展能力。
- 支持 JavaScript。
- HotRload & HotUpdate。

相关系列文章推荐去[作者的掘金专栏](https://juejin.im/user/57d6181f816dfa00544bc3d6/posts), 作者从项目简介，到源码架构，再到新手项目，灵活扩展，还有两篇项目实战，总共有八九篇文章深入解析 GICXMLLayout，值得深入学习。

## 音视频

### 🌟 [一起来开发泊学 App 吧](https://boxueio.com/path/let-us-build-and-launch-a-forum)

如果你正在自学使用 Swift 做 iOS 开发，并期望找到一份相关的工作，但却苦于没有项目练手和熟悉整个 App 的开发流程。或者你十分向往成为一个独立开发者，但又不知从何开始。又或者你想看看 Swift 充当服务端开发语言时会有怎么样的表现。那小编十分推荐你看看泊学上的这个系列视频，你得到的会远比一些培训班得到的多。目前已经推出以下 4 个系列，且内容仍在持续更新中：

- [设计 iPhone 版泊学 App](https://boxueio.com/series/design-boxue-app-from-scratch)：基于 Apple 官方的 iOS design guideline，我们用 Sketch 从零开始设计泊学自己的 iOS App。在这个真实的项目中，了解 Sketch 的使用经验和常用插件。
- [Vapor Up and Running](https://boxueio.com/series/vapor-up-and-running)：如果，你已经掌握了 Swift 编程语言，再用它学习服务端开发，就变成了一个性价比很高的事情。这个系列里，我们会从零开始，基于 Vapor，详细地讲述每一个服务端开发领域常用的技术场景。
- [Vapor Fluent](https://boxueio.com/series/vapor-fluent)：在这个系列里，我们会实现一个类似论坛的 App。通过这个过程，来了解 Vapor 中的 Fluent 组件。通过它，我们就可以无需了解 SQL 的细节，而是用 Swift 的方式和数据库打交道。
- [基于 MVVM 构建泊学 App](https://boxueio.com/series/build-boxue-app-in-mvvm)：在这个系列里，我们以实现 Boxue App 举例，以一个独立开发者的视角，尽可能在代码的可维护性、可测试性、可重用性以及可协作性，达成让自己满意的实践。

### 🌟 [Teahour.fm | #94 与 Hawstein 和左程云聊算法和数据结构](http://teahour.fm/2019/01/02/algo-with-hawstein-and-chengyun.html)

这期的 Teahour，讲的是很多程序员很关心的算法和数据结构。特别是这一年来，国内各大公司对算法和数据结构在面试中的考察变得越来越多，重要性也越来越高。

对于 iOS 程序员来说，算法和数据结构则更应该重视。平时用不到的算法和数据结构，很可能在面试之时成为你的心头大患。有兴趣的同学不妨听听这期节目，算是能够做到有所了解。

### [ggtalk | 创业那点事：逆流而上的泊学](https://talk.swift.gg/11)

相信绝大多数 Swift 程序员都听过泊学，泊学是一个通过视频在线学习编程的网站。这一期 ggtalk 邀请到了泊学的两个创始人来聊了聊创业，小编我听一半就完全被圈粉，秒充会员看了一波视频。从整个采访过程中可以看到泊学虽然整个过程做的很不容易，但丝毫不影响两个创始人独具匠心的打造体验超棒的视频教程。这就是典型的为了要做有意义的事情而做的创业，而不是简单想着蹭热度捞一笔。墙裂看好泊学，推荐大家从听听这期节目开始，了解泊学。

## 内推

- [北京-百度网盘 持续招 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)，[@方秋枋](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)，[@老老老老老老老驴](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）
