# 老司机 iOS 周报 #121 | 2020-07-27

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/ios-weekly.png?raw=true)
老司机技术周报，只为你呈现有价值的信息。

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

## WWDC20

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

- [SwiftUI 的可视化编辑工具](https://mp.weixin.qq.com/s/cRCdRtdVVCbHLbZNzuLB_w)
- [打造更容易 Preview 的 SwiftUI 应用](https://mp.weixin.qq.com/s/lHMMvvVKbLxZ_tisQIVLsQ)
- [SwiftUI 中的 App 要领](https://mp.weixin.qq.com/s/Pog25zL_essR47p57FBElw)
- [为小组件构建 SwiftUI 视图](https://mp.weixin.qq.com/s/MC14yFDO2Y2tKje9gM1ibg)
- [如何用 SwiftUI 写一个独立的 App？](https://mp.weixin.qq.com/s/eFqci9voCoMjlZ5B2PfAHQ)
- [十年过去了，Swift 发展的怎么样了？](https://mp.weixin.qq.com/s/ABGp6l3WVBn4QjjDg0qIOA)

## 文章

### 🐕 🌟 [Apple Widget：下一个顶级流量入口？](https://mp.weixin.qq.com/s/ujZfU1CEQ1EfqoO8UR_kSg)

[@EyreFree](https://github.com/EyreFree)：Widget 是 Apple 在 WWDC20 推出的新的桌面内容展现形式。Widget 的出现，让 iOS 系统的桌面有了破局，更多产品能够有机会借助 Widget 来丰富自己产品的内容表达。本文对 Widget 的特点、刷新方式、Widget 和 SwiftUI 的关系、Widget 的展示形式等进行了全面的介绍，并进行了总结与展望，对 Apple Widget 感兴趣的同学千万不要错过！

### 🐕 🌟 [有赞移动热修复平台建设](https://mp.weixin.qq.com/s/u4l4DXoijR4ZkGlqL3DRcA)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：本文主要介绍了有赞的热修复平台，及在搭建过程中遇到的一些问题。以 Android 端为例，目前有赞的热修是基于 Tinker 自建的后端服务 + Android SDK 实现的。有赞热修复平台，是结合有赞移动团队实际开发过程遇到的问题，逐步解决逐渐完善的，读者可以结合自身团队打造合适的热修复管理平台。

### 🐕 🌟 [猿辅导 iOS 精准测试实践 - Objective-C 与 Swift 混编工程精准测试探索](https://mp.weixin.qq.com/s/14hmLWNXAh1FKZT5NI5QsQ)

[@Damien](https://github.com/ZengyiMa)：文章从质量保障问题出发抛出「精准测试」的概念，进一步深入到如何在 iOS 移动端使用 LLVM Code Coverage 方案来实现覆盖率的检测，以及深入挖掘了 LLVM Code Coverage 覆盖率的实现原理。最后作者分享了猿辅导在落地精准测试体系的探索和实践经验，为业界的覆盖率检测方案提供了新思路。

### 🐎 [WWDC20 Summary](https://kean.blog/post/wwdc20-summary)

[@张嘉夫](https://github.com/josephchang10)：[WWDC20](https://developer.apple.com/wwdc20/) 结束后，世界各地的团队正在积极地适配 Apple 平台里最新、最棒的技术。设计和产品团队通常专注于产品，不一定会密切关注来自平台的最新技术。而另一方面，开发者的主要关注点则是各个技术 session。因此，很多情况下没有人会直接对平台的演进负责，这也导致来自平台的新技术可能需要花上几个月、几年才能适配。不论是开发者还是设计师，只有少数的 geek 才会关注平台的每一项更新，因此作者制作了一份[总结 WWDC20](https://kean.blog/assets/wwdc20-summary.key.zip) 的 Keynote 幻灯片（只涵盖 iPhone 和 iPad），以便让您的产品和设计团队获悉来自平台的所有技术更新。

### 🐕 [What should you know about a navigation history stack in iOS 14](https://sarunw.com/posts/what-should-you-know-about-navigation-history-stack-in-ios14/)

[@老峰](https://github.com/gesantung)：iOS 14 导航栏新特性，返回上一级页面时，长按返回按钮，会出现选择返回到第几级页面菜单，更加人性化。本文主要介绍了适配这个 feature 时处理长标题，自定义标题，无标题等场景时需要注意的问题，适配 iOS 14 的同学可以了解一下。

### 🐎  [我们重新设计了 pub.dev，不来试试？](https://mp.weixin.qq.com/s/NodeZQs4Krkmcz_bOfjOAQ)

[@极速男孩](https://github.com/ztlyyznf001)：pub.dev 对 flutter 开发者来说是重要的查找包的工具。google 最近对他进行了更新，是我们更方便的找到优质的 package 。进一步优化了 pub.dev 的评分体系，从而更能通过评分判断一个 package 的质量。并对多平台通过筛选和标签做了进一步的区分，方便我们快速的找到正确的平台支持。

### 🐎 [WasmPatch 开源，又一个 iOS 热修复框架](https://mp.weixin.qq.com/s/4W2NNfvsgsaUQg0Q7SsSZg)

[@五子棋](https://satanwoo.github.io): 作者基于 libffi + WebAssembly 实现了一套 iOS 热修复的框架，整体思路比较清晰，对于想要了解 Objective-C Runtime 的同学来说是一个不错的系列文章。

### 🐕 [Swift Code Injection using dyld_dynamic_interpose](http://johnholdsworth.com/dyld_dynamic_interpose.html)

[@四娘](https://kemchenj.github.com)：Injection 是一个代码注入工具，可以在不重启 App 的情况下让代码修改生效（也就是俗称的热刷新），在最早的 Objective-C 版本里，这件事情很简单，只要在加载完 dylib 之后调用 Runtime API 进行替换即可。

问题在于 Swift，最早 Swift 1.0 发布之后，作者只能使用修改 vtable 的方式去修改 non-final 的函数，但 struct 和 enum 的声明和函数派发一直是个问题。

在最近发布的 InjectionIII 里这个问题终于得到了解决，作者在 Twitter 的讨论里发现了一个 dyld 的私有 API `dyld_dynamic_interpose`，这个 API 可以在加载 dylib 时便捷地替换掉函数实现，在此基础上作者还添加了 SwiftUI 的支持，感兴趣的同学可以看一下。

### 🚧 🐎 [Streamoji - Custom Emoji Library for iOS UITextView](https://dev.to/cardoso/introducing-streamoji-custom-emoji-library-for-ios-4g65)

[@xiaofei86](https://weibo.com/xuyafei86): 自定义表情符号是一种有趣的方式，可以给你的 App 带来更多的活力和可定制性。它们在一些最流行的 App 中都有使用，比如 Slack、Discord 和 Twitch。然而，iOS SDK 并没有为自定义 Emojis 提供直接的支持。现在，使用新的开源库 [Streamoji](https://github.com/GetStream/Streamoji) 只需几行代码就可以将它们添加到自己的 App 中。

你可以通过 gif、png、unicode 来定义表情，用 UITextView 来渲染他们，还可以控制显示质量并与文本大小自动匹配。如果感兴趣，通过 [Slackmojis](https://slackmojis.com) 找到更多有趣的表情并应用到你的 App 中吧。

### 🐕 [Handling deeplinks in iOS 14 with onOpenURL](https://www.donnywals.com/handling-deeplinks-in-ios-14-with-onopenurl/)

[@JonyFang](https://github.com/JonyFang)：Xcode 12 beta 3 最新消息，SwiftUI 在 iOS 14 中为 deeplink 的处理新增了 onOpenURL 方法。开发者可以在视图上注册一个 URL 处理，以便这些视图可以根据需要来响应 URLs。这让 deeplink 的处理变得更加灵活，对项目解耦也有很大的帮助，与过去在 AppDelegate 和 SceneDelegate 中处理 URL 的方式有了很大的不同。

## 代码

### [Exposure Notification](https://developer.apple.com/exposure-notification/)

[@老驴](https://www.weibo.com/6090610445)：Apple 和 Google 合作的新冠病毒接触历史 API 已经上线有一段时间了，Apple 和 Google 也给这个 Framework 制作了文档。有兴趣的话可以来看看 Apple 和 Google 是怎么实现这个 API 的。

强烈建议搭配 nshipster 的 [Contact Tracing](https://nshipster.com/contact-tracing/) 来看，这篇文章我们在之前也做过推荐。

### [OCRunner](https://github.com/SilverFruity/OCRunner)

[@Parsifal](https://github.com/ParsifalC)：以 [JSPatch](https://github.com/bang590/JSPatch) 为代表的基于 JSCore 系列热修复方案接连被苹果审查后，社区近几年也涌现了不少其他的实现思路。在开源社区这块，比较多的是利用自定义轻量级 OC 解释器配合 `libffi` 来实现，比如 [OCEval](https://github.com/lilidan/OCEval)，以及这个 [OCRunner](https://github.com/SilverFruity/OCRunner)。

> 本开源代码由 [SilverFruity](https://github.com/SilverFruity) 自荐。

## 内推

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