# 老司机 iOS 周报 #309 | 2024-10-28

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

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

## 新闻

### [New requirement for app updates in the European Union](https://developer.apple.com/news/?id=yfacfeal)

自 2024 年 10 月 17 日起（已经生效），在欧盟地区上架的 app 需要提供交易商身份信息，之后才能提交 app 。如果一直不提供交易商信息，则 app 会在 2025 年 2 月 17 日被下架。详见：[填写说明](https://developer.apple.com/help/app-store-connect/manage-compliance-information/manage-european-union-digital-services-act-trader-requirements/)。


### [Apple Push Notification service server certificate update](https://developer.apple.com/news/?id=09za8wzy)

这是一则前置通知：Apple 推送通知服务 (APNs) 的证书颁发机构 (CA) 即将改变。APNs 将于 2025 年 1 月 20 日更新沙盒环境的服务器证书，并于 2025 年 2 月 24 日更新生产环境的服务器证书。

大家可以等沙盒环境更新后再进行操作，建议在过渡期间同时保留新旧两份证书。

## 文章

### 🐢 [Elite Hoops Year One: 12 Bite-Sized Lessons](https://www.swiftjectivec.com/elite-hoops-gaining-users-as-an-indie-app-with-paid-ads-and-lessons-learned/)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 本文是一个独立开发者关于应用增长过程的思考，从初始的少量付费用户开始到市场分析思考共 12 条，可谓字字珠玑，对于正处于独立开发中的同学来说有不小的借鉴意义。

### 🐕 [swiftlang/swift-java](https://github.com/swiftlang/swift-java)

[@Barney](https://github.com/BarneyZhaoooo)：这个项目提供了 Swift 和 Java 互操作性的工具和库，允许 Swift 程序直接调用 Java API。还有一个 jextract-swift 工具，用于从 Java 源码中提取用于 Swift 调用的代码。项目处于早期开发阶段，依赖于特定的 Swift 和 JDK 版本。

### 🐕 [直接使用 xcodebuild 比 Xcode 慢的原因分析](https://github.com/wojciech-kulik/xcodebuild.nvim/issues/201#issuecomment-2423828065)

[@Cooper Chen](https://github.com/cjlcooper)：这篇文章主要讨论了 xcodebuild 工具相较于 Xcode 更加耗时的问题，xcodebuild 每次构建时向 Apple 的 API 发出了多个请求，响应时间较长，导致构建变慢，并且 xcodebuild 对每个目标逐个发请求，目标越多则效率差异越明显，作者提供了解决方法包括修改 hosts 文件和使用网络嗅探工具阻止请求。这些方法能显著提高构建速度，同时作者建议用户也提交反馈，以促使 Apple 修复此问题。


### 🐕 [The Memory Leak: An Xcode Detective Story](https://www.emergetools.com/blog/posts/the-memory-leak-an-xcode-detective-story)

[@莲叔](https://github.com/aaaron7)：这篇文章讲述了作者从一个自己 app 遇到的 deeplink 的 bug 一步步的排查到问题的根源的过程。问题的根源虽然并不复杂，但触发点非常隐蔽，至少属于 CR 时很难发现的问题，值得关注。另外，过程中一步步讲述了作者自己排查的过程以及思路，对于刚入门的同学应该也有非常有帮助。


### 🐕 [Beware UserDefaults: a tale of hard to find bugs, and lost data](https://christianselig.com/2024/10/beware-userdefaults/)

[@xiaofei86](https://github.com/xiaofei86)：在 iOS 15 “应用预热” 和 ”敏感数据解锁前不可访问（钥匙串等）“ 2 个系统功能的互相影响下，会出现 `UserDefaults.standard` 实例取到空的偶现问题。一但问题出现，程序可能认为是首次启动，进而用默认数据覆盖 UserDefaults，导致更严重的问题。作者总结了能够大概率复现的场景，并提供解决方案。同时也封装了 [TinyStorage](https://github.com/christianselig/TinyStorage) 用来替代 UserDefaults，感兴趣同学可以阅读原文了解。

### 🐕 [MoveMe - SwiftUI Edition](https://whackylabs.com/swift/swiftui/ios/animation/2024/09/12/moveme-swiftui-edition/)

[@AidenRao](https://weibo.com/AidenRao)：使用 SwiftUI 来处理手势和动画实际上并不像听起来那么直观，这篇文章讲解了如何实现正方形的拖动、缩放以及过渡动画效果，并解决了一些在实现过程中出现的问题。文章还提供了代码示例和 GitHub 链接供参考。

### 🐎 [So how does this whole @preconcurrency thing work?](https://www.massicotte.org/preconcurrency)

[@DylanYang](https://github.com/Dylan19Yang)：@preconcurrency 是一个新增的关键字，帮助开发者屏蔽并发相关的警告。在开发者往严格的并发框架逐渐迁移的流程上，有时会出现无法快速迁移，甚至无法迁移的情况，而 @preconcurrency 能够允许开发者忽略这部分警告，使得开发者能够增量的完成并发框架的迁移。本文介绍了 @preconcurrency 可以在哪些场景下帮助开发者处理这些问题，比如在一个 @MainActor 的类型里实现一个 nonisolated 的 protocol 场景，或是处理三方库中无法迁移到 concurrency 框架的代码等。有遇到类似问题的开发者可以阅读此文了解更多。

## 代码

### [ProtobufKit](https://github.com/OpenSwiftUIProject/ProtobufKit)

[@kemchenj](https://kemchenj.github.io/)：轻量跨平台 ProtoBuf Swift 解决方案，实现了基础的序列化 API，并且提供一套类似 Codable 的方案支持，对比原版 5.7MB 的二进制大小，这个版本只需要 142KB。

## 内推

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

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

## 关注我们

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

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

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