# 老司机 iOS 周报 #246 | 2023-05-29

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

## 新闻

### [来 WWDC23 之夜深圳场，看直播！领 Apple 周边！](https://www.huodongxing.com/go/wwdc23sz)

今年的 WWDC 有线下观影活动哟！6 月 5 日晚，由 T 沙龙主办的「WWDC 之夜（深圳场）」将在货拉拉深圳研发中心举行，在深圳（或附近）的朋友可以线下参加一起熬夜！点击周报下方外链可以直接报名。活动现场还邀请到了两位货拉拉的嘉宾进行精彩分享，分别是：

- 涂育旺：内存问题步步查
- 刘占峰：Swift 并发探索之旅

## 新手推荐

### 🐕 [Handling WebP Images When Using PHPickerViewController](https://swiftsenpai.com/development/webp-phpickerviewcontroller/)

[@极速男孩](https://github.com/ztlyyznf001)：在 iOS14 中苹果推出了 PHPickerViewController 来取代 UIImagePickerController，本身 PHPickerViewController 是不支持 WebP 格式的图片的。这篇文章介绍了如何通过给 NSItemProvider 添加扩展的方式来给 PHPickerViewController 增加 WebP 格式图片的支持。

## 文章

### 🐎 [SwiftUI under the Hood: Variadic Views](https://movingparts.io/variadic-views-in-swiftui)

[@Smallfly](https://github.com/iostalks)：这篇文章主要讲了在 SwiftUI 中的可变参数视图（Variadic Views）。它介绍了如何使用 `TupleView` 来构建多个视图，并展示了它在视图修饰符方面的透明性。文章还讨论了 SwiftUI 中的一些底层机制，如 `_VariadicView` 和 `_VariadicView.Tree`，以及它们与 `VStack` 和其它视图类型的关系。最后，文章演示了如何编写自定义的容器视图，类似于 `List` 和 `VStack`，以在视图之间插入分隔线。

### 🐕 [云音乐中 In-App Purchase 实践总结篇 - 掘金](https://juejin.cn/post/7233948883045941303)

[@Barney](https://github.com/BarneyZhaoooo)：这篇文章主要讨论了如何使用 StoreKit 库进行应用内购买 (IAP) 的开发，并提出了处理 IAP 中挑战和问题的方案。

- IAP 主要流程介绍以及目前存在的问题。
- NEStoreKit 整体结构和票据结果的可靠性。
- StoreKit2 介绍与展望。

### 🐕 [This Window Is Leaking](https://byla.lt/posts/this-window-is-leaking/)

[@Cooper Chen](https://github.com/cjlcooper)：这篇文章主要关注了 macOS SwiftUI 应用开发过程中，在 `NSWindow` 上设置自定义 `NSWindowDelegate` 可能会引入内存泄漏，并且说明了作者如何发现问题到尝试解决问题的思路，作者建议在在设置自定义 Delegate 之前保存原有的 Delegate，并在窗口关闭之前恢复它。另外值得一提的是这个解决方案对于未来版本是否适配是未知的，因此引入这个方案需要较为谨慎。

### 🐎 [构建稳定的预览视图 —— SwiftUI 预览的工作原理](https://juejin.cn/post/7236009910147596343)

[@J_Knight_](https://github.com/knightsj)：文章由一个引发 SwiftUI 预览崩溃的代码为切入点，深入分析和介绍了 SwiftUI 的预览机制（比如生成预览衍生文件等等）；也提示了为了提高开发效率需要注意的几个问题。

### 🐎 [饿了么开源自研多端框架 MorJS](https://mp.weixin.qq.com/s/XE6l7pMuj_0Vt9BWQG1XrQ)

[@老峰](https://github.com/eleme/morjs)：Mor 是饿了么开发的一款基于小程序 DSL 的可扩展多端研发框架，允许开发者编写一套小程序代码并通过转端编译在多个平台（如微信、支付宝、百度等）运行，从而提高开发效率并确保兼容性和一致性。特点包括：
- 多端编译：提供一码多端转换能力
- 集成研发：提供复杂小程序解耦开发能力
- 形态互转：提供小程序多形态转换能力
- H5 同构：提供小程序 DSL 转 H5 能力

除此上述核心能力外，MorJS 还实现了对于多端或不同环境构建产出不同代码的能力，产物压缩，程序本地 JSAPI mock 能力。

### 🐎 [Using Layout protocol to align explicitly positioned views in SwiftUI](https://nilcoalescing.com/blog/AnchoredPositionInSwiftUI/)

[@JonyFang](https://github.com/jonyfang): 介绍了在 SwiftUI 中定位视图的不同方法。`position()` 修饰符允许我们通过设置中心点坐标将视图放在其父容器内。然而，在某些情况下，我们不希望视图遮挡住其他标签，因此需要将视图和锚点右对齐或左对齐。

在 iOS15 及之前的版本中，通常的解决办法是使用 `GeometryReader` 来测量视图的大小并调整偏移量。然而，这种方法存在一些问题，如动画的不一致性等。

iOS 16 引入了新的 Layout 协议，它允许我们显式地放置视图，并在调用 `place()` 方法时指定一个锚点。Layout 协议有多种使用方式，但在只有一个标注的情况下，更简单的选项是每个标注都有自己的布局。

实例代码放在了 Github：[NilCoalescing/SwiftUI-Code-Examples
Public](https://github.com/NilCoalescing/SwiftUI-Code-Examples/blob/main/AnchoredPosition-Layout/AnchoredPosition.swift)

### 🐕 [在 iOS 中使用 IdentifyLookup 进行短信过滤](https://juejin.cn/post/7237697495109845052#heading-5)

[@AidenRao](https://weibo.com/AidenRao)：垃圾短信是一个长期存在、令人困扰的问题，Apple 在 WWDC 2017(iOS 11) 推出了 IdentityLookup 框架，让开发者可以参与到过滤短信的过程中。本文将介绍如何阻止这些短信、设备端的检测以及服务器检测等。

## 代码

### 🐕 [Sparkle - Mac 应用更新框架](https://github.com/sparkle-project/Sparkle)

[@水水](https://www.xuyanlan.com/)：如果你的应用上了 App Store ，其中最大便利之一就是更新处理，苹果可以通过 App Store 进行应用程序的传播和更新。但是如果你在外部分发应用程序，你需要一种替代方法来进行更新通知和执行更新等操作，Sparkle 就是一个帮你的 Mac 应用进行外部更新的框架，Sparkle 框架功能非常全面。如果你也有这方面的需要，具体可以参考 [Sparkle 的实现和接入](https://troz.net/post/2023/sparkle/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=web&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B606) 一文。

## 内推

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

- [杭州] 淘宝 - 终端平台 - iOS/Android/C++
- [上海] flomo - 招聘 iOS 开发
- [北京] TikTok - 招聘 iOS 开发
- [深圳 / 广州 / 北京 / 三亚] 字节跳动 - 剪映 - iOS / Android / PC / Web / C++ 工程师 / 算法
- [上海 / 深圳] SHEIN - iOS/Android 开发 团队介绍

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

## 关注我们

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

**关注有礼，关注【老司机技术周报】，回复「2021」，领取 2017/2018/2019/2020 内参**

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