# 老司机 iOS 周报 #41 | 2018-10-29

![ios-weekly](../assets/ios-weekly.png)
老司机 iOS 周报，只为你呈现有价值的信息。

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

## 小专栏

### [[译] Swift 标准库源码阅读指南](https://xiaozhuanlan.com/topic/8732549601)

对于 Swift 开发者来说，Swift 标准库的开源可以说是很值得高兴的事情，因为我们可以在标准库中学到很多优秀的设计以及了解具体的实现逻辑。当然，很多人可能和我一样，不知道如何在本地搭建一个可编译的 Swift 标准库。这篇文章就提供了一个很通俗易懂的教程，如果你对阅读源码感兴趣，可以借助这篇文章，在自己的电脑搭建一个 Swift 标准库项目，然后在闲暇之余看一看里面的代码。

## 文章

### 🌟 🐕 [iOS 内存管理研究](https://medium.com/@jasonyuh/ios-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E7%A0%94%E7%A9%B6-9bf37fc209c6)

来自周报编辑 Jason Yu 同学的大作。

虽然现在 iOS 设备的内存容量越来越大，很多时候开发者也不再需要去考虑内存占用的问题。但是，当产品越来越大，功能越来越复杂的时候，内存优化依然会成为一个避不开的问题。

本文介绍了 iOS 内存管理的一些基本知识，同时也涵盖了在解决 OOM 问题时候的一些小技巧。若是你对 iOS 的内存优化依然存在一些问题，相信读完文章能让你有更加清晰的了解。

### 🌟 🐢 [iOS 系统中导航栏的转场解决方案与最佳实践](https://mp.weixin.qq.com/s/CQ-uUJuX-nlPrM_tHBdbNQ)

在 App 开发阶段，涉及到导航栏样式改变的需求时，经常会遇到转场效果不佳或者与预期样式不符的“小问题”。本文由美团技术团队出品，详细讲解了 UINavigationBar 的生命周期、导航栏样式转换的时机，同时给出了相关最佳实践，建议仔细阅读。

### 🌟 🐢 [iOS UI Automation Tests at Babylon](http://ilya.puchka.me/ios-ui-automation-tests-at-babylon/)

UI 自动化测试是非常不好做的，如果拿捏不准很容易导致它变成投入产出比低、维护成本高、稳定性差的一个失败项目。所以在使用自动化测试验证产品功能的同时，也要投入人力在解决技术本身的问题上做深入研究。本文就描述了他们在使用自动化测试时遇到的问题，以及如何解决的。可以看出他们在处理测试场景失败率高和测试效能低这些问题上有自己的最佳实践，特别是对网络请求这块问题的处理思路，非常值得借鉴。要想把自动化测试做好或者正打算做自动化测试的团队可以仔细研读参考下。

### 🐎 [【QCon2018】Flutter & Dart三端一体化开发](https://juejin.im/post/5bcd470e6fb9a05d2469f723)

Flutter 可以说是 2018 年移动开发领域最热的技术， 不论是跨平台+独立渲染的工作机制，还是 Google 积极推广的下一代移动 OS：fuchsia 的核心开发框架，都为 Flutter 赚足了眼球。而闲鱼作为国内第一个认真使用 Flutter 的团队， 为 Flutter 社区带来了非常多有价值的内容。本文介绍了闲鱼目前正在践行的“三端一体化开发”概念。什么意思？就是不仅通过Flutter 实现 iOS，Android 端都用Dart 来开发，而且还使用 Dart 来构建微服务的胶水层，由客户端开发同学自己构建需要用到的服务与接口，并且通过一系列工具链的完善提升开发效率。当然，任何听起来过于优雅的方案都免不了会踩坑，不过可以预见的是这套架构在绝大多数场景下能够显著提升整个业务迭代的效率。（麻麻再也不用担心客户端和后台 debug 时互相甩锅了）。

当然，这样“胶水层”要 work 的前提是，有一套很优雅鲁棒稳定的底层服务与接口，能够让胶水层中各种组合与调用，这一点对于目前国内很多野蛮生长的互联网公司来说还是挺难的。


### 🐎 [Flutter瘦身大作战](https://juejin.im/post/5bd2ac975188252928653585?utm_source=gold_browser_extension)

这篇文章依然是闲鱼团队带来的 Flutter 使用经验，从 iOS 的编译产物构成角度，深度探讨了如何对 Flutter 项目进行瘦身优化。从文章中可以看出，除了一些常规的编译指令优化，符号文件移除，资源精简等方面，显示的进行类型转换也会导致包大小的增加，看起来主要是编译系统自动增加的一些异常处理导致的。


### 🐎 [从爬虫攻击者角度谈客户端 API 安全设计](https://mp.weixin.qq.com/s/yv9Ph_8pzej3Wasbsc-fXQ)

本文介绍了基本的 API 被逆向的实例，提醒开发者需要多注意安全防护。
常规的 API 安全，需要做好安全保护，见招拆招，加大逆向难度：

- `Android` 必须混淆加固，防止源码简单被逆（iOS混淆作为可选项）
- 请求使用 `HTTPS`，防止内容被抓包，安全要求高的，可以开启**双向校验**，需要注意证书的**过期**问题，做好**证书更新功能**。证书内容最好以**字符串**的方式写入到程序内，以防止文件容易被解压得到
- 请求携带**签名**，**签名**算法通常使用 `token` + `params` + `盐值` 进行算法计算，算法最好使用 `C/C++` 编写，并且混淆加固，防止被轻易破解进行篡改或者伪造请求
- 对**异常请求**进行限制，如：`ip` 在短时间内大量访问，请求重复提交
- 通过 `Cookie Session/OAuth/JWT` 等方式进行鉴权校验，进行权限管理（可阅读下方链接深入了解）

延展阅读:
- [深入聊聊微服务架构的身份认证问题](http://www.infoq.com/cn/articles/identity-authentication-of-architecture-in-micro-service?spm=a2c4e.11153940.blogcont593230.23.2b0b19e51HRJAx)

### 🐕 [Best strategies for configuring multiple environments in Xcode projects](https://kenb.us/best-strategies-for-configuring-multiple-environments-in-xcode-projects)

在 Xcode 项目中配置不同环境，很多人会选择添加 Target，但这并不是一个很好的方法，太重了，你需要维护多个 Target 及它们的 Info.plist。最好的策略是添加新的 Configurations，然后给其设置该环境下的 xcconfig 配置文件。还能在 Build Settings 里为 Configuration 设置不同的 bundle identifier、产品名称，应用图标，使它们能同时运行在一个手机上，并得到很好的区分。

### 🐕 [将 75000 行原生 iOS 应用程序移植到 Flutter 后，结果太惊讶！](https://www.toutiao.com/i6615151835814560264/?tt_from=dingtalk&utm_campaign=client_share&wxshare_count=2&from=timeline&timestamp=1540228468&app=news_article&utm_source=dingtalk&isappinstalled=0&iid=42369912095&utm_medium=toutiao_ios&dtshare_count=1&group_id=6615151835814560264&pbid=6615388314311558670)

原文：[Porting a 75,000 line native iOS app to Flutter](https://medium.com/flutter-community/porting-a-75-000-line-native-ios-app-to-flutter-57c6571c57b4)

吐槽一下翻译文的标题，浓浓的国内枪文的感觉。但是，讲回来这篇文章本身的质量还是非常不错的。

文章作者是澳大利亚的 Easy Diet Diary App 的作者。他们之前有 iOS 版本，也一直计划出一个 Android 版本，鉴于两个代码库的复杂度一直没有施行。

在进行了 Flutter 重构之后，作者发现代码量相对于之前 Objective-C 和 Swift 混编有了很明显的下降。大部分少掉的代码量来自于 Storyboard 被 Widget 替换，这也是 Flutter 从一开始就在设计上的一个优势。

文章对还没尝试过 Flutter 的开发者来说，是个可以借鉴的参考。

### 🚧 🐕 [Building an iOS App Without Xcode’s Build System](https://medium.com/@vojtastavik/building-an-ios-app-without-xcodes-build-system-d3e5ca86d30d)

本文主要介绍了一个简易 App 的构建流程。

其并非一个纯理论的构建描述，而是将整个过程分解成多个步骤，主要分为编译源文件、编译&拷贝资源文件、拷贝 Info.plist、拷贝 Swift 运行库、签名和安装。文中作者有心地附注了相应脚本以及相关原理，读者可以跟着作者，完整实验作者的每一个步骤，更加深刻地了解到一个 App 整体的构建流程。另外，在文末作者留了几个可继续实验钻研的方向，可供读者继续深入探究。

文章对于未了解过 App 构建流程的开发者来说，是个不错的参考。

### 🐕 [从汇编代码探究 NSClassFromString 实现](https://xiaozhuanlan.com/topic/5781026934)

虽然在 iOS 中，Foundation 库是不开源的，但是可以通过一定的方法，取得其编译后的汇编指令，对于有一定汇编知识的人来说，可以大致推断出某些接口的大体实现细节。本文作者通过开发中遇到的一个问题，刨根问底，对于 `NSClassFromString` 这个方法的具体实现进行了细致的分析。

诚然，iOS 的各种官方闭源框架里，我们不可能一个一个接口去推断其实现。但当遇到具体困扰我们的问题时候，我觉得我们正需要本文作者那样，可以深入研究的精神。通过阅读本文，相比于知道 `NSClassFromString` 的实现细节，了解如何通过汇编来推敲接口的实现细节更加重要一些。

### 🐕 [Swift​Syntax](https://nshipster.com/swiftsyntax/)

[libSyntax](https://github.com/apple/swift/tree/master/lib/Syntax) 是 Swift 项目的工具库，目前被用于 Swift 项目的迁移工作。通过直接操作 AST 的方式，生成结构化的代码。而 [SwiftSyntax](https://github.com/apple/swift-syntax) 则是 libSyntax 的封装，为我们提供了 Swift 类型安全的方式，来操作和生成代码。

Mattt 在文章前半部分主要讲了什么是 AST 以及 Swift​Syntax 如何通过 AST 生成代码，在文章后半部分描述了如何通过 Swift​Syntax 生成 Swift 代码、如何通过 Swift​Syntax 替换 Swift 代码以及如何通过 Swift​Syntax 实现 Swift 代码高亮的功能。

### 🐎 [Dealing with Swift toolchain](https://blog.krzyzanowskim.com/2018/10/11/dealing-with-a-swift-toolchain/)

文章重点介绍了各系统下如何安装 Swift toolchain、不同版本的 Swift 如何共存？以及各执行文件之间的关系，如 `swift-build`, `swift-package` 和 `swift-run`。

### 🐕 [Using PromiseKit](https://agostini.tech/2018/10/08/using-promisekit/)
当你需要连续地执行多个异步过程时，总会无可避免的出现地狱回调。为此，PromiseKit 是一个不错的解决方案。本文从实际的案例出发，为你深入浅出的讲解了如何优雅的使用它，建议阅读。

### 🐎 [通过 internal 隐藏内部属性](https://holko.pl/2018/10/08/internal-modifier/)

这篇文章介绍了作者在封装数据库时遇到的问题——如何处理 public 类型的 internal 属性，让外部调用者可以在无法得知 internal 属性的同时生成这个 public 类型的实例。在暴露必要接口的同时隐藏实现细节，是一件不容易做对的事情，文章很简短，希望大家看完之后可以更好地处理类似的接口设计问题。

### 🐢 [从Xcode10不再支持libstdc++说起](https://juejin.im/post/5bcff7b1f265da0adc1909e7)

Xcode10起，苹果摒弃了对 libstdc++ 库的支持转而支持 libc++ 库。本文对 Xcode 中的 C++ 标准库进行了深入的研究。值得对编译器话题和 C++ 有兴趣的读者阅读。

### 🐕 [Prefetching images size without downloading them [entirely] in Swift](https://medium.com/ios-os-x-development/prefetching-images-size-without-downloading-them-entirely-in-swift-5c2f8a6f82e9)

如果在处理自定义布局时遇到需要远程加载的图片，很容易出现先有鸡还是先有蛋的问题——需要为图片预留出合适的空间，但不下载图片就无法知道它的尺寸。如果一边下载一边调整布局，这些元素就会出现和 web 一样胡蹦乱跳的滑稽效果，直到下载结束才能停下来，从而导致糟糕的 UX/UI 体验，让用户大感失望。在这篇文章里，作者会教你如何在显示图片之前预加载图片的尺寸信息，以便用在 UICollectionView/UITableView 的 pre-fetching 方法中。

## 工具

### [iOSLocalizationEditor](https://github.com/igorkulman/iOSLocalizationEditor)

通常 iPhone 上的一些应用需要支持多国语言，这要确保所有内容都已翻译，任何语言都不能丢失任何字符串，这是一件比较痛苦的事情。而 `iOSLocalizationEditor` 是一款在 macOS 上帮助用户编辑和管理 app localizations 的图形化工具，它会显示每种语言的所有本地化版本，并能方便快捷的找出你缺失的 key 。如果想要试试看的朋友，也可以参考下这篇文章：[Checking for missing translations in iOS projects](https://blog.kulman.sk/checking-for-missing-translations-in-ios/)

## 代码

[MVCTodo](https://github.com/davedelong/MVCTodo)

我们曾在 [17 期周报中推荐过 - A Better MVC](https://github.com/SwiftOldDriver/iOS-Weekly/blob/48427eac5663bacdb00beddf2653ff1c32f4d5d1/Reports/%2317-2018.05.02.md#-a-better-mvc) 的文章和视频，现在时隔半年，作者为这篇文章提供了一个简单的 demo，帮助读者去理解和实践他推荐的 MVC 架构。强烈建议阅读下这个 repo 的 readme，作者很有心地列出了这个 demo 你应该重点看哪些，略过哪些东西。

## 内推

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

- [北京-蚂蚁金服 招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://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)，[@小非86](https://weibo.com/xuyafei86)，[@邦ben](http://weibo.com/linwenbang)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)

## 说明

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

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