# 老司机 iOS 周报 #83 | 2019-09-09

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

## 新闻

### [App Store Connect warning: UIWebView API deprecation](https://forum.ionicframework.com/t/app-store-connect-warning-uiwebview-api-deprecation/172063/3)

[@looping](https://github.com/looping)：上月（8月）底陆续有人在打包上传到 App Store 时收到苹果审核的反馈邮件，提到他们将会停止接收还在使用 UIWebView API 的应用，希望开发者在下次提交的时候处理好这个问题。同时在 GitHub 上观察到有使用 UIWebView 的大部分主流开源库也收到了开发者提的苹果废弃 UIWebView API 的 issue，并且很多库都已经做好了更新。虽然苹果提醒开发者处理这个问题，但是没有给出审核规则具体的执行时间，所以应该会预留一些时间供开发者对工程代码进行技术迁移。为了应对这个问题，我们建议接下来做好以下几个事情：

- 列出自己工程里有用到 UIWebView 的地方，并想办法逐步迁移到 WKWebView
- 关注工程里用到的开源类库和三方 SDK，有更新的及时更新
- 做好准备，等待苹果审核的进一步消息

## 新手推荐

### 🐎 [从 Flutter Go 到 Flutter Go web - 手把手带你轻松玩转 Flutter-web（一）](https://juejin.im/post/5d6a9456e51d4561cc25f080)

[@极速男孩](https://github.com/ztlyyznf001)：Google 在今年的 Google 大会中发布了 Flutter for Web ，本文介绍了如何使用 Flutter-go-web 去创建一个 flutter-web 的项目，并给出了具体[示例](https://github.com/alibaba/flutter-go/tree/web/flutter-go-web-0.0.1)。

## 文章

### 🐎 [在闲鱼实习做 Flutter 是什么感受？](https://mp.weixin.qq.com/s/DVl6s3EE5pKMoE-qltsK3A)

[@老峰](https://github.com/GesanTung)：本文作者分享在闲鱼学习上手 Flutter 的过程，通过重构发布页，熟悉项目工程，熟悉项目流程，学习并优化已有框架。最后也给出了 Flutter 的初步学习路线，以及对职场新人的建议，感兴趣的读者可以看看。

### 🚧 🐎 [Should you write your app in SwiftUI?](https://thatthinginswift.com/should-you-use-swiftui-in-your-app/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B419)
[@水水](https://www.xuyanlan.com)：本文就是否应该在你的 APP 中使用 SwiftUI 进行了讨论，列举了比较完整的几个优缺点进行对比，希望给犹豫不决的读者有所启发和更进一步的了解。

### 🐎 [iOS调试Block引用对象无法被释放的一个小技巧](https://juejin.im/post/5d70655e518825618e67ad63)

[@J_Knight_](https://github.com/knightsj)：而本文作者介绍了一种使用 dis -s 指令来查看 block 所对应的实现代码的方法：通过在 lldb 控制台输入 dis -s [block 地址]，就可以反汇编该地址所对应符号信息以及开始一部分的汇编实现，我们就可以知道该地址所对应 block 所在的方法了。

### 🐕 [马蜂窝视频编辑框架设计及在 iOS 端的业务实践](https://mp.weixin.qq.com/s/-GGbakkEe7dmC23HT0k3ow)

[@莲叔](https://weibo.com/aaaron7)：视频拍摄与视频编辑模块逐渐成为很多超级 App 的必备模块之一。除了像抖音和快手这样的短视频应用，像比如点评和马蜂窝这样的 O2O app在面临内容形式从图文到视频，生产方面从 PGC 到 UGC 的转变下，都需要在 APP 中实现视频拍摄和编辑模块。视频编辑模块相比传统的客户端组件，技术栈除了平台的 API 之外还包括一系列音视频处理的知识，存在一定的门槛。马蜂窝这篇文章比较系统的介绍在在 iOS 上实现一套视频编辑框架需要做的事情，是很好的入门素材，建议有兴趣的同学可以看看。


### 🐎 [Dark Mode on i​OS 13](https://nshipster.com/dark-mode/)

[@红纸](https://github.com/nianran)：作者写的标题有点大，本文实际仅针对于 iOS 13 上颜色的管理提及了 6 个方面（色值/HEX值/系统色值/组件默认色值/Color Set/Xib Color/）。其主要包含如何查找/替换工程中应用的色值以用于适配 iOS 13。

### 🐎 [历时五天用 SwiftUI 做了一款 APP，阿里工程师如何做的？](https://mp.weixin.qq.com/s/QgDSuTFjwFlXzhksfgmkIQ)

[@四娘](https://kemchenj.github.io)：淘宝内部尝试使用 SwiftUI 编写一个内部数据监测的 App，简单介绍了一下 SwiftUI 的数据流以及 UI 的自定义，文末对于 SwiftUI 给出了很正面的评价：

> 此项目在短短的 10 个工作日内就能完成，不得不说 SwiftUI 的开发效率真的惊人，虽然目前还有一些 Bug ，但是相信在未来，SwiftUI 会是 Apple 平台 UI 布局的解决办法，关于 SwiftUI 如何在淘系落地业务，还在持续探索中。

### 🐎 [The Curious Case of the Core Data Crash](https://blog.iconfactory.com/2019/08/the-curious-case-of-the-core-data-crash)

[@anotheren](https://github.com/anotheren)：Twitterrific 的开发者多年来一直被一个 Core Data 的 Crash 问题困扰，但是一直找不到问题的确切原因。直到近期 TestFlight 反馈上线以后，他发现了一些蛛丝马迹。原来 Twitterrific 被切换时可能会有一些后台下载任务，完成后需要写入 CoreData。虽然后台下载能够正确完成，但数据还未完全写入 Core Data 时，就被错误的标记了后台任务完成，于是应用就被 iOS 系统杀死了。这时在 Crash Report 中就会报告一个 Core Data 的问题，但是实际问题却不在 Core Data 这边。如果你也有类似的问题，不妨看看作者的分析。

### 🐎 [在 Flutter 中如何把报错信息通过服务上传](https://mp.weixin.qq.com/s/foCab1u5je34MdMeb2_-2w)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：App 开发中一个比较重要的环节就是错误捕获上传, Flutter 应用也不例外. 本文介绍了如何通过 Sentry 来捕获 Flutter 应用的错误并上传, 文末附上了完整的 Demo. 这里小编顺带提醒一句: Flutter 1.9.x 对应用的报错进行大量的改良 🎉🎉🎉

### 🐕 [RxSwift异步事件追踪定位工具的研发历程](https://mp.weixin.qq.com/s/h48jcWghZBysU0-0gH8bog)

[@AidenRao](https://weibo.com/AidenRao)：当你使用 RxSwift 来实现一些简单的功能如发送一次网络请求、监听按钮点击事件等会让你的代码看起来非常直观简洁，但是如果你使用 RxSwift 实现了一个异步热流且在不同的类之间层层传递和加工转换之后代码的可读性就大大降低，甚至因为抓不到异步事件产生的堆栈而出现难以调试的情况。

为解决 RxSwift 的调试难题，作者通过阅读源码分析 RxSwift 操作符实现原理，然后利用 Swift 反射机制来 dump “Observable Link”，最后又根据 Swift 语言的函数派发机制和命名空间机制设计了一套安全高效的 hook Swift 的动态及静态方法的方案，通过这套 hook 方案完成了对流事件传递链上的关键函数的拦截处理从而顺利实现了精准定位和调试 RxSwift 中异步事件的目标。

## 工具

### 🐎 [Unused code cleanup in iOS projects](https://www.onswiftwings.com/unused-code-cleanup/)

[@zvving](https://github.com/zvving)：无用代码总随着项目迭代猥琐发育，逼迫我们养成定期清理的习惯。

本文简单介绍几种清理方式，尤其是能精准的分析 Swift 无用代码的 [Periphery](https://github.com/peripheryapp/periphery)，推荐一试。

## 代码

### [KKJSBridge](https://github.com/karosLi/KKJSBridge)

[@享耳先森](https://github.com/iblacksun): 一站式解决 WKWebView 支持离线包、Ajax 请求和 Cookie 同步的问题 (基于 Ajax Hook 和 Cookie Hook)：
- 基于 MessageHandler 搭建通信层
- 支持 ajax hook 避免 body 丢失
- Cookie 统一管理
- WKWebView 复用
- 兼容 WebViewJavascriptBridge

### [TTAnalyzeLoadTime](https://github.com/huakucha/TTAnalyzeLoadTime)

[@张嘉夫](https://github.com/josephchang10)：通过 Mach-O 文件 NonlazyClassList 构建动态库进行 iOS load 方法耗时检测：
- 仓库中提供了源码以及二进制的文件，源码提供了整个 AnalyzeLoadTime 的全部文件 TTLoadTime.mm，二进制文件为一个动态库，动态库为尽可能提前执行 Load Method Swizzling 提供了可能。
- 重写 _getObjc2NonlazyCategoryList、_getObjc2NonlazyClassList，可以快速拿到全部 load 的所属 Class 以及 load 的 IMP 地址。
- 防止运行环境被破坏使用 method_setImplementation 构建 block 执行原函数。
- 寻找 mach-o 中的 load 以及 Swizzle 共耗时 4 毫秒。

### [LookinServer](https://github.com/QMUI/LookinServer)

[@Jimq](https://github.com/waz0820)：[Lookin](https://lookin.work) iOS 端的代码已开源（ macOS 端的代码并未开源）。作为 iOS UI 调试工具，主要看点包括与所连接 Mac 的点对点通信，当前页面 UI 信息的结构化提取、使用、传输与导出，UI 图层的 2D/3D 预览，UI 继承树的展示，点选的 UI 控件信息展示，指定方法监听等，对此比较好奇的同学可以一读。

## 音视频

### [ggtalk | 没事刷刷算法](https://talk.swift.gg/41?from=timeline&isappinstalled=0)

[@AidenRao](https://weibo.com/AidenRao)：本期磊子和 wamaker 会聊聊算法。算法是个大话题，这期讲的只是两个从业者的小故事，看看他们如何认识算法，如何学习算法，如何看待算法。

## 内推

- [上海-百度手机输入法_iOS 资深研发工程师](https://www.lagou.com/jobs/6101507.html)：项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来撩～。简历发邮箱 xuyanlan@baidu.com 哦～ 急急急！
- [杭州 丁香园 丁香妈妈业务线 iOS 资深研发工程师](https://www.lagou.com/jobs/6253973.html)：要求有 Swift 实际开发经验，简历请发至 gp@dxy.cn . 


老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（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 。

## 说明

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

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