# 老司机 iOS 周报 #285 | 2024-04-15

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

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

## 新闻

### [iOS 17.4/17.4.1 新安装的用户首次启动 IDFA 权限获取失败，以及 workaround](https://forums.developer.apple.com/forums/thread/746432?answerId=784610022#784610022)

首次新安装 APP 的用户会在通过 ``ATTrackingManager.requestTrackingAuthorization()`` 申请 IDFA 的时候自动失败（即使用户还没有手动点击拒绝），这会对依赖 IDFA 归因或者正在投放的 APP 造成一定影响，论坛也已经有同学给出 workaround（通过 IDFA 弹窗在关闭时会触发 ``UIApplication.didBecomeActiveNotification`` 进行再次判断）。

## 文章

### 🌟 🐕 [五年沉淀，微信全平台终端数据库 WCDB 迎来重大升级！](https://mp.weixin.qq.com/s/RWCqLD0M_WGCrCcz0oQIcQ)

[@JonyFang](https://github.com/JonyFang)：在接口层面，新版 WCDB 全面支持了 C++、Java、Kotlin、Swift 和 ObjC 这五种主要的终端开发语言，覆盖了 Android、iOS、Windows 、macOS 和 Linux 这五大终端平台。同时，还对 Winq 进行了重写和强化，使开发者能够在各种语言中使用原生语法编写任意 SQL。

在功能层面，新版 WCDB 推出了全新的数据备份和修复方案，大幅提升了数据修复率，同时将数据备份的性能消耗降至可忽略不计。此外，还重点推出了数据迁移和数据压缩这两个新功能，让开发者仅通过简单的配置，就能高效处理复杂业务中的数据过度聚集和数据过度膨胀这两大难题。新版 WCDB 还推出了 FTS5 优化和可中断事务等新特性，使开发者在特定场景下可以实现更极致的性能优化。

### 🐕 [How to avoid using AnyView in SwiftUI](https://tanaschita.com/swiftui-how-to-avoid-using-anyview/)

[@AidenRao](https://weibo.com/AidenRao)：这篇文章讨论了在 SwiftUI 中避免使用 AnyView 的方法。AnyView 是一种类型擦除视图，用于包装其他 SwiftUI 视图，但它会降低 SwiftUI 的性能。文章提出了三种替代方案：
1. 使用 @ViewBuilder 属性：通过在属性或函数上添加 @ViewBuilder 属性，可以将多个视图组合成单个返回类型，而无需使用 AnyView。
2. 使用 Group 类型：Group 类型允许将多个视图组合成一个视图，而不会影响布局。使用 Group 可以避免使用 AnyView，并可以根据需要组合不同类型的视图。
3. 使用泛型：当需要存储不确定类型的视图时，可以使用泛型来代替 AnyView。通过使用泛型参数，可以灵活地存储和使用视图，而无需使用 AnyView。

### 🐕 [In Search of a Smooth Scroll](https://byla.lt/posts/in-search-of-smooth-scroll/)

[@水水](https://www.xuyanlan.com/categories/iOS/)：本文记录了作者由于对更平滑滚动的追求而将 LazyVGrid 替换为 NSTableView 的过程，可以见到结果是 NSTableView 确实会有更丝滑的效果，不过作者并不是希望大家认为 SwiftUI 很慢而 AppKit 很快，或者 macOS 上的 SwiftUI 还没有为重要的应用程序做好准备，事实上作者重写过程中 SwiftUI 已经解决了部分问题。最后作者聊了对 AppKit 的非官方见解和反思，也希望大家对两种技术都有着同样的热爱。

### 🐎 [Exploring ABI stability, @frozen, and library evolution mode](https://digitalbunker.dev/understanding-frozen-in-swift/)

[@DylanYang](https://github.com/Dylan19Yang)：本文作者通过 `@frozen` 关键字，引申出 Swift 的 ABI 稳定和 library evolution mode。其中 `@frozen` 关键字确保了 `enums` 和 `structs` 的接口不再改变，因此也保证了内存布局的固定，带来了更好的性能。ABI 稳定则使得面得不同的语言版本，swift 库不再需要每次重新编译就可以兼容高版本。而 library evolution mode 是一个编译器能力，开启它后使得编译器会产出额外的用于描述关于库的数据结构、方法等的元数据，确保在不同的语言版本下，这些数据依然保持一致。这三者共同确保了 Swift 库在不同语言版本、不同操作系统版本下的兼容性，并最终带来了更好的的开发体验。

## 工具

### 🐕 [Mac OS X Debugging Magic](https://web.archive.org/web/20101206131250/http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html)

[@Cooper Chen](https://github.com/cjlcooper)：在 MacOS 开发中，Apple 提供了许多调试工具，以协助开发者针对特定场景进行开发和调试。这些工具中的许多被保留在发布的系统中，供开发者使用以调试其代码。下面列举了一些在 Mac OS X 中的“秘密”调试工具，包括环境变量、首选项、可从 GDB 调用的例程以及特殊文件等。若你正致力于 Mac OS X 软件开发，这个调试工具集合列表将极具帮助。


## 代码

### 🐕 COW Macro Package

[@Kyle-Ye](https://github.com/Kyle-Ye)：Swift 的大量标准库内的 struct 出于性能等因素考虑都进行了 Copy On Write（后简称 COW）优化（如 String、Array、Set、Dictionary），但是对于业务自定义的 struct 默认没有此类优化。

因此如果业务定义了一个巨大的 struct，在此 struct 作为参数传递过程中，容易产生较大的包大小并且有一定性能影响。

对于每个希望开启 COW 的 struct 进行手写优化较为繁琐，下面是本期推荐的两个相关 COW Macro 的开源库，可以帮助我们快速 opt-in 此项优化。

- https://github.com/wezzard/COWMacro
- https://github.com/Swift-CowBox/Swift-CowBox

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2023」，领取 2023 及往年内参**

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