# 老司机 iOS 周报 #111 | 2020-04-27

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

## 新闻

### 🚧 [Apple 正在网页版的 iWork 里尝试使用 ObjC + WebAssembly 实现部分功能](https://mjtsai.com/blog/2020/04/17/iwork-10-in-webassembly/)

[@looping](https://github.com/looping)：苹果开发人员在其 [Twitter](https://twitter.com/lrz/status/1250455566213877760) 上透露，最近上线的网页版 iWork 10.0 里，部分功能是从原生 App 的 C++ / ObjC 代码改为使用 WebAssembly 编译后用到网页上的。虽然目前并没有找到更多资料，但也是可以感觉出苹果在跨平台开发上的一些新的尝试和相关思路。

## 新手推荐

### 🐎 [Flutter 技能篇: debug 看程序启动 | 开发者说·DTalk](https://mp.weixin.qq.com/s/hqCJglkdZi6W6fK1r5tZeg)

[@邦Ben](https://weibo.com/linwenbang)：本文适合刚接触 AndroidStudio 的 flutter 新手来看，详细说明了 debug 调试的一些基础功能，以一个简单的报错例子一路演示，自行跟着操作一遍，也可以顺便了解一下渲染流程。如果你使用 vscode 的话，也可以类比一下，都差不多。

flutter 渲染流程参考文章：
[Flutter渲染机制—UI线程](http://gityuan.com/2019/06/15/flutter_ui_draw/)

## 文章

### 🐎 [如何断点到函数的return](https://mp.weixin.qq.com/s?__biz=MzUxMTkwNDg0OQ==&mid=2247484659&idx=1&sn=775d9f018330360a4aeda18709f5869e&chksm=f96dd9cdce1a50dbf0d755c041d3ecd63c208c4817f69634acafb38e0e1b383cdea12931c943&mpshare=1&scene=1&srcid=&sharer_sharetime=1587606656735&sharer_shareid=ba950e64c9e1fd56aad199c82bacc05d#rd)
在开发断点调试中，假如有这样一个场景：有一个很长的函数，里面有很多个 return ，而我们想快速断点到执行的是哪一个 return ，这时候怎么做比较好呢？单步执行或 return 处挨个断点？这两个方法虽然可以生效，但是却有些麻烦。本文介绍了更方便的方法，通过 LLDB 去快速定位，对我们日常开发而言，是一个很实用的小技巧。

### 🐎 [Testing push notifications on the iOS simulator](https://www.avanderlee.com/workflow/testing-push-notifications-ios-simulator/)

[@张嘉夫](https://github.com/josephchang10)：如果能够在 iOS 模拟器中测试推送通知，会让远程推送功能的开发更加容易，通常需要迭代许多次才能验证实现的功能是否达到预期。在 Xcode 11.4 之前，我们只能用 NWPusher 等第三方应用和真实的设备才能测试 Rich Notifications 等功能，虽然效果也不错，但迭代速度还是不如使用 iOS 模拟器。从 Xcode 11.4 开始，我们只要使用一条新增加的 simctl 命令就能在模拟器中测试推送通知，这篇文章会为你介绍实现的具体细节，包括使用三种不同的方式来触发远程推送通知。


### 🐕 [Optionals in Swift Objective-C Interoperability](https://fabiancanas.com/blog/2020/1/9/swift-undefined-behavior.html)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：本文介绍了在 Objective-C 定义的 nonnull 属性（对象），在做 Swift 桥接后的使用上会产生的问题。作者举了 NSCalendar 和 NSArray 等例子并结合了 ``_unconditionallyBridgeFromObjectiveC`` 的方法的源码进行了讲解。有类似做法的读者可以阅读本文来检验一下自己在使用上是否会出现问题。

### 🐕 [SE-0281: @main: Type-Based Program Entry Points](https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md)

[@四娘](https://kemchenj.github.io)：在 ArgumentParser 发布了之后，大家也想要类似于 @UIApplicationMain 这样的注解去声明入口函数，并且 windows 平台支持多种入口函数类型，此时 main.swift 就无法很好地满足使用。

SE-0281 就是为了解决这些问题而出现的，提案的内容也非常简单，可以使用 @main 注解声明入口函数：

```swift
@main 
struct MyProgram: ApplicationRoot {
    static func main() { ... }
}
```

这个提案已经通过并且完成了实现，预计将会在 Swift 5.3 里发布。

### 🐕 [复杂业务如何保证Flutter的高性能高流畅度？](https://mp.weixin.qq.com/s/iXFa9C68gUHr7PL8NHnZUA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：高性能高流畅度一直是 Flutter 团队宣传的一大亮点, 但是随着业务的复杂度持续上升，那么有一个矛盾的问题出现了：这类页面的性能可能还不如 Native 的表现！这是为什么？是我们的姿势不对？[本文](https://mp.weixin.qq.com/s/iXFa9C68gUHr7PL8NHnZUA)由咸鱼团队，他们也遇到了同样的困惑，并抽丝剥茧，从原理层面带你逐步定位并解决这类问题。

### 🐢 Xcode Build Time Optimization

- [Xcode Build Time Optimization 1](https://www.onswiftwings.com/posts/build-time-optimization-part1)
- [Xcode Build Time Optimization 2](https://www.onswiftwings.com/posts/build-time-optimization-part2)

[@JimQ](https://github.com/waz0820)：本“Xcode 优化构建时间”系列分为上下两篇，上篇讲指标衡量，下篇讲优化措施。

- 指标衡量：
    - 衡量什么
        - 干净构建的时间
        - 增量构建的时间
    - 衡量构建时间
        - Xcode 构建报告
        - Xcode 构建报告摘要
        - 类型检查警告，为耗时超过指定检查时间的任何函数或表达式生成警告
        - 编译器诊断选项，编辑器内置了多种诊断选项，可用于分析构建
        - 测量 Targets 的构建时间，使用 [xcode-build-times](https://github.com/PaulTaykalo/xcode-build-times-rendering) 命令工具来了解要构建或可以并行构建的 Targets
        - 使用 [XCLogParser](https://github.com/spotify/XCLogParser) 汇总指标，它是 Xcode 生成的 xcactivitylog 的日志解析器，可提供有关项目中每个模块和文件的构建时间、警告、错误和单元测试结果的大量见解，且可以 HTML 的形式可视化输出
    - 自动化
- 优化措施：
    - 构建设置优化
    - 源代码改进
        - 查找编译缓慢的代码，可使用工具 [Build Time Analyzer](https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode)
        - 减少重建工作
            - 在单独的文件中定义实体
            - 正确使用访问修饰符
        - 删除未使用的代码
        - 预构建依赖，使用预构建的动态框架和库来提高构建效率
        - 代码 vs Xibs/Storyboards，构建时间的差异并不明显
    - 项目增强
        - 改善运行脚本阶段
        - 采用模块化架构，以并行构建 Targets
        - 第三方构建系统

### 🐕 [Cross-Pollination](https://nshipster.com/cross-pollination/)
[@AidenRao](https://weibo.com/AidenRao)：有很多好想法，从被批评到整合进苹果产品中，如：
- Windows 上的应用程序切换 ⌥ ⇥（macOS 上 ⌘ ⇥）
- Android 的黑暗模式（已在 iOS 13 中添加）
- Java 和其他语言的泛型（Swift 的核心功能， 后来添加到 Objective-C）
- JSX 风格的 dsl 声明性 UI（SwiftUI 中的函数构建器）

但在苹果公司这么做之前，为什么我们认为这些好主意是异端的？如果你将竞争技术的存在，视为善恶斗争，自豪的去宣布”Pure Swift”或“100％ 无 JavaScript”时，如果不是通过一系列的权衡来评估出的解决方案，那只是一种效忠，这种效忠，并不能让你很好的完成所有的工作。

## 工具

### [Debugging superpowers with FLEX](https://alejandromp.com/blog/debugging-superpowers-with-flex/)

[@享耳先森](https://github.com/iblacksun)：FLEX 是 Flipboard 团队出品的 App 调试工具，在开发过程中集成 FLEX 可以监控网络请求、查看 UI 树、查看沙盒文件等，注意：FLEX 不能包含在 Release 环境中，否则审核可能被拒。

### [ResilientDecoding](https://github.com/airbnb/ResilientDecoding)

[@极速男孩](https://github.com/ztlyyznf001)：ResilientDecoding 是一个弹性的解码工具，他可以对可选，数组，字典或者符合本宝所提供的 ResilientRawRepresentable 协议的自定义类型类型进行解码。

### [啄木鸟 iOS 开发工具](https://github.com/alibaba/youku-sdk-tool-woodpecker)

[@红纸](https://github.com/nianran)：啄木鸟 iOS 开发工具是来自于优酷团队的 APP 内 Debug 工具集合，其包含了常见的 UI 检查、JSON 抓包、CPU 占用、Crash 监听等 17 项功能。能够不依赖电脑联调，直接获取运行时数据快速定位 Bug，提升开发效率。与其他开发工具不同，其多了方法监听跟 po 命令，运行期间能调用任意方法。

### [XcodeColorSense2](https://github.com/onmyway133/XcodeColorSense2)

[@水水](https://www.xuyanlan.com)：一个能在 Xcode 中直接预览16进制颜色值效果的 Xcode 插件。无需找其他方式查验颜色是否正确啦！安装和使用方式都很简单，有需要的读者可以试试哦~

### [X-SwiftFormat](https://github.com/ruiaureliano/X-SwiftFormat)

[@EyreFree](https://github.com/EyreFree)：Swift 代码格式化工具，可集成到到 Xcode 中使用，满足大部分常见的代码格式化需求，可通过 GUI 配置中心管理格式化规则，当然也可以直接编辑 `.swift-format`。可通过配置快捷键快速启用，很方便，值得一试。

### [Flr：一个出色的Flutter资源管理工具](https://juejin.im/post/5e514a76518825494f7df5f5)

[@老驴](https://www.weibo.com/6090610445)：Flr，读作 Flutter-R，是一个由网易严选智造团队研发的，用于管理 Flutter 资源的开发工具。Flr 可以帮助 Flutter 开发者在修改项目资源后，自动为资源添加声明到 pubspec.yaml 以及生成 r.g.dart 文件。Flr 还提供了三种不同的工具来满足各种需求，包括了 Android studio plugin, CLI 和 VSCode extension。有兴趣的同学可以看看，鉴于最近 Flutter 大火，即便不用学习一下源码也是不错的。

> 推荐人：[YorkFish](https://github.com/YK-Unit)

## 代码

### 🐕 [Lasso - iOS architectural pattern and framework](https://github.com/ww-tech/lasso)
[@zvving](https://github.com/zvving)：遵循 redux 思想的 iOS 架构实现。用 Screen 实现最小 redux 模块，通过 Flow 组合配置 Screens。整体实现简洁清晰，代码质量很高，是不错的架构学习资源，应用于实际项目可能过于理想化。

## 内推

### 杭州 - 阿里巴巴淘系技术基础平台：高级无线工程师（P6）/ 无线专家 (P7)

- iOS架构、底层方向
- iPad、新特性方向
- 业务开发和架构方向（iOS/Adnroid）

感兴趣的欢迎加微信了解具体要求。VX: damonwong2。也可以直接发送简历到 coderonevv@gmail.com

### 老司机推荐

老司机周报团队联合知识小集和 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）
