# 老司机 iOS 周报 #238 | 2023-03-27

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

## 新闻

### [使用 Xcode 14.1 提交的截止日期即将到来](https://developer.apple.com/ios/submit/)

在 2023 年 4 月之后，所有新提交的 App 都将必须使用 Xcode 14.1 及之后的版本进行提交，还未迁移的同学需要加快进度啦。近期如果还在用老版本 Xcode 提交构建版本的同学应该也已经收到了 ITMS-90725: SDK Verison Issue 的警告。

## 文章

### 🌟 🐕 [bilibili-AVIF 图片格式落地](https://mp.weixin.qq.com/s/4HaVDdSCPgsRpT8HhWRsZA)

[@JonyFang](https://github.com/jonyfang)：在如今越来越看重体验的大环境下，对图片库的要求也日益攀升。从成本的角度来看，使用 AVIF 格式可以节省大量的网络带宽和存储空间，减少网站加载时间，并且可以改善用户体验，进而提高网站的效率和收益，从而节约大量的费用。本文介绍了 AVIF 图片格式在 bilibili 的落地，内容大纲：

1. AVIF 图片格式研究
	- 图片格式编解码研究
	- AVIF 在 B 站落地的调研
2. 分端实现
	- 服务端架构
	- Web 端实现
	- 移动端处理(解码器选择、请求策略、监控及降级策略、双端踩过的坑及怎么爬出来的)
3. 业务落地
	- Web 端
	- 移动端
4. 数据监控
	- 服务端监控
	- 移动端监控
	- 带宽收益
5. 推广过程中遇到的问题
	- 在线资源池容量
	- 负载不均导致利用率低
	- 研发资源不足问题
6. 展望 & QA

### 🌟 🐕 [Flutter Dart：泛型的协变与逆变](https://mp.weixin.qq.com/s/Vyl51PtpBQ_lCZR_uUMgZg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 本文对 Dart 范型体系做了详尽的讲解，深入浅出；每个讲解都有详尽的代码示例，对于不熟悉范型和不熟悉 Dart 范型体系的同学来说，是一个不错的学习资料，小编强烈推荐.

### 🐎 [Keyboard shortcuts for Export Unmodified Original in Photos for Mac](https://oleb.net/blog/2023/photos-keyboard-shortcuts/)

[@Cooper Chen](https://github.com/cjlcooper)：本文针对 macOS 系统上的照片应用程序没有为“导出未修改的原始照片”命令提供键盘快捷键的情况，通过使用 shell 脚本的方式，可以为最多 20 个选定项目指定 Ctrl+Opt+Cmd+E 快捷键组合的方式来来导出未修改的原始文件。这为 Mac 桌面开发者提供了一些快捷键维护的思路，可以作为一些借鉴和参考。

### 🐎 [Wrapping functions in structs](https://paul-samuels.com/blog/2023/03/18/wrapping-functions-in-structs/)

[@zvving](https://github.com/zvving)：本文探讨了在特定场景下将函数包装到结构体中的合理性：

1. 避免误传错误函数：使用结构体可以减少将错误函数传入的可能性，因为现在需要传递一个具体的类型。
2. 提供命名空间：将函数包装到结构体中可以为其提供一个命名空间，便于组织代码。
3. 提高代码可读性：使用结构体可以为函数参数添加标签，从而使函数调用更清晰易懂。

虽然将函数包装到结构体中并非在所有情况下都适用，但是它确实为开发者提供了一个有用的编程技巧，灵活选用可以提高代码的可维护性和可读性。

### 🐢 [苹果内购录：关于新定价规则的理解与思考](https://mp.weixin.qq.com/s/ZQlBFHuRoDYmYpMfgnsp2Q)：

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：2023 年 3 月，苹果发布了定价上的新能力 , 包括支持设定 App / IAP 所在区域及全球价格平衡、支持某地区自定义价格及禁止销售等能力。这些新能力给予了我们在定价上更多操作自由和风控能力，但同时新能力也给予了我们更多需要关注的点。对于普通开发者而言，后续需要做的主要是调整 App / IAP 基准地区。而对于中大型团队而言，除了更改基准地区，还可能涉及到风控策略、App Store Connect API 升级、监控工具链的升级等更多方面考量。想了解更多信息可详细阅读本文。

### 🐕 [Handling status bar color scheme and visibility in SwiftUI](https://danielsaidi.com/blog/2023/03/14/handling-status-bar-color-scheme-and-visibility-in-swiftui) 
[@AidenRao](https://weibo.com/AidenRao)：本文介绍了如何在 SwiftUI 中处理状态栏的颜色和可见性。作者开源了一个名为 ScrollKit 的开源库，该库提供了一些滚动视图包装器，使处理偏移跟踪、粘性头部等变得容易。作者还介绍了如何使用 .statusBarHidden() 视图修饰符来隐藏状态栏，并创建了一个 ObservableObject 来管理状态栏的可见性状态。最后，作者提供了一个自定义的视图修饰符，使状态栏的可见性自动更新。

### 🐎 [Removing Search Web from a context menu](https://vicegax.substack.com/p/removing-search-web-from-a-context)

[@zoeGuo](https://github.com/zoeGuo)：选中 UITextView 或者 WKWebView 中的文案时，会弹出一个 UIMenu，我们叫他 context menu。笔者遇到的问题是：不想要 menu 中的 Search Web 实现，因为这个默认实现仅支持了在 Safari 中搜索，用户如果在使用其他的浏览器作为默认浏览器，那么这个功能就不能使用了。解决方法是：重写 UIMenu 的 replacingChildren(_:) 方法，阻止其他的 item 被 Search Web 替换，之后再加入自定义实现的 item。文章中附有详细实现代码，有兴趣的读者可以进原文仔细阅读～

### 🐕 [为啥我的代码库那么大？聊聊 Git 使用坏习惯](https://mp.weixin.qq.com/s/6sC8evIQ7AZBWwJFRi6mww)

[@Barney](https://github.com/BarneyZhaoooo)：本文非常接地气的剖析了代码库越来越大的原因以及 Git 使用上的坏习惯，深入浅出，富有代表意义。

- 代码库变大的真实场景分析
- Git 结构详解
- 最佳实践

### [JVMTI 在手淘 Profiler 中的应用](https://mp.weixin.qq.com/s/_J8KaXmMy0yJ8vv5fiVLSQ)

[@Crazy](https://github.com/jiyan135960)：本文介绍了使用 JVMTI 监控线上版本状态的方法。作者通过修改 JDWP 和 Runtime 文件，介绍了如何绕过 JVMTI 只能在 Debug 模式下运行的限制，并提供了一些处理受限版本的方法。此外，本文还介绍了手淘封装的 TBProfiler 工具，它主要可以完成以下监控任务：

- 运行监控：包括方法调用监控、线程和类监控、异常捕获以及主线程锁监控。
- 内存监控
- 内存 Dump：包括对象实例信息、JVMTI 生成的 Hprof 和 Mini Hprof。

从手淘使用的功能可以看出，JVMTI 提供的能力非常强大而且实用。当日志提供的信息不足以支撑我们分析线上问题时，JVMTI 可以让我们更接近 Runtime，获取更多运行时信息。因此，本文非常适合有线上监控需求的同学仔细阅读。


## 代码

### [gptcommit](https://github.com/zurawiki/gptcommit)

[@老驴](https://weibo.com/u/6090610445)：最近几个月，是 AI 的集中爆发期。按照 NVIDIA 老黄的说法， AI 已经正式进入到了多年未见的科技行业的 "iPhone Moment" 。各路人才也在 AI 的各类应用上发挥各种创意。

对于很多同学来说，如何写一个 commit 的信息一直是个老大难问题，要在尽可能短的句子中覆盖到代码修改的核心并不是一件容易的事情。 gptcommit 就是通过 GPT-3 来自动生成 commit 信息，解放大家的脑细胞。虽然用的模型不是最新的 GPT-4，但是思路上值得大家学习。

## 摸鱼周报

[@摸鱼周报 #88](https://mp.weixin.qq.com/s/ex3aHSPjKj9woxQwHyRzZA)：第 88 期摸鱼周报来了，一起来看下本期概要吧：

* 本期话题：Xcode 14.3 RC 版本发布
* 内容推荐：推荐近期的一些优秀博文，涵盖 CreateML 使用、Runtime 探索、XCTest 性能测试等方面的内容
* 摸一下鱼：集成 GPT-4 的 Cursor；Github 推出 CopilotX；AI 工具使用提效，Prompt 编写模式

## 内推

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

具体信息请移步：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）
