# 老司机 iOS 周报 #11 | 2018-03-19

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

老司机 iOS 周报第十期在 GitHub 上的 Star 数超过了 1000，得到大家的认可也坚定了我们把周报继续做下去的决心。

欢迎江湖人称吴彦祖的 [@叶孤城](https://weibo.com/u/1438670852) 加入我们的编辑团队。

这期开始我们在每篇文章的开头会用一个动物表示预计阅读时长：

- 🐎 很快就能读完（1 - 10 mins）
- 🐕 中等（10 - 20 mins）
- 🐢 慢（20+ mins）

## 新闻

### [WWDC 2018 时间确定](https://developer.apple.com/wwdc/)

Apple 宣布 WWDC 2018 将于 6 月 4 日至 8 日在圣何塞举行，现已开放注册(注册截至时间是 3 月 22 日)，届时将以抽签方式确定资格。

另外，Apple 还有 Scholarships 计划为优秀在校学生提供免费门票，这有一篇 WWDC 2017 Scholarships 获得者写的 [WWDC18 奖学金指北](https://apollozhu.github.io/2018/03/16/wwdc18-scholarships-info-cn/)。

## 文章

### 🐎 [iOS Weekly 的作者整理了一份他的 iOS 博客订阅](https://iosdevdirectory.com/)

最近 iOS Weekly 的作者整理了一份他的 iOS 博客订阅，小编全部导入了之后，在列表里看到了最新很活跃的 Swift by Sundell，老牌大佬 Ole Begemann...，感兴趣的同学可以直接下载 OPML 文件然后直接导入到 RSS 阅读器里。

### 🐕 [Solving a Mysterious Heap Corruption Crash](https://topologyeyewear.github.io/engineering-blog/2018/03/07/heap_corruption/)

这是一个悲剧的故事，该作者业务中遇到了一个诡异的内存问题引起的 crash，百般追查，历尽千辛万苦，怀疑过是复杂 AR 业务代码所致，也怀疑过是 C/C++ low level 代码内存控制不当所致。然后开始疯狂的一步步移除业务中所有的三方库，依然 Crash，移除了重业务代码，依然 Crash，最后终于确定是 Xcode 的 bug，提交 bug 后被 Xcode 新版本修复，虽然是一个悲剧的故事，但整个过程从发现 bug 到解决 bug 再到细挖为什么的过程，值得借鉴。

### 🐢🌟 [AppDelegate 瘦身指南](http://kyson.cn/index.php/archives/105/)

什么代码都往 AppDelegate 里放是业内常见的问题。作者整理了 AppDelegate 的代码解耦方式：

- FRDModuleManager：模块管理者统一管理子模块；
- JSDecoupledAppDelegate：自定义 AppDelegate 类，将 App 生命周期拆分成几个不同的代理进行解耦，而不是像原生的 AppDelegate 所有代理都在同一个类里；
- AppDelegate 分类( Category )：这个方案比较常见了，就是按照职能把代码分到不同的 Category 文件中；
- JLRoutes、MGJRouter：也是模块化后模块管理者管理的策略，只是结合了路由系统注册方式和第一种略有不同；
- Objection：利用轻量级的依赖注入框架解决。不过这个方式不太主流，而且并没有真正解决 AppDelegate 设计上的问题。

### 🐕 [Getting Started with Flutter](https://www.raywenderlich.com/188257/getting-started-with-flutter)

这是很标准的一篇 `Getting Started With XX` ，分别从简单介绍，配置环境，helloworld，热重载调试，组件复用，网络请求，Table 界面，图片与网络，使用主题，这几个方面一一带你体验了一把 Flutter，Talk is cheap，代码操练起来，亲自感受一下。

编辑觉得这是又一个巨型轮子，看看学学用用，业务中是否下决心大规模使用需要筒子们做好对比和衡量吧。

### 🐕 [iOS 微信特殊字符保护方案](https://mp.weixin.qq.com/s/3xmpJqn361HGtUloOVsIZg)

相信大家对之前 iOS 设备碰到特殊字符导致崩溃的问题记忆犹新，后来微信团队对特殊字符做了保护。

> 由于无法事先知道字符串里包含特殊字符，所以只能先让它排版/绘制，看看是否出现问题。做法是，在排版/绘制字符串前，先设置标记位，排版/绘制结束后，移除标记位；一旦发现标记位存在，就意味着这字符串可能有问题，下次就不显示这个字符串。

### 🐎 [机器学习与移动端会碰出怎样的火花？](https://www.zhihu.com/question/65957269)

自从 [CoreML](https://developer.apple.com/documentation/coreml) 随着 iOS11 发布之后，机器学习在移动端的应用就越来越被重视。知乎上也对其进行了热议，其中 『[网友微调](https://www.zhihu.com/people/breaknever/activities)』围绕着『**移动设备适合做机器学习的原因**』、『**移动端机器学习的具体应用**』和 『**机器学习在移动端的特点**』三方面和大家分享了自己的看法，很有见地。

### 🐕 [给 NSBundle 添加一个 current 方法](http://bou.io/NSBundle.current.html)

[NSBundle](https://developer.apple.com/documentation/foundation/bundle) 是我们开发中的常见类，但苹果并没有提供直接通过 `[NSBundle current]` 方便地获得当前的 bundle 的 API。于是该文作者与其朋友开了个脑洞，通过 `backtrace()` 来获取调用者的函数指针，进而再使用 `dladdr()` 来得到该函数所在的库路径，最后通过这个路径去 `allBundles` 和 `allFrameworks` 中匹配，来实现了 `[NSBundle current]` 方法。

### 🐕 [不同角度看问题 - 从 Codable 到 Swift 元编程](https://onevcat.com/2018/03/swift-meta/)

喵神新文，围绕“将一个类型转换为字典”这个问题，向读者介绍了三种解决思路和实现细节：Codable、Mirror 以及代码生成。而更为重要的点在于喵神想传递的思想：如何利用“元编程”的思维来解决项目中碰到的重复体力劳动问题。（PS：喵神最近开通了[小专栏](https://xiaozhuanlan.com/onevcat)，非常值得关注！）

### 🐎 [快速用上 Swift 静态库](https://blog.dianqk.org/2018/03/08/use-static-framework/)

文章记录了作者在 Swift 静态库上使用的一些实践。作者使用了一个比较 trick 的技巧，通过在 Podfile 中添加自定义脚本的方式，快速为每个第三方库添加 static_framework 支持。不过因为是实践类型的，如果要引入到自己的项目中，可能还会有一些坑需要自己处理。

### 🐢 [Using Swift Server API 0.1.0](http://www.alwaysrightinstitute.com/microexpress-nio/)

这是一个 Swift Http API 的使用介绍，总共有三篇文章，对于 Swift 服务端开发感兴趣的朋友可以看一看：

1. **[Raw API](http://www.alwaysrightinstitute.com/http-010/)**：Swift Http 原始 API 的使用介绍
2. **[µExpress](http://www.alwaysrightinstitute.com/microexpress/)**：用了 350 行代码，在原始 API 的基础上构建了一个类似于 Express.js 的网络框架
3. **[Swift Nio](http://www.alwaysrightinstitute.com/microexpress-nio/)**：使用最新的 Swift-Nio 处理网络请求

### 🐎 🚧 [Best iOS Development Tips and Tricks](https://medium.com/developerinsider/best-ios-development-tips-and-tricks-6c42c1d208c1)

本文介绍了 Xcode 使用中的一些实用技巧，五分钟的阅读即可让我们掌握一些大幅提升工作效率的 Xcode 配置方法，值得一看（文中视频源为 YouTube，请注意科学上网）。

### 🐕 [苹果 ResearchKit 中的图表控件](http://researchkit.org/docs/docs/ChartsAndGraphs/ChartsAndGraphs.html)

ResearchKit中提供了五种默认的图表UI控件，包含常见的饼图（pie chart）， 单线图（line chart），多线图（multi lines graph）， 和散点图（discreate graph）， 多散点图（mutl discrate graph）。使用方法也很简单，和 tableView 很相似，只需要设置好每种图表的 DataSource 即可。但是，关于饼图线框图之类的的第三方框架实在太多。我对这些控件的使用频次存疑。

## 设计

### 🐢 [Great UI Animations tips](https://uxdesign.cc/good-to-great-ui-animation-tips-7850805c12e5)

主要分析了几种常见 Transition animation 的设计方法。可以了解很多 Transition 的设计思路和意图。比如不同 state 需要展示同一种内容的情况下应该如何设计转场等。配合大量 gif 的解释说明，非常值得一看。


### 🐕 🚧 [Designing a better notification experience for iOS](https://uxdesign.cc/designing-a-better-notification-experience-for-ios-def1df8e89e8)

从设计角度分析 Apple 应该如何优化 iOS 目前的通知系统，通过“分组”和“暂时静音”两种方式来过滤噪音，让用户快速、轻松地理解信息。


## 工具

### [Sophie](https://marcosantadev.com/portfolio/macos-app-sophie/)

Sophie 是一款 Carthage 图形化界面管理工具，目前功能还比较简陋，但是基本的管理功能都已经有了。对于图形界面爱好者是一款非常不错的工具软件。

## 代码

### [Open-Source iOS Apps](https://github.com/dkhamsing/open-source-ios-apps)

开源的 `iOS`、`watchOS` 和 `tvOS` App 列表，目前收集了超过 700 个项目，GitHub Stars 超过 16000 次，值得参考。

### [ZIKCellularAuthorization](https://github.com/Zuikyo/ZIKCellularAuthorization)

iOS 10 上国行设备首次安装 App 在获取网络权限时会有不弹授权 Alert 的 bug，这一系统 bug 让众多开发者无可奈何。这个开源作者通过一系列的排查调研，最后使用私有 API 来解决了这一难题，整个解决方案和思路都很值得学习。

另外由于目前 iOS 11 的覆盖率已经接近 70%，且该问题仅在 iOS 10-10.3.1 中出现，编辑建议要慎重考虑是否将该方案运用到线上应用。

## 本期编辑

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

## 说明

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

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


