# 老司机 iOS 周报 #5 | 2018-01-29

![ios-weekly](../assets/ios-weekly.png)

欢迎 [@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao) 一起参与日后周报的编辑工作。

## 新闻

### [iOS 11.3 要来了，这是 iOS 11 目前为止最大的一次更新](https://www.apple.com/cn/newsroom/2018/01/apple-previews-ios-11-3)

苹果近期发布了 11.3 的开发者预览版，也一起发布了 [Xcode 9.3 Beta](https://developer.apple.com/news/?id=01242018d)，预计在春季正式发布（3 月）。这是 iOS 11 目前为止最大的一次更新，主要增加了电池健康状况查看，ARKit 升级至 1.5 版本，[Safari 支持 service worker](https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_11_1.html#//apple_ref/doc/uid/TP40014305-CH14-SW1)，以及其他很多小改进。

### iOS 11.2.5 推送，Homepod 开始预购

苹果公司正式推送了 iOS 11.2.5 正式版更新，该版本加入了对 HomePod 智能音箱的支持，让其可以通过Siri朗读新闻（仅限美国、英国和澳大利亚）。此次更新的版本依然以修复 Bug 和安全漏洞为主。

同时 [HomePod 也公布了上市时间](https://weibo.com/ttarticle/p/show?id=2309404199728781899741)，宣布在 2 月 9 日发售，1 月 26 日开始预购，首发国家只有美国、英国、澳大利亚。今年春季在法国和德国推出。但何时登陆中国市场目前尚未得知。

### [Apple’s augmented reality tool kit can now detect walls and 2D images in beta](https://techcrunch.com/2018/01/24/apples-augmented-reality-tool-kit-can-now-detect-walls-and-2d-images-in-beta/)

ARKit 发布了一个重要的小版本更新：支持了垂直面检测，可以检测墙壁；同时也改善了对不规则水平面的识别；整体的追踪速度和精确性都得到了提高；呈现给用户的视频流也从 720p 提升到了 1080p，让 AR 体验更加真实。此外还有一个不显眼、但很有想象空间的更新是基于计算机视觉的内置 2D 图像识别，能够识别墙上的海报或画作等，可以用于判断场景中的位置，增加 AR 体验的连续性。 这一系列更新给 ARKit 应用带来了更多的想象空间，虽然 ARKit 目前的表现有些言过于实，但随着 Apple 更多这样令人惊喜的迭代，相信 AR 应用真正改变人们生活的那一天终会到来。

### [Swift 官方论坛迁移完成啦！！！](https://swift.org/blog/forums/?utm_campaign=Swift%2BWeb%2BWeekly&utm_medium=email&utm_source=Swift_Web_Weekly_41)

这周 Swift 论坛终于完成了迁移，对于 Swift 开发或者是细节决策感兴趣的人，可以去看看之前那些功能的讨论，例如 [Swift 4.1 里新引入的“旧“成员 compactMap](https://forums.swift.org/t/review-se-0187-introduce-sequence-filtermap/6977/17)，或者是新的几个提案。

### [漏洞预警 | iOS WebView 跨域访问漏洞](https://mp.weixin.qq.com/s/aRlxqxGw8etqep62qG4khA)

早先被证实发生在安卓上的 File 协议跨域访问漏洞被确认 iOS 也存在，`allowFileAccessFromFileURLs` 与 `WebKitAllowUniversalAccessFromFileURLs` 2 个开关控制用于允许 `File://` 协议打开本地页面时任意访问本地路径文件与其他网络资源，这两个开关在UIWebView默认为开启状态，因此存在漏洞问题，WKWebView 默认关闭，无风险，但自行打开 allowFileAccessFromFileURLs 的一样存在风险（很多加载离线网页的博客文章教人打开这开关），解决办法：迁移至 WKWebView 并且确保不自行打开开关。

### [小程序支持跳转 App 了](https://mp.weixin.qq.com/s/0etOZyu0XXbRcHE7vvqiDA)

对于开发人员来说，相比新闻本身，更需要关注的是[打开 App](https://mp.weixin.qq.com/debug/wxadoc/dev/api/launchApp.html) 以及 [App 链接分享到微信打开小程序](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317332&token=&lang=zh_CN)的代码怎么写？有兴趣或者已经有需求的童鞋可以参考这两个链接进行实践。

## 文章

### [YYCache 源码解析](https://juejin.im/post/5a657a946fb9a01cb64ee761)

YYCache 是知名的 key-value 线程安全、高性能缓存组件。[@J_Knight_](https://weibo.com/u/1929625262) 从使用方法、架构设计、代码讲解三个角度详细的分析了 YYCache 的实现。

### [函数式编程圣经](https://mp.weixin.qq.com/s/0gErQ3tjDLZuD1bYOhi0mQ)

知名公众号“码农翻身”老刘继《[面向对象圣经](http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665514215&idx=1&sn=d282846d39025925311d0c7edb327147&chksm=80d67ca4b7a1f5b2e993675df8313927b9c96cd6fe056ad7bc843d7fc4b6572b27fdbf508459&scene=21#wechat_redirect)》之后的又一力作《函数式编程圣经》，在这篇文章里，神五天创造不变量、纯函数、递归、高阶函数，让上帝为你解释函数式编程发展的来龙去脉，以及为什么函数式世界的程序员每周能休息两天。

### [Weex + Ui - Weex Conf 2018](https://zhuanlan.zhihu.com/p/33153760)

介绍了 weex 在飞猪的实践经验，在飞猪使用 weex 后：`首屏可用时间降级 68、Bundle大小直接减少了 73%，由于体验变好变快、让我们页面转化率居然提升了 14.5%`。也分享了 Weex 页面在飞猪、手淘、支付宝进行多端投放的思路。

最后介绍了 weex 业务在阿里集团使用过程中产生 [weex-ui](https://github.com/alibaba/weex-ui) 开源库的过程。

### [JS 在微信、微博、QQ、Safari 唤起 App 的解决方案](https://segmentfault.com/a/1190000012940046)

经过长时间的实验，总结微博、微信、QQ、Safari 在 iOS 及安卓平台，唤起 APP 成功及失败的解决方案。

实现用户点击 H5 页面的打开 App 或者下载按钮，如果用户已经安装了 App，则根据业务跳转到相应的 Native 页面，如果用户没有安装该应用，则跳转 AppStore 或者应用市场去下载 App。

### [2018 iOS 社招面试经验](https://xiaozhuanlan.com/topic/4985160237)

Offer 收割机手拿阿里、滴滴、美团等六家 offer，来分享自己的复习资料、面试遇到的知识点、以及面试准备方式，并介绍面试的各公司的流程和风格，**本文需要付费才能阅读完整文章**。

### [面向对象的 JavaScript 编程：原理与实践](https://github.com/haitaoxin/jsoo)

如果你是一个刚接触 JS 的其他语言开发者（比如作为一个客户端对现在的大前端方向有浓厚兴趣），看到 JS 的面向对象编程一定觉得诡异无比无法理解，那么看看这篇有助于帮你解惑。

### [实现一个 JavaScriptCore 的 debugger —— iOS 篇](http://taobaofed.org/blog/2018/01/23/implement-javascriptcore-debugger-ios/)
这篇文章里教你如何在 iOS App 里亲自实现一个 JS 的 debugger，首先教你如何用 JavaScriptCore 的源码在项目中 build 起来，然后继承 JSC:Debugger 重新实现一个 MyDebugger，这样就可以自行定义 debug 能力了，可以在 debugger 触发的时候由 App 自行开发相关的功能，自己在 App 里写一个 devTool 也未尝不可。

### 🚧 [Getting started with Bluetooth Low Energy on iOS](https://codeburst.io/getting-started-with-bluetooth-low-energy-on-ios-ada3090fc9cc)

介绍了和蓝牙外设通讯需要了解的一些概念，并且用一个实例演示了如何使用 iOS 的 CoreBluetooth 框架进行开发。CoreBluetooth 的入门使用 Raywenderlich 上的 [Core Bluetooth Tutorial for iOS: Heart Rate Monitor](https://www.raywenderlich.com/177848/core-bluetooth-tutorial-for-ios-heart-rate-monitor) 介绍的也很清晰。

### [软件工程师需要了解的网络知识：从铜线到HTTP（一）—— 前言](https://lvwenhan.com/操作系统/485.html)

这是一系列文章，其目标是让软件工程师了解网络各层的本质。系列文章从网线开始讲起，一路带你了解 `以太网`、`TCP/IP` 和 `HTTP/HTTPS`，建议精读。

### [Recreating the Apple Music Now Playing Transition](https://www.raywenderlich.com/178798/recreating-the-apple-music-now-playing-transition)

从零开始实现一个 Apple Music 的 `Now Playing` 动画，主要基于 `StoryBoard` 及 `Auto Layout constraints Animating`。

### [Simplifying Swift framework development](https://davedelong.com/blog/2018/01/19/simplifying-swift-framework-development)

介绍了两个简化 Swift Framework 开发的小技巧：
- 使用 `@_exported` 声明引用，从而不用在每个 Swift 文件中都进行声明，类似  Objective-C 中的 Prefix Header；
- 通过 `class` 的方式生成 `Bundle`，并定义成 Constant，从而更方便地获取 Framework 中的资源文件。

### [How to create a complex loading animation in Swift](https://www.raywenderlich.com/102590/how-to-create-a-complex-loading-animation-in-swift)

[raywenderlich](https://www.raywenderlich.com/) 的教程一直以通俗易懂闻名，这次推荐的是一篇一步一步教你实现复杂动画的教程，使用的核心技术点是 `CAAnimationGroup`。如果你没有时间一步一步跟着实现，也可以通过[这个地址](https://koenig-media.raywenderlich.com/uploads/2015/05/SBLoader-Finished.zip)直接下载，查看完整的 Demo 工程。

### [Creating Flows](https://mag.n26.com/creating-flows-f1c2e1bc8108)

流程是用户交互设计的一个重点，例如说注册，我们不会给用户展示一个长长的列表去填写信息，而是会切分成多个页面去让用户逐步完成。那么我们该如何使用代码去组织这样的流程呢？在这篇文章里作者就深入地探讨了如何使用低耦合的组件来完成这样一套流程。

### [中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines)

在我们的日常工作中，经常需要编写一些文案、材料、报告之类的文本，大家应该已经非常熟练了。不过，大家是否有认真考虑过自己的标点、空格等的使用是否妥当呢？这篇文章给大家进行了较详细的分析，希望大家阅读后结合自己的思考，统一中文文案、排版的相关用法，形成自己（或团队）的排版规范。

### [为什么要缓存 NSDateFormatter ?](https://weibo.com/2293476232/FFEiG7pUw)

创建一个 NSDateFormatter 对象并不像我们想象的那样轻巧，如果你需要频繁使用某个 formatter 的话，对它进行缓存可能是一种更高效的方式。本小结阐述了问题的原因和推荐的缓存方式，值得一看。

### 🚧 [A better way to update UICollectionView data in Swift with diff framework](https://medium.com/flawless-app-stories/a-better-way-to-update-uicollectionview-data-in-swift-with-diff-framework-924db158db86)

借助 Diff 算法，以更高效的方式去刷新 UICollectionView。文章简单的介绍了一下 DeepDiff 这个库的原理及如何通过两个数组的差异对一个 UICollectionView 进行局部刷新。


## 工具

### [WoodPecker](http://www.woodpeck.cn/cnindex)

app 运行在真机时如何实时查看沙盒中的文件状态？[@张小刚哟 ](https://weibo.com/u/3127372955)开发的 WoodPecker 通过 app 创建和 mac 客户端 socket 连接来解决这个问题。除了进行基本的沙盒文件查看修改外，还可以自定义通信报文创建扩展插件，对于某些场景中调试非常实用。

目前缺点是提供的 framework 需要手动集成到应用中，还未支持 cocoapod 导入。售价 30 元，感兴趣的朋友可以体验一下。

### [Fastlane: Boarding](https://github.com/fastlane/boarding#readme)

原来添加一个 testflight 测试用户需要登录到 ITC ，手动添加邮箱。使用 boarding 可以简化这一过程。

### [iOS 爆内存问题解决方案 - OOMDetector 组件](https://mp.weixin.qq.com/s/swAwMDs5-MkU3Yew4oy9kA)

本文将介绍一款 iOS 爆内存分析利器，它可以以极其微小的代价让藏匿极深的爆内存罪魁祸首无处遁形 —— [OOMDetector](https://github.com/Tencent/OOMDetector)。OOMDetector 是手 Q 团队自研的 iOS 内存监控组件，腾讯内部目前已有多个 App 接入了 OOMDetector，它主要有以下两个功能：

- 爆内存堆栈统计：负责记录进程内存分配堆栈和内存块大小，在爆内存时 Dump 堆栈数据到磁盘；
- 内存泄漏检测：检测内存泄漏，目前支持 Malloc 内存块和 OC 对象的泄漏检测。

OOMDetector 可以快速帮助开发者发现和定位 App 爆内存问题和内存泄漏，组件目前已在 Github 开源，感兴趣的同学可以尝试使用。

## 代码

### [AppFolder](https://github.com/dreymonde/AppFolder)

AppFolder 是一个轻量级框架，用于友好的展示 App 文件夹内的目录，而且是强类型的。系统目录如 “Caches” 和 “Application Support” 已经存在，开发者也可以用几行代码添加自己的目录。AppFolder 充分利用了 Swift 的继承优势，接口简洁而又美观。有了它，你再也不需要用到 NSSearchPathForDirectoriesInDomains，再也不会。

## 书

### [刷新：重新发现商业与未来](https://www.amazon.cn/gp/product/B0788YKX2Y)

微软第三任 CEO Satya Nadella 写的书。书里介绍了他接任后对微软的改造，强调企业文化，重拾微软灵魂的过程。书中也介绍了微软业务转型过程中的一些决策过程，比如拥抱云计算、Office 在全平台的推广、Windows 10 的免费升级策略，收购 LinkedIn 等。最后一部分还谈了他对未来科技发展三个大方向的思考：虚拟现实、AI、量子计算。

## 音视频

### [比特币原理](https://www.youtube.com/watch?v=obRzfcvMshM&feature=youtu.be)

视频通过一个虚构的例子，一步一步由浅入深地介绍比特币是什么，以及比特币的基本工作原理。

## 本期编辑

[@没故事的卓同学](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)

## 说明

🚧 表示需翻墙


