# 老司机 iOS 周报 #36 | 2018-09-17

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

## 新闻

### [DCloud 发布又一个跨端开发框架 uni-app](https://mp.weixin.qq.com/s/oujjGXFaK4qc44KWuj0zXw)

随着微信、支付宝、百度陆续发布小程序，手机厂商联盟发布快应用，移动互联网快速向以 js 为核心的动态 App 发展。手机硬件性能日益提升，动态App体验也越来越好。一方面前端工程师迎来历史性的机遇，另一方面又发现开发如此多版本让开发者苦不堪言。

DCloud 大力投入资源为开发者打造动态 App 时代的最佳解决方案：**uni-app**。开发者使用vue技术，开发一次，可以同时生成 iOS、Android、微信小程序。接下来 uni-app 还将覆盖到 H5、其他厂商小程序及快应用。

### [提交 app 适配 iOS 12，watchOS 5, and tvOS 12](https://developer.apple.com/news/?id=09122018c)

现在，可以使用 Xcode10 GM 版本构建您的应用，并对 iOS 12, watchOS 5, and tvOS 12的最新版本进行测试。从2019年3月开始，苹果会要求所有 iPhone 的应用更新都要使用 iOS12 SDK，以支持 iPhone XS Max；而手表的应用更新需要使用 watchOS 5 SDK 以支持 Apple Watch Series 4.

## 文章

### 🌟 🐎 [老司机推荐书单](https://xiaozhuanlan.com/topic/6134790258)

周报编辑们根据各自喜好推荐给程序员的书单。每一本被推荐的书都有它的独到之处，按照自己的兴趣挑几本去买来看看吧。

### 🐎 [你的标签是什么？](https://github.com/SwiftOldDriver/iOS-Weekly/issues/722)

每个人都会被打上标签，可能是正向的善于解决问题、Web 安全专家或者是擅长创新。也可能是负向的粗心、眼高手低。程序员不能一直埋头苦干，要适当建立起自己的标签，尤其对职场新人而言，好的标签会让你脱颖而出，更多的机会会垂青于你。

### 🐢 [Swift for TensorFlow 官方教程](https://github.com/tensorflow/swift-tutorials/blob/master/iris/swift_tensorflow_tutorial.ipynb)

Swift for TensorFlow 是今年的 TensorFlow 峰会上，Chris 团队发布的一项新的技术，旨在为 Swift 提供内置的、first class 的机器学习的能力。Swift for TensorFlow 使用一系列很有趣的技术来实现了同时具备可用性和性能，有兴趣的同学可以进一步了解。同时，Swift for TensorFlow 也提供了 jupyter kernal 得支持，使得可以使用 notebook 来写 swift。

机器学习入门教程最经典就是识别鸢尾花，iris detection。本篇教程就是 Swift for TensorFlow 版本的 iris detection，对 Swift 做机器学习感兴趣的筒子不要错过。

### 🐢 [镣铐之舞：美团安全工程师 Black Hat USA 演讲](https://juejin.im/post/5b9b178ce51d450e5d0aec26)

这是一篇来自美团安全团队的分享。美团安全团队在今年的 Black Hat USA 上做了关于 App Store Malware Automatic Hunting System 的演讲分享。团队设计了一套可自动大规模获取应用样本的 Crawl 系统，通过使用基于树莓派的构建集群来实现沙盒自动分析系统，最终实现了自动化收集样本并对样本进行自动化安全分析的APT攻击捕获及分析系统。

这篇文章中很多概念对于不做安全或者对安全领域接触较少的同学来说比较难理解，但是不妨边搜索概念和知识点边读，可增加一些安全方面的基础概念知识。

### 🐕 [How Apps Adapt to the Series 4 Apple Watch Screen Sizes](https://medium.com/@hacknicity/how-apps-adapt-to-the-series-4-apple-watch-screen-sizes-2be49f8ae8f5)

9 月 21 日新一代 Apple Watch Series 4 就要开始发货了，包含 40、44 毫米两个新屏幕尺寸，文章介绍了 watchOS App 如何适配新的设备：对于 watchOS 4 的 App， watchOS 5 默认兼容，只是还是以老的 38、44 毫米显示，以 Xcode 10 编译后，再辅以适当的调整，就能在不同屏幕尺寸上以实际大小显示。

### 🐕 [JSPatch 的 dealloc 忧伤](http://lingyuncxb.com/2018/01/21/JSPatch%E7%9A%84dealloc%E5%BF%A7%E4%BC%A4/)

有挖过 JSPatch 源码的同学应该都会留意到，它为了让 JS 能够更安全合理地 Hook `dealloc`，做了以下的处理：

1. 调用 dealloc 时 self 不包装成 `weakObject`，而是包装成 `assignObject` 传给 JS，解决了 over-released crash 问题；
2. 调用 `ORIGdealloc` 时因为 `selectorName` 改变，ARC 不认这是 `dealloc` 方法，所以需要欺骗 ARC，解决了对象正常释放的问题；

这样的处理可谓巧妙，但这位细心的读者却发现了另一个遗留问题 - JS 的 `dealloc` 方法和 `OC` 里面的 `dealloc` 方法会同时被调用。于是他针对这个问题进行了深挖，从 OC 对象的 `dealloc` 原理开始，一步步尝试，最终仅使用几行代码便解决了这个遗留问题。目前该问题已经反馈给 Bang，相信很快便会发版解决。值得一提的是，这是小编看到的第一篇从解决实际问题角度出发，来解读 Runtime 中 `dealloc` 原理的好文，好奇作者解决方案的同学快点开文章链接阅读吧。

### 🐕 [iOS 中的多进程，下拉关闭系统的词典界面（Tweak 开发）](http://iosre.com/t/ios-tweak/12806)

本文作者就下拉关闭系统的词典界面需求的实现过程进行了记录，从发现 `_UIRemoteViewController` 到找目标进程，再到 hook delegate 实现功能。整个过程都比较常规，但是 iOS 多进程这块确实是个冷门，资料也很少，iOS 开发一般是接触不到这块知识的，就算知道，也很难在实际开发中得到运用。不过当作扩展知识了解一下还是很有意思的，特别是文中提到的 Ole Begemann 写的那几篇 [关于 Remote View Controllers 的博文](https://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/)。

### 🐕 [关于 iOS 私有 API 扫描](https://www.jianshu.com/p/24026b30975f)

作者就网易游戏开源的 iOS private api checker 项目，一一阐述了如何构建私有 API 库、该项目又是如何识别 APP 中的私有 API、该方案存在哪些问题。并提出了行之有效的改进建议。
构建私有 API 库需要先构建 documented API 数据集，而新版 Xcode 的 API 文档不再使用 docSet 这种格式。[这篇文章](https://www.jianshu.com/p/999f4cc7e1fc)分享了 Xcode 9 在 Mac 上存储 documented API 的细节。

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

### 🐕 [Preparing Your App For iOS 12 Notifications](https://www.smashingmagazine.com/2018/09/preparing-your-app-for-ios-12-notifications/)

iOS 12 带来了一些新的与用户通知相关的功能，如新的授权选项、动态的快速操作与在通知内进行的用户交互。了解并适配这些新特性以助于改进应用通知在 iOS 12 中的体验。

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

### 🐢 [一次高效的依赖注入](https://juejin.im/post/5b960cbfe51d450e4f388296)

本文分析了 iOS 目前依赖注入的几个开源库。 并选择 EXTConcreteProtocol 进行了详细的分析，给出了实际项目中遇到的问题与解决方案。

### 🐎 [DRIVING CARS WITH ARKIT](https://martinmitrevski.com/2018/09/13/driving-cars-with-arkit/)

这篇小短文会教你如何利用 ARKit 制作一款增强现实的奥迪 Q7 驾驶 app。利用平面检测模拟真实的驾驶效果，而不至于漂浮在半空中。

### 🐎 [利用 ARkit，eBay 用头部运动控制 iPhone X 屏幕进行购物](https://mp.weixin.qq.com/s/me_uVJYpFsSCT0Yxp7uSMw)

电商巨头 eBay 日前揭晓了一项新技术 HeadGaze，利用了苹果 ARKit 平台和 iPhone X 的原深感前置摄像头（支持 Face ID）来支持残障人士通过头部运动来与 iPhone X 屏幕进行交互，并已经将底层技术开源托管至 GitHub。简而言之，HeadGaze 会通过虚拟触针紧跟用户的头部运动，把游标移向滚轴或其他交互式按钮。系统可检测游标停留在一个位置的时间，并在达到一定阀值时予以触发，实现激活点击操作。

### 🐕 [利用柯里化去除重复代码](https://iweiyun.github.io/2018/09/04/curry-cleancode/)

柯里化是把接受多个参数的函数，变换成接受一个单一参数（最初函数的第一个参数）的函数，并且返回接受余下的参数且返回结果的新函数，的函数式编程方式，本文通过一个实际案例尝试了使用柯里化来完成对代码的精简，对于理解柯里化是很好的案例。

### 🐢 [JSPatch VS Aspects](http://lingyuncxb.com/2018/01/24/iOS%E6%B6%88%E6%81%AF%E8%BD%AC%E5%8F%91%E7%9A%84%E6%AD%A3%E7%A1%AEHook%E5%A7%BF%E5%8A%BF/)

JSPatch 应该已经无需过多介绍。Aspects 是 iOS 上的一个轻量级面向切面编程（AOP）的库。本文先后介绍了 JSPatch 和 Aspects 如何利用 forwardInvocation 将实现自己的功能，同时介绍了 iOS 上消息转发机制的 Hook 原理。而Hook 是有风险的，那么项目中同时接入这两个库会有什么样的问题呢？文章作者通过实践列出了可能遇到的一些问题。现实中，一个工程往往会接入更多的一些三方库，以及自己的一些功能也可能使用 Hook，所以，在对 Hook 的处理上要格外小心，关于如何正确使用这一点，作者也给出了自己的答案。

## 工具

### [pointfreeco/swift-html](https://github.com/pointfreeco/swift-html)

swift-html 是一款 server side swift 的工具，能够帮助swift使用者在开发服务器后端的时候方便快捷的生成html，从而进行后端渲染页面，并且类型安全，可扩展性强。

## 代码

### [VideoFlint/Cabbage](https://github.com/VideoFlint/Cabbage)

Cabbage 是一个基于 AVFoundation 封装，易于使用和方便扩展的视频编辑框架，能够缩短开发者在短视频功能上的开发时间。

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

## 专栏

### 🌟 [WWDC18 内参](https://xiaozhuanlan.com/wwdc18)

6 月的时候我们联合一些开发者翻译了一些 WWDC 18 的 session（[老司机x知识小集xSwiftGG WWDC 18 专题目录](https://juejin.im/post/5b1d284df265da6e572b3d87)），当时为了尽快呈现一些内容给大家，也只是挑选了一部分 session 讲解。于是剩下的几篇 session 的内容就留到了这个专栏上发布。

如果没有时间看 session 的同学强烈推荐购买支持一下作者们了。

## 音视频

[提交镜像到 DockerHub](https://boxueio.com/series/docker-based-vapor-env/episode/424)
Docker 提供了一种和 git 类似的机制来管理我们对容器的修改，因此我们也可以利用这种机制来提交和分享镜像。这段视频里，我们就来分享 DockerHub 的用法。

[构建 Vapor 开发环境 1](https://boxueio.com/series/docker-based-vapor-env/episode/425)
这段视频里，我们和大家分享如何让 Nginx 容器作为一个反向代理，把需要动态请求的部分，转发给 Vapor。

[构建 Vapor 开发环境 2](https://boxueio.com/series/docker-based-vapor-env/episode/425)
Docker 提供了一个 link 的功能，我们可以使用它把之前创建的 Nginx 和 Vapor 容器连接起来，这样，就有一个最原始的 Vapor 开发环境了。

[关于 iPhone Xs, iPhone Xs Max, iPhone Xr, 和 Apple Watch Series 4 的适配](https://developer.apple.com/videos/)
苹果官方提供了新的视频，用于指导开发者如何适配新的手机和新的watch，Apple Watch Series 4 堪称超级传感器的集合，因此对于开发者来说需要适配的东西还是蛮多的，建议大家在9月份发布新版app之前都先用`Xcode10-GM`版过一下模拟器，看看有没有明显的问题。

[Building Apps for iPhone XS, iPhone XS Max, and iPhone XR](https://developer.apple.com/videos/play/tech-talks/207/)
[Designing for Apple Watch Series 4](https://developer.apple.com/videos/play/tech-talks/802/)
[Developing Complications for Apple Watch Series 4](https://developer.apple.com/videos/play/tech-talks/208/)
P.S. 我们团队发现如果用 `Xcode10-GM` 打包 IPA，里面的 Assets.car 文件，包含了重复的 png 图片信息，而之前 `Xcode9.4.1` 却没有此问题。`Xcode10-GM` 版的这个 bug，会导致 iOS9.0 ~ iOS9.2 的机子在使用 Assets.xcassets 里面的图片后，发生随机 Crash。 
解决方法有二：要不不使用 Assets.xcassets 而改用 Bundle 取图片（对旧项目改动较大），要不就将 APP 支持的最低版本升级到 iOS9.2 以上。目前已将此 bug 报告给苹果，希望在 `Xcdoe 10 正式版`中得到改善。

## 内推

- [北京-百度网盘 持续招 iOS 开发](https://talent.baidu.com/external/baidu/index.html#/jobDetail/2/102507)：社招、应届、实习均可。项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来切磋，也欢迎计算机基础好的小白来共同学习。简历发邮箱 xuyafei01@baidu.com，暂不考虑的也欢迎微博私信 [@小非86](https://weibo.com/xuyafei86) 聊聊~

- [杭州-丁香园招 iOS 开发](https://app.dxy.cn)：招中高级 iOS 开发，要求有 Swift 开发经验，简历请邮件至 gp@dxy.cn。

- [北京-蚂蚁金服 招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。


## 关注我们

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

![](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)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@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)，[@JasonYuh](https://weibo.com/jasonyuh)，[@老老老老老老老驴](https://weibo.com/u/6090610445)

## 说明

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

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