# 老司机 iOS 周报 #125 | 2020-08-24

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

## WWDC20

本周在周报公众号上我们推送了 4 篇 WWDC20 内参专栏内的文章，每篇都很精彩！

- [《Widgets 边看边写》第一部分：冒险开始了](https://mp.weixin.qq.com/s/hUcGDtdMzzgGOVHj7urTvA)
- [《Widgets 边看边写》第二部分：Timelines 的基本使用](https://mp.weixin.qq.com/s/atlYIXjcU54kfcfAST7ttA)
- [《Widgets 边看边写》第三部分：Timelines的进阶使用](https://mp.weixin.qq.com/s/iKrvJKWAUP5mH4jCR9BN9Q)
- [WidgetKit 入门指北](https://mp.weixin.qq.com/s/U56NbQbHCfFDFbk_DD2W-A)

## 新闻

### [XCSSET Mac Malware: Infects Xcode Projects, Performs UXSS Attack on Safari, Other Browsers, Leverages Zero-day Exploits](https://blog.trendmicro.com/trendlabs-security-intelligence/xcsset-mac-malware-infects-xcode-projects-performs-uxss-attack-on-safari-other-browsers-leverages-zero-day-exploits/)

[@张嘉夫](https://github.com/josephchang10)：近期发现了一种非常规的、通过 Xcode 开发者项目进行传播的病毒。恶意代码会在建立本地 Xcode 项目时注入并运行，可以利用 [Data Vaults](https://support.apple.com/en-ph/guide/security/sece3bee0835/web) 的行为漏洞来窃取 cookie，还可以滥用开发者版本的 Safari。有一些在 GitHub 上分享项目的开发者受到了该病毒的影响，导致了因依赖而产生的链式攻击，因此威胁不断升级。VirusTotal 等来源也证实了该威胁的存在。这篇博客总结了对该病毒的发现，[附带的技术细节](https://documents.trendmicro.com/assets/pdf/XCSSET_Technical_Brief.pdf)包含了攻击的全部细节。

### [联合验证什么鬼，苹果又出幺蛾子了！](https://juejin.im/post/6863054279583678471)

[@Parsifal](https://github.com/ParsifalC)：周四下午（8月20日）有登录 App Store Connect 的朋友都会发现一条莫名其妙的通知 - “您的帐户即将需要迁移为联合验证。您可以立即开始流程，或等待帐户于2020年8月28日自动迁移。”，这个无厘头的通知一度让大家一脸懵逼，本文通过一些线索结合网上的讨论，得出这是一起乌龙事件。有兴趣吃瓜的不妨看看。

## 文章

### 🌟 🐕 [整体把握 CocoaPods 核心组件](https://mp.weixin.qq.com/s/eyjrhPgPFdidPWO7t2SDcA)

[@JonyFang](https://github.com/JonyFang)：Cocoapods 作为包管理工具，随着 Apple 生态的发展不断地迭代和进化，各部分核心功能也都演化出了相对独立的组件。这些功能独立的组件，均被拆分为一个个独立的 Gem 包，而 CocoaPods 则是这些组件的集合。本文主要介绍了CocoaPods 的主要构成，及各个组件在整个 Pods 工作流的关系。

可以带着这几个问题来看这篇文章：

- CocoaPods 的核心模块包含哪些？
- pod 命令是如何找到并启动 CocoaPods 程序的？
- pod install 的流程是怎样的？
- resolve_dependencies 阶段中的 pre_download 是为了解决什么问题？
- validate_targets 都做了哪些校验工作？

在我们知道了 CocoaPods install 的大致过程后，我们可以对其做一些修改和控制。例如知道了插件的 pre_install 和 post_install 的具体时机，我们就可以在 Podfile 中执行对应的 Ruby 脚本，达到我们的预期。同时了解 install 过程也有助于我们进行每个阶段的性能分析，以优化和提高 install 的效率。

### 🐎 [Mattt 谈 WWDC 2020 - NSHipster](https://nshipster.com/wwdc-2020/)

[@zvving](https://github.com/zvving)：WWDC 2020 落下帷幕，虽少了现场 Bash 的啤酒 🍺 和苹果高管们的舞蹈 🕺，制作精良、节奏适中的视频和崭新的直播方式依旧足够精彩。独特又精彩，就像 2020 年本身。

WWDC 2020 已落下帷幕，也许我们该像 [Mattt](https://nshipster.com/authors/mattt/) 建议的那样：走出『现实引力场』，好好睡觉、健康饮食、定期运动，照顾好自己和身边的人；在此基础上，合理地选用技术，好好工作。

### 🐕 [详解 Dart 中如何通过注解生成代码](https://mp.weixin.qq.com/s/ZA62prbsM6KwnHkBT4i7yQ)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 本文初步探索了在 Dart 通过注解生成代码的技术，比起 java 的 apt ，没有运行时反射用起来还是有点点麻烦，需要手动执行 build，而且各种繁琐的 builder 配置，但这种技术可以给我们在解决一些例如路由，模板代码、动态代理等，多了一种处理手段

### 🐕 [iOS 的自动构建流程](https://juejin.im/post/6860260103791050760)

[@AidenRao](https://weibo.com/AidenRao)：一个对效率有追求的公司，都应该有一套自动构建系统。

- 效率上，解放出开发人员的时间。也更方便其他同事使用。
- 保证打包的标准，避免配置或环境问题，带来的失败。把事情做对，比做快更重要。
- 权限安全上，通过构建系统集中管理，对于使用者来说是一个黑盒。
- 项目流程上，便于有需求时做 Daily Build 或者 自动测试。

文章的这套 iOS 构建流程，经历作者 2 年的使用，基本稳定下来。介绍详细，除了可以作为搭建参考，也可以用于原理学习。

### 🐢 [探索 Flutter 中线程模型/消息循环的底层逻辑](https://mp.weixin.qq.com/s/yhni2q5XfxJ6qmfcJnSlBg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 多线程模型以及线程中的事件循环机制在 OS 里都是必不可少的一部分，也扮演着非常重要的角色，主要用来做异步任务的分发与调度。本文详细讲解了 Flutter 中的线程模型与事件循环是如何实现。

- 每个 Thread 对应相应的 TaskRunner，并且通过 Thread Local机制存储对应的 MessageLoop
- 每个 TaskRunner 对应相应的 MessageLoop
- 每个 MessageLoop 中有对应的 TaskQueue，TaskQueue 使用 priority_queue 实现
- 每个 TaskQueue 通过 TaskQueueId 被存储在全局的 TaskQueues Map 中

### 🐕 [Force-Unwrapping in Swift is NOT a Bad Thing](https://wolfmcnally.com/82/force-unwrapping-swift-not-bad-thing/)

[@Damien](https://github.com/ZengyiMa): 当你在 Swift 中使用强制解包功能的时候一定是倍加小心，因为如果可选变量为 nil 将会发生运行时崩溃，为了避免崩溃而会导致过度防御性编程，这会使你的代码增加复杂度和可维护性。我们应该在代码模块功能的设计角度上去拥抱强制解包这个 Swift 提供的功能，同时尽可能消除未定义行为的影响也是 Swift 语言的设计目标之一。在本文中，作者将会通过直观的例子来展示使用强制解包的最佳实践。

### 🐎 [京东商城订单模块 Swift 探索](https://mp.weixin.qq.com/s/iF5Jg17gQGSX_ngi0r4l-A)

[@looping](https://github.com/looping)：本文在介绍他们用 Swift 改造京东订单模块以及在改造中遇到的问题之前，对 ABI 稳定后的 Swift 变化进行了细致的分析，同时也罗列了后续技术演进的规划。可以作为在现有工程引入 Swift 的参考学习资料。

### 🐕 [App Attest: (Properly!) Protecting iOS apps from Jailbreak Tweaks in iOS 14](https://swiftrocks.com/app-attest-apple-protect-ios-jailbreak)

[@anotheren](https://github.com/anotheren)：在 iOS 14 中 Apple 引入了 App Attest 以保护你的应用不受越狱的侵害。本文详细介绍了具体实施的流程以及作者的一些心得。

### 🐢 [Hacking iOS Simulator with simctl and dynamic libraries](https://curvedlayer.com/2020/08/09/ios-simulator-plugin-simctl.html)

[@老峰](https://github.com/gesantung)：本文介绍了通过使用 Xcode simctl 命令、dynamic iOS libraries 等 Hook 模拟器任意 App，全文包含以下方面：
- 介绍 simctl 概念，以及如何使用 simctl 命令
- 介绍 Runtime Method swizzling
- 介绍如何构建 dynamic iOS libraries
- 介绍如何给模拟器注入自定义动态库

## 工具

###  🐕 [OSLog and Unified logging as recommended by Apple](https://www.avanderlee.com/debugging/oslog-unified-logging/)
 
[@水水](https://www.xuyanlan.com): OSLog 作为 print 和 NSLog 的替代品是苹果推荐的日志记录方式。它虽有点难写，但它有自己的优点:
- 通过编写一个小的扩展名，可以很容易地替换打印语句。将控制台应用程序与日志结合使用可以帮助您以更有效的方式调试问题。
- OSLog 的性能开销很低，并且在设备上会进行存档。
- 可通过 Type 设置日志等级
- 通过 Console.app 查看和检索日志
如果想要编写高性能的日志模块，推荐使用 OSLog，更多详细的使用方法可以阅读本文或者查看苹果文档哦~

## 代码

### [Flutter -如何创建炫酷粒子时钟效果！](https://juejin.im/post/6862158050237612039)

[@邦Ben](https://weibo.com/linwenbang)：本文为翻译稿。作者在 Google 2019 年的 `The Flutter Clock Challenge` 活动中，通过粒子动画效果的时钟获奖，该文讲述了原理。感兴趣的同学可以看看，可以说，动效优秀的作品真让人痴迷！

参考链接：

- [原文](https://ultimatemachine.se/articles/how-i-created-a-particle-clock-and-won-the-flutterclock-challenge/)
- [Github Repo](https://github.com/miickel/flutter_particle_clock)

同时，里面提及的一个 [The Flutter Vignettes](https://flutter.gskinner.com/) 网站也值得留意一下，里面提供了不少优秀的 Flutter 例子。

## 内推

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

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

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

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

## 关注我们

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

![](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）
