# 老司机 iOS 周报 #17 | 2018-05-02

![ios-weekly](../assets/ios-weekly.png)
欢迎 [@方秋枋](https://weibo.com/100mango) 加入周报的编辑的队伍。

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

## 新闻

### [Swift for TensorFlow 正式发布](https://github.com/tensorflow/swift)

TensorFlow 社区在 TensorFlow Dev Summit 2018 上宣布将开源 Swift for TensorFlow 项目，现在终于正式发布了，这里是[源码](https://github.com/google/swift/tree/tensorflow)及示例 [Models](https://github.com/tensorflow/swift-models).


## 文章

### 🐢 🌟 [iOS 新闻类 App 内容页技术探索](https://dequan1331.github.io)

文章针对新闻类 App 内容页的技术实现进行了探索和分析。并将成果封装成三个框架：[HybridPageKit](https://github.com/dequan1331/HybridPageKit)、[ReusableNestingScrollview](https://github.com/dequan1331/ReusableNestingScrollview) 以及 [WKWebViewExtension](https://github.com/dequan1331/WKWebViewExtension)。

文章不仅从技术方案选择，组件化架构，加载速度优化给我们高屋建瓴地展示了新闻类的 Hybrid 技术应该如何构建，更重要地是开启了我们的脑洞：Hybrid 应该怎么玩才有意思。不是简单地嵌入 WebView，使用一下 JSBridge 就是 Hybrid 了。而是取长补短，让 WebView 和 Native 技术携手构造更优秀的应用体验，创造属于自己的小程序框架和能力。

### 🐢 🌟 🚧 [Code Review Best Practices](https://medium.com/@palantir/code-review-best-practices-19e02780015f)

非常细致的介绍了 code review 的整个流程。

- 为什么需要，是什么，什么时候需要 code review
- 在 code review 前需要做哪些准备工作
- 如何执行 code review
- code review 的一些示例

### 🐕 [Securing iOS Certificates using Modern Cryptography](https://medium.com/xcblog/secure-ios-certificates-using-modern-cryptography-3441bf8661a4)

文章的主题为使用现代加密技术保护 iOS 证书（certificates）。我们平时测试，提交应用到AppStore 都需要用到苹果给我们的开发证书。阅读本文，我们可以学习到如何通过 openSSL 对 iOS 开发证书进行加密。

### 🐕 [Design Patterns by Tutorials: MVVM](https://www.raywenderlich.com/192471/design-patterns-by-tutorials-mvvm)

MVVM 作为解决 MVC(Massive View Controller) 最有效的解决方案，已经成为 iOS 程序员的必学模式之一。Ray 的这篇文章抛开传统设计模式教学那种枯燥的说教，而是先手把手的使用 MVVM 的方式来实现一个小 Demo，简单易懂。值得一提的是，这是很少的纯 MVVM 教程，不像大多数 MVVM 教程都喜欢打包讲一些 reactive 和 data binding 的东西，适合萌新选手。

### 🐕 [Blurring the Lines Between MVVM and VIPER](https://medium.com/developermind/blurring-the-lines-between-mvvm-and-viper-dcb3dc9815ac)

VIPER 是又一个移动开发中流行的设计模式，初看 VIPER 中各个模块的分工，总会觉得和 MVVM 其实是有几分神似。这篇文章通过仔细分析 MVVM 和 VIPER 中各个组件的责任划分，认为 MVVM 本质就是只有 V I 和 E 的 VIPER。当业务变得复杂时，VIPER 可以衍生出 Presenter 和 Router 来保证职责划分，所以一个动态调整的 VIPER 模式相比简单的 MVVM 应该是一个更优的实践。

本文讨论内容有趣，但其思路和论证方法，都值得借鉴。

### 🐎 [Why you should not name your @IBActions didTapButton](http://blog.cocoafrog.de/2018/04/12/How-to-name-IBActions.html)

我们有时会在代码中看到 @IBAction 方法被命名为 `didTapCancelButton`、`didTapSaveButton` 或是 `didHitSend`、`cancelButtonTapped` 等类型的名称。但我认为这样是错误的，首先因为 Target-Action 是命令模式而不是委托模式，应该命名为 `undo`、`deleteBackward`、`lowercaseWord` 或 `scrollToEndOfDocument` 这样的名字。其次我们在编译时并不知道 sender 具体是谁，所以我们不应在方法名称中指定 sender 的类型。

### 🐢 [SceneKit 与 ARKit 专题](https://juejin.im/post/5a322530f265da43062ac948)

[SceneKit 系列文章](https://juejin.im/post/5a322530f265da43062ac948)是作者在学习 Ray Wenderlich 的 SceneKit 教程《3D Apple Games by Tutorials》时做的学习笔记与心得体会，共有26篇文章，内容翔实。[ARKit 专题文章](https://juejin.im/post/5a976cb3f265da4e87010184)还在持续更新中，包括制作类似 AR Stack 游戏的教程、对官方 AR Demo 的解读以及对 ARKit 1.5 新增的图片识别功能的介绍等等。

### 🐢 [Care and Feeding of Xcode Configurations](http://americanexpress.io/care-and-feeding-of-xcode-configurations)

Xcode 默认的 `build setting` 机制在团队协作中经常会因误操作等原因导致编译问题，文章介绍了引入 `xcconfig` 文件来解决此类问题(如果你使用了 `Cocoapods`，那么你已经引入了)，由此带来 `share configurations`、`change history` 等好处，最后还介绍了如何组织 `xcconfig` 文件以及一些 `ProTips`。

## 设计

### 🐎 [Custom Keyboard Extensions: Getting Started](https://www.raywenderlich.com/180180/keyboard-extensions)

自定义键盘扩展的入门教程，从 0 到 1 的讲解如何创建一个摩尔斯电码键盘，包括自定义键盘的界面，自适应键盘配色方案，自动纠正和建议，请求权限等内容。

### 🐢 [A Better MVC](https://davedelong.com/blog/2017/11/06/a-better-mvc-part-1-the-problems/)

很多 iOS 开发不喜欢 MVC，因为 iOS 中的 MVC，往往违反封装原则，且容易形成臃肿的 ViewController。解决封装原则的问题，可以通过引入一个协调器（Coordinator），所有的子视图控制器或者视图，只负责显示，而如何显示它们，则委托给协调器去处理。 ViewController 臃肿的问题，需要知道，1 View Controller ≠ 1 screen of content， 可以将一个页面，分割成一个一个的子 ViewController，去负责页面元素的显示，而主 ViewController 只作为协调器存在。

该文作者近期参加了『[App Builders 2018](#-app-builders-2018)』，并也针对这个主题进行了分享，有兴趣的读者可以到 YouTube 上面观看这个分享视频——[Dave DeLong - A Better MVC](https://www.youtube.com/watch?v=YWVzCd5FYbs&index=20&list=PLLcE3DL3f5BzR14FYTO9w0l5REVVSDNB4&t=0s)。

### 🐕 [iOS App 的加固保护原理](http://www.cnblogs.com/163yun/p/8867975.html)

出自网易杭研的一篇对 iOS App 加固保护原理深度分析的好文。文中从如何对 App 破解出发，从以下 4 个大点阐述了 App 的加固原理：

- 字符串混淆
- 类名、方法名混淆
- 程序结构混淆加密
- 反调试、反注入等一些主动保护策略

### 🐢 🌟 🚧 [Playground driven development in Swift](https://medium.com/flawless-app-stories/playground-driven-development-in-swift-cf167489fe7b)

文章详细描述了如何去构建一个基于 Playground 的 App 开发环境，对于经常要开发 UI 界面的开发者来说，使用作者介绍的这一套流程，可以大大提高自己的开发效率。

### 🐎 [Codable vs. ObjectMapper](https://medium.com/bbc-design-engineering/codable-vs-objectmapper-af5fe8e8efd5)

作者分析了 Codable 和 ObjectMapper 的区别，Codable 相对来说比较简单易用，而 ObjectMapper 提供了更多高级功能，例如数据转换，数据验证，可读性更强的错误信息等等。并且作者也扩展了 Codable ，实现 ObjectMapper 的这几个主要的 feature，让我想起了之前看过的另一个项目 [AnyCodable](https://github.com/Flight-School/AnyCodable)。想要扩展 Codable 但无从下手的同学可以考虑看看。

### 🐎 [Inspect your app’s Documents directory in the Files.app](https://twitter.com/olebegemann/status/987346188591681536)

小技巧，如果我们在 `Info.plist` 中设置了 `LSSupportsOpeningDocumentsInPlace=YES` 和 `UIFileSharingEnabled=YES`，就能够从苹果官方的文件管理器 [Files](https://itunes.apple.com/cn/app/Files/id1232058109?mt=8) 对 App 的 Documents 目录进行查看，更多信息可参考 [苹果官方文档](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW13)。

### 🐕 [网易HubbleData无埋点SDK在iOS端的设计与实现](https://neyoufan.github.io/2017/04/19/ios/%E7%BD%91%E6%98%93HubbleData%E6%97%A0%E5%9F%8B%E7%82%B9SDK%E5%9C%A8iOS%E7%AB%AF%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/)

这是一篇非常值得一看的文章，从代码埋点到可视化埋点再到无埋点，层层递进。更可贵的是，详细介绍了如何利用aop的方式实现无埋点的整个思路，和解决的一系列问题。从思想到方法都有了。

### 🐢 [Reimplementation of Implicitly Unwrapped Optionals](https://swift.org/blog/iuo/)

为了提升类型检查的一致性，Swift 的下个版本计划对 `ImplicitlyUnwrappedOptional ` 类型相关的一些操作进行重新实现，其实说到底所有的操作都是为了去掉 `ImplicitlyUnwrappedOptional ` 类型，这样可选值类型就剩 `Optional<T>`，`!` 则只是一个操作符而已，不包含 `ImplicitlyUnwrappedOptional ` 这个特殊类型的含义。不过小编看了下所有的改动，目测应该都是可以用代码迁移器搞定的，大家不用特别担心下个版本需要做代码的大变动。

### 🐕 [Swift, Plist and Two Smoking Scripts](https://medium.com/rosberryapps/swift-plist-and-two-smoking-scripts-94bb54cbeded)

有没有想过整个项目从前端到后端全部用 Swift 来开发？甚至包括脚本？本文介绍了怎样用 Swift 在十五分钟内开发一个能够帮助我们对项目设置进行检查的 Build Phase 脚本，值得一看。

## 工具

### [What's New in Swift 终极版](https://www.whatsnewinswift.com)

有人做了一个网站给 Swift，详细介绍每个版本的更新内容，你还可以选择具体的版本范围，然后就能看到这中间更新了什么。

## 音视频

### 🚧 [App Builders 2018](https://www.youtube.com/playlist?list=PLLcE3DL3f5BzR14FYTO9w0l5REVVSDNB4)

App Builders Conference 是由来自欧洲各国的 Android 和 iOS 移动开发者一起举办的分享交流会。本次大会在瑞士举行，目前 YouTube 上已经收录有该大会的 26 个直播视频，平均每个视频约 30 mins，分享的内容从 Google AR 到 iOS 的 CoreML，从 Swift 到 App 架构，方方面面都有涉及。

其中本期周报中收录的『[A Better MVC](#-a-better-mvc)』一文也在该会上进行了分享。

## 关注我们

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

![](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)，[@EyreFree](https://weibo.com/eyrefree777)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)， [@叶孤城](https://weibo.com/u/1438670852)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)

## 说明

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

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