Releases: SwiftOldDriver/iOS-Weekly
老司机 iOS 周报 #290 | 2024-05-27
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
Incorrect bundle purchase payments: Fixed!
作者 5 月初发现苹果从 24 年 2 月起,对于应用内包含了 App 套装销售(Offering app bundles) 的 App ,会少给予开发者一份原本 App 的购买费用,即:错误地从 App 套装销售 的购买收益中两次减去了之前购买的应用程序的价格。
在作者提交了反馈后,苹果回电问题已被发现,所有受影响的开发者将得到对应损失的补偿。
文章
🐢 探讨跨平台技术与跨平台 UI 框架及 Kotlin Multiplatform 在 bilibili 的实践
@JonyFang: 本文以相对客观的事实数据比对了目前移动领域的多个跨平台语言的横评,也相对主观的针对当前的大环境下的一些跨平台技术的思考及 B 站的选型做了一些解读。希望可以为读者开阔思路,也希望如果能拉拢到同样观点的大佬们共同一起反哺基于 Kotlin 跨平台的生态的建设。从而做到社区全局收益。后续 B 站会持续继续输出关于 KMP 技术的技术及实践的深度文章,也会持续关注跨平台技术的发展,希望能够在这个领域有更多的交流。
🐎 Is Dynamic Isolation Bad?
@zoeGuo:文章讨论了 Swift 并发中的动态隔离与静态隔离的区别和应用。静态隔离通过使用像 nonisolated
,isolated
,actor
, 和 global actor
这样的关键字来标记类或代码块,确保它们在编译时就定义好运行环境,是由编译器来处理的隔离。动态隔离使用运行时结构如锁来实现,需要在运行时正确地协调。文中举例用两种方式实现原子性,静态隔离固然安全,但动态隔离灵活便捷,要选择合适的方式解决并发问题。
🐕 Faster Git checkouts on NFS and SSD with parallelism
@AidenRao: 本篇文章主要介绍在大型存储库上使用并行 checkout 功能,此功能可将某些 checkout 操作在 SSD 上的速度提高 3.6 倍,在 NFS 挂载上的速度提高 4.5 倍。且所有使用到 checkout 机制的 git 命令都能收益,包括:clone, reset, switch, restore, merge 等。
🐕 计算机系统篇之链接(15):共享库拦截技术之运行时库打桩
@Damien: 本文主要讨论了 Linux 系统中的运行时库打桩技术,这是一种允许截获对共享库函数的调用,取而代之执行自己代码的技术。文章详细解释了运行时库打桩的实现原理,以及如何在加载程序时拦截标准库的 API(以 malloc/free 为例)的实现过程。
Scaling ChatGPT: Five Real-World Engineering Challenges
@老驴:这篇文章是采访了来自 OpenAI 的 Evan Morikawa,讲述了他们在爆炸增长的用户量下,是怎么解决一些难以解决的问题工程问题的。
他主要提到了下面的几点:
- KV 缓存和 GPU RAM 的管理。
- 批处理大小的优化。
- 正确的度量指标。
- 寻找 GPU 资源。
- 缺乏自动扩展的能力。
这些问题在比较早期的公司都比较容易遇到,但是像 OpenAI 这次这么快速爆炸的用户量增长,应该也算是比较少见的了。如果对 OpenAI 感兴趣的同学,建议读一读原文。
代码
HandVector
@BluesJiang:这个是一个在 VisionOS 平台上实现手势识别的开源库。主要是通过 ARKit 拿到手部骨骼节点后,通过余弦相似的算法,来评估手部骨骼节点与目标手势的相似度,以此来支持手势识别。还可以预先录制自己期望的手势作为匹配目标,实现任意手势的识别和匹配。
本开源库还介绍了一种如何在模拟器中调试手势识别算法的方法,因为官方模拟器并没有提供访问摄像识别手势的能力。方案主要是使用 Google 的 MediaPipes 来代替 Vision Pro 真机上的手势识别能力,然后将数据投入 Swift 代码中进行测试。
这个也是少有的在 Swift Native 侧开源的基础算法仓库之一,可以提供参考和借鉴。
书
【 iOS 】 Apple 增强现实(Apple Augmented Reality)「上卷」「下卷」
@Smallfly:这是一本 raywenderlich 出品的 AR 教程,国内的同学翻译。这本书是为初中级 iOS 开发者设计的,旨在帮助读者使用 Swift 构建苹果平台上的沉浸式增强现实(AR)体验。
书中涵盖了以下主题:
- Reality Composer & Reality Files: 学习如何使用 Reality Composer 创建 AR 体验,以及如何使用 Reality Converter 和 USDZ 文件。
- RealityKit: 一个用于构建丰富 AR 体验的框架。
- Facial Blend Shapes: 学习如何使用面部融合形状来创建反应用户面部表情的 AR 面具。
- ARKit: 苹果的 AR 开发框架,用于创建交互式 AR 体验。
- Raycasting & Physics: 学习如何在 AR 应用中使用射线投射和物理引擎。
- ECS & Collaborative Experiences: 探索如何创建多人共享的 AR 体验。
书籍分为多个部分,每个部分都通过项目来教授特定的技能和概念。例如,使用 Reality Composer 创建交互式虚拟鼓套件,使用图像锚点和跟踪创建交互式 AR 商务名片,以及使用 RealityKit 和面部跟踪创建类似 Snapchat 的面部滤镜应用等。
如果你对 AR 开发感兴趣,可以直接访问提供的链接。
【 iOS 】并发(Concurrency)
@DylanYang:这是一本 raywenderlich 出品的 iOS 并发(Concurrency)教程,国内的同学翻译。这本书能够帮助 iOS 初学者理解并发的概念,并且快速上手实践。需要注意的是,这本书中讲述的并发是以 GCD(Grand Central Dispatch)实现的,而非最新的 Swift 并发框架(Swift Concurrency),考虑到 GCD 依然是当前的主流,这本书非常值得一读。
书籍分为多个章节,详细解释了并发的概念,以及 GCD 和 Operations 的原理和实际使用的方式。本书使用了诸多的代码示例使读者便于理解,尤其是最后通过 CoreData 的案例展现了并发如何在实际中应用。除此之外,本外也讲述了如何通过 Thread Sanitizer 来分析并发中常见的数据竞争问题。
整体而言,这是一本内容翔实的并发教程,感兴趣的读者可以收藏后反复品读。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #289 | 2024-05-20
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
有很多朋友最近在后台留言询问 WWDC 24 内参的相关事宜,今年的内参老司机技术会继续主办,还请大家放心,我们会在合适的时间邀请大家共同参与今年的内参创作!
文章
🐕 SE-0436: Objective-C implementations in Swift
@kemchenj:Swift 团队最近提出了提案 SE-0436,可以用 Swift 来实现 Objective-C 的 Category/Extension,并且让调用者对此毫无感知,就像是 Objective-C 实现的那样,但这个功能的必要性在哪?
- 对于大型混编项目来说,Swift 生成的 Header 会严重拖慢增量编译的速度,这一点在 #242 期的 抖音 Swift 编译优化 - 基于自定义 Toolchain 编译提速 60% 里有详细的说明,如果是通过这个功能去实现的话,就可以绕开这个问题
- Swift 自动生成的 Header 文件可读性很差,对于习惯了将 Header 文件作为文档阅读的 Objective-C 工程师来说是灾难般的存在
- 可以给 Swift 提供更 Swifty 的接口,WebKit 早在这个提案之前就用上了这个功能,给
WKSLinearMediaPlayer
加上了var isLoadingPublisher: AnyPublisher<Bool, Never>
等接口,试想一下如果底层使用的是 Objective-C 实现的话,那这样 Swifty 的接口可能就很难实现了
🐕 【 Just For Fun 】 C - 宏开发 - 选取第 n 项参数、按照参数数目展开不同的宏、缺陷
@Barney:这个系列文章深入探讨了 C 语言宏的高级应用,从可变参数函数的基础用法,到宏定义中参数的选择和计数,再到延迟展开技术,逐步展示了宏在 C 语言中的灵活性和强大能力。文章通过具体示例,详细解释了如何构建能够根据参数数量动态展开的宏,以及如何利用延迟展开来优化宏的行为。这些技巧不仅增强了对 C 语言宏机制的理解,也为宏编程提供了新的视角和解决方案。
🐢 每个程序员都应该了解的硬件知识
@xuyafei86:在追求高效代码的路上,我们不可避免地会遇到代码的性能瓶颈。为了了解、解释一段代码为什么低效,并尝试改进低效的代码,我们总是要了解硬件的工作原理。于是,我们可能会尝试搜索有关某个架构的介绍、一些优化指南或者阅读一些计算机科学的教科书(如:计算机组成原理)。但以上的内容可能都太过繁琐、细节太多,在阅读的过程中,我们可能会迷失在纷繁的细节中,没法很好地将知识运用到实践中。本文旨在通过多个可运行的 benchmark 介绍常见的优化细节以及与之相关的硬件知识,为读者建立一个简单、有效的硬件心智模型。
🐎 存储空间终于算“对”了
@Smallfly:这篇文章分析了 iOS 系统中 App 显示存储空间与系统显示不一致的问题,并探讨了造成差异的四个主要原因:App 自身大小、进制差异、口径差异和统计路径差异。文章通过实验验证了 iOS 存储空间的显示口径,并介绍了快手 App 如何通过技术改进实现与系统显示对齐,增强了用户体验和信任。
🐎 Flutter 3.22 发布,快来看看有什么更新吧?
@Crazy:本篇文章主要介绍了 Flutter 3.22 中更新的一些主要功能与性能优化。JsonCodable 因该是所有 Flutter 开发者比较期待的一个功能了,Json 的序列化问题一直都是 Flutter 的大麻烦,需要借助 build_runner 生成 Dart 代码来解决。有了 JsonCodable 以后会大大加速 Flutter 开发者的开发效率。本次 Flutter 更新还将 Vulkan backend 和 Wasm Native 两个功能实现了落地,让 Web 的渲染速度得到了巨大的提升。剩下更多的更新可以在文章中浏览。
代码
🌟 🐎 时隔五年,IGListKit 迎来 5.0.0 版本更新
@zvving:时隔五年,Instagram 团队隆重推出了 IGListKit 的 5.0.0 版本(4.0.0 版本的发布时间还是 2019 年 11 月)。这个新版本整合了近年来 Instagram 对 IGListKit 进行的所有增强,引入了后台 diffing 功能,对 scrollToObject: 方法进行了改进,增加了对 Mac Catalyst 的支持,并提供了 IGListAdapter 等更丰富的属性观察与状态回调方式。此外,还对性能进行了优化,并修复了安全性和细节问题,同时带来了一些 Breaking Changes。
考虑到这个版本在多年后带来的众多改进和优化,我们强烈推荐已经使用 IGListKit 的团队关注并尝试更新,以期获得更出色的性能、稳定性和新功能。
🐎 SwiftSecurity: Modern Swift framework for Keychain API
@含笑饮砒霜:SwiftSecurity 是 Apple 安全框架的现代 Swift API (Keychain API、SharedWebCredentials API 等)。通过编译时检查,以更简单的方式保护您的应用程序管理的数据。SwiftSecurity 与其他包装器有些不同,它支持每个钥匙串项目类别,与 CryptoKit 和 SwiftUI 兼容等。
音视频
🐢 The Sound of Software
@CrazyCoderShi: 顾名思义,本系列文章讲述如何在软件中使用声音,从声音的本质开始阐述,到工具推荐,到整体设计,一连串文章一步步带你创造酷炫的声响;该系列由 notboring 产出;notboring 崇尚酷炫的交互和极致的影音体验 , 他们在 App Store 上有诸多酷炫的应用 , 有声音软件开发的同学 , 强烈推荐学习 !
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #288 | 2024-05-13
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
AppStore Connect 提交失败 Workaround
上周陆续有读者在老司机的 App Review 群中反馈提交审核时遇到了奇怪的问题,也有群友提供了解决方案,我们再次汇总如下:
- 当遇到 2.0.0 二进制文件无效 的问题,可以等待一会,换一个小版本号重新上传,可以解决。
- 当遇到 无法添加以供审核 的问题,需要在 ICP 备案的输入框中在正常输入备案号后,再额外增加一个空格。即可进行后续流程。
新手推荐
🌟 戴铭的 Swift 小册子
@AidenRao: 小册子是一个使用 Swift、按照声明式 UI 和响应式编程范式开发的开源 macOS 程序,上面的内容主要面向 Swift 零基础的同学,包括 Swift 的知识点、直接可用的小例子和知识点相关的其它资料,推荐 Swift 新手及感兴趣的同学学习使用。
Safely unwrap optional values in SwiftUI bindings
@zoeGuo:在 SwiftUI 中 , $
符号用于创建一个绑定到可观察对象的引用。但一个可选对象用 $
后得到的是一个不可选的对象。那么在这种场景下可以使用 Binding
将对象包装,Binding
的初始化方法 init?(_ base: Binding<Value?>)
会解包绑定的可选值,并提供一个非可选值,这样就又可以对原来的可选值进行安全解包了。文章中有简洁明了的代码示例,感兴趣的读者可以阅读原文。
文章
🐎 iOS 依赖库版本一致性检测:确保应用兼容性
@BluesJiang:本篇主要介绍了一种检测系统库最低版本依赖的方法。核心的思路使用 otool
获取依赖的系统库,然后调用苹果的接口来查询系统库支持的最低系统版本。用来解决 App 意外错误引入高于 App 最低支持系统版本的系统库,导致 App 启动崩溃的问题。
🐎 淘系两年半 A/B 实验经历,聊聊我理解的“科学实验”
@Smallfly:这篇文章主要讲述了作者在淘系两年半的 A/B 实验经历,包括在货架电商和内容电商两个领域的 A/B 实验能力建设。文章中,作者分享了对科学实验的理解和实践,文章中提到了几个关键点:
- 业务目标科学:增长目标应该是长期健康、可量化验证的。
- 实验设计科学:在常规实验中,样本组的同质性和样本间的独立性是重要的考虑因素。
- 实验数据可用:强调了 AA 检验的重要性,以确保实验数据的可用性。
- 实验分析科学:在获得可用的数据基础上,关注实验分析的问题,包括确定需要观察的指标和维度,以及如何处理低响应实验。
🐎 彻底弄懂 Linux 下的文件描述符(fd)
@DylanYang:本文介绍了 Linux 下的文件描述符(file descriptor)。文件描述符是内核对已经被打开文件所创建的索引。内核维护了一张进程级别的文件描述符表,记录了每个文件描述符对应的文件指针,使得对这些文件进行 I/O 操作的系统调用都可以通过文件描述符来实现。同时系统还维护着系统级别的打开文件表和 i-node 表,这两张表内有关于打开文件更多的信息,包括偏移量、访问模式、权限等。文件描述符表指向打开文件表,打开文件表则又指向了 i-node 表。此外,本文也举例了通过 shell、C 语言、python 等方式打开文件后,文件描述符的实际表现。
🐎 OS Style settings view
@水水:如果您正苦恼于不知道怎么给 MacOS 应用添加一个符合 MacOS 风格的设置页面,那么本文给出了简单的代码示例教您如何去实现,敢兴趣的读者可以参考 ~
🐎 Flutter 之 HTTP3/QUIC 和 Cronet 你了解过吗?
@极速男孩:本文介绍了 HTTP/3 和 QUIC 协议及其在 Flutter 中的应用,特别是通过 Cronet 库。HTTP/3 基于 QUIC 实现,优化了网络连接的稳定性和效率,支持连接迁移和加密。Cronet 作为 Chromium 的网络堆栈,支持 QUIC 和 TCP,可通过 Flutter 使用,增强移动应用的网络性能。文章还讨论了如何在 Flutter 项目中通过 cronet_http 包和 Dio 库集成 Cronet,利用其在 Android 上的优势,以及 iOS 上用 NativeAdapter 的来支持 HTTP/3。
播客
🐢 SWIFT PACKAGE INDEXING EPISODE 43: Now I ’ m worried our metrics aren ’ t correct! with special guest Holly Borla
@Kyle-Ye: 本期 SwiftPackageIndex 播客和特邀嘉宾苹果的 Swift 语言团队的负责人 Holly Borla 讨论了 Swift 6 的并发特性和语言模式迁移,Swift Package Index 中的 Swift 6 兼容性跟踪项目。同时介绍了一些与并发相关的提案(SE414 和 SE431)和 Swift 软件包。
工具
difftastic
@Crazy:difftastic 是一款专门针对文件对比的工具,这个工具不是简单的逐行对比,会根据语言以及运行环境进行分析,提供更便于阅读对比界面。该工具现在支持多种语言,移动端开发所用的 Swift、Java、Kotlin、Dart 都已经支持。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #287 | 2024-04-29
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
文章
🐕 RxSwift 6 更新了什么
@zoeGuo:这是一篇 What's new in RxSwift 6 ?
的译文,文章介绍了 RxSwift 6 的新特性和重要更新,如将 Binder
从 RxCocoa 迁移到 RxSwift、使用 @dynamicMemberLookup
自动建立 Binders、新的 withUnretained
运算符,以及一些运算符重命名
等。无论你是 RxSwift 的新手还是老手,这篇文章都能提供给你大量有价值的信息,帮助你更好地利用 RxSwift 提升开发效率。
🐕 SwiftUI: Custom View Transition(Navigation) With Matched Geometry
@Damien:文章主要讨论了如何在 SwiftUI 中使用 matchedGeometryEffect 来自定义视图转换。例如,如何动画化文本的位置,如何以不同的方式动画化多个视图,如何创建一个放大效果等等动画。文章还详细介绍了如何在视图上使用 matchedGeometryEffect 来替换当前的 NavigationStack,这篇文章为那些希望在 SwiftUI 中自定义视图转换的开发者提供了一种新的可能性。
🐕 Swift 6 upgrade Preparation
@Kyle-Ye: 文章介绍了如何在 Xcode Project 项目和 Swift Package Manager 项目中如何逐步采用 Swift 6 模式的部分功能,以便为即将到来的 Swift 6 做好准备。除此之外,本文也介绍并讨论了如何处理一些常见的迁移问题,如 Actor 相关的各种报错。
完整的 Swift Features 清单可以通过以下 Gist 中提供的脚本获取:
工具
🐎 Periphery
@Smallfly:Periphery 一款专门用于识别 Swift 项目中未使用代码的工具。通过分析项目的源代码,帮助开发者发现并删除那些在项目中没有被引用的代码部分,从而精简代码库,提高代码的可维护性。
🐕 Copilot For Xcode
@Cooper Chen:Copilot for Xcode 是一个 Xcode 源代码编辑器扩展,为 Xcode 提供 GitHub Copilot、Codeium 和 ChatGPT 支持,包括以下功能:
- 代码建议(由 GitHub Copilot 和 Codeium 提供支持)。
- 聊天(由 OpenAI ChatGPT 提供支持)。
- 提示代码(由 OpenAI ChatGPT 提供支持)。
- 自定义命令将聊天和提示扩展为代码。
建议开发者都可以尝试使用这个拓展工具,能够大大提高工作效率。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #286 | 2024-04-22
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新手推荐
🐕 Xcode Bookmarks
@Barney:Xcode 15 引入了一种新的代码注释和搜索查询书签功能,用户可以通过选择代码行并使用上下文菜单来创建书签,还可以对书签添加描述、分组和标记完成状态,以及保存搜索查询。这项新功能提高了代码注释和搜索结果的管理效率。
文章
🐎 How to define a custom file header for a Swift Package
@zoeGuo:开发过程中代码的文件头可以包含一些必要信息,Xcode 一般会为我们生成默认的文件头,想要自定义文件头,应该怎么做呢?文章描述了如何为 Swift 包定义一个自定义的文件头,在本地 <Package Root>/.swiftpm/xcode/package.xcworkspace/xcshareddata
目录下添加一个 IDETemplateMacros.plist
文件即可,文中例举了 IDETemplateMacros 文件写法。
🐕 Actor reentrancy in Swift explained
@Cooper Chen:本文深入解析了 Swift 中的 actor 重入性,这是管理 actor 内并发任务的关键概念。虽然 actor 确保单线程执行,但异步函数带来的挑战在于它们不总是 atomic 地执行。作者通过示例,说明了同时从本地和远程源读取数据可能导致意外结果的原因,而解决方案涉及管理任务以防止冗余网络调用。作者重点提及了在 actor 的异步方法中考虑重入性以避免错误的重要性,因此理解和解决重入性相关问题对于有效地管理并发至关重要,同时作者强调需要谨慎考虑并采用个性化的解决方案来处理重入性问题。
🐎 Splitting Up a Monolith: From 1 to 25 Swift Packages
@Smallfly:这篇文章分享了作者如何将一个大型 Swift 包重构为 25 个较小的包。这个过程中,他解决了对 iCloud 的依赖、代码共享的复杂性、SwiftUI 预览和编译时间问题。通过创建抽象层和依赖注入,成功解耦了核心模型和 CloudKit。
重构后,他将包分为纯可重用和特定于 Foodnoms 的两类,提高了代码的模块化和可测试性。虽然面临日志记录的挑战和应用包大小增加,但整体性能提升,SwiftUI 预览也变得更实用。重构思路具有一定的借鉴意义。
🐕 Fetching OSLog Messages in Swift
@极速男孩:这篇文章介绍了如何在 iOS 应用程序中使用 OSLog 框架实时检索日志。文章通过导入 OSLog 框架和创建 Logger 对象来开始,并说明了如何在应用的不同区域生成日志。关键部分涉及使用 OSLogStore 以及如何设置起始位置和使用 NSPredicate 进行日志过滤,以提高性能。文章还讨论了使用 OSLogStore 时遇到的一些限制,如检索速度慢,并推荐了 Apple 的 SwiftLog 作为替代方案。最后,提供了一个展示日志的 SwiftUI 视图示例,说明了如何异步获取并显示日志。
🐎 Bar Chart creation using Swift Charts
@DylanYang:本文介绍了 Swift Charts 的一些基础用法, Swift Charts 能够帮助开发者更便捷的呈现图表数据。作者以 Xcode 的编译数据作为示例,展现了如何通过 Swift Charts 构建一个柱状图,并能够调整柱状图的展示范围。同时通过 foregroundStyle
、chartForegroundStyleScale
等 modifier, 我们也能轻松的对柱状图进行分组、改变柱状图颜色等操作。
🐕 QQ 9 “傻快傻快”背后的技术秘密
@JonyFang:本篇介绍了 QQ 9 丝滑背后的技术实现,从启动速度,页面刷新,差异算法,预加载和回收,异步布局和渲染等方面介绍了手 Q 在性能方面做的全流程优化,并介绍了几个用户体验提升的场景表现。每一项优化点深入后内容相对复杂,都可以单独拎出来展开说明,文中也提到后续会慢慢分享出来。
工具
🐎 Mac App 原生内置 Debug 菜单
@BluesJiang:这个是开发 Mac App 的隐藏 Debug 菜单。使用 UserDefaults.standard.setValue(true, forKey: "_NS_4445425547")
开启。
开启后会在菜单栏里出现一个 🐞 菜单。这个菜单不依赖 Xcode,跟随 App 启动而启动。它提供了很多方便的辅助,比如 Responder 打印、View Bounds 展示、改变 Appearance 等。推荐尝试。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #285 | 2024-04-15
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
iOS 17.4/17.4.1 新安装的用户首次启动 IDFA 权限获取失败,以及 workaround
首次新安装 APP 的用户会在通过 ATTrackingManager.requestTrackingAuthorization()
申请 IDFA 的时候自动失败(即使用户还没有手动点击拒绝),这会对依赖 IDFA 归因或者正在投放的 APP 造成一定影响,论坛也已经有同学给出 workaround(通过 IDFA 弹窗在关闭时会触发 UIApplication.didBecomeActiveNotification
进行再次判断)。
文章
🌟 🐕 五年沉淀,微信全平台终端数据库 WCDB 迎来重大升级!
@JonyFang:在接口层面,新版 WCDB 全面支持了 C++、Java、Kotlin、Swift 和 ObjC 这五种主要的终端开发语言,覆盖了 Android、iOS、Windows 、macOS 和 Linux 这五大终端平台。同时,还对 Winq 进行了重写和强化,使开发者能够在各种语言中使用原生语法编写任意 SQL。
在功能层面,新版 WCDB 推出了全新的数据备份和修复方案,大幅提升了数据修复率,同时将数据备份的性能消耗降至可忽略不计。此外,还重点推出了数据迁移和数据压缩这两个新功能,让开发者仅通过简单的配置,就能高效处理复杂业务中的数据过度聚集和数据过度膨胀这两大难题。新版 WCDB 还推出了 FTS5 优化和可中断事务等新特性,使开发者在特定场景下可以实现更极致的性能优化。
🐕 How to avoid using AnyView in SwiftUI
@AidenRao:这篇文章讨论了在 SwiftUI 中避免使用 AnyView 的方法。AnyView 是一种类型擦除视图,用于包装其他 SwiftUI 视图,但它会降低 SwiftUI 的性能。文章提出了三种替代方案:
- 使用 @ViewBuilder 属性:通过在属性或函数上添加 @ViewBuilder 属性,可以将多个视图组合成单个返回类型,而无需使用 AnyView。
- 使用 Group 类型:Group 类型允许将多个视图组合成一个视图,而不会影响布局。使用 Group 可以避免使用 AnyView,并可以根据需要组合不同类型的视图。
- 使用泛型:当需要存储不确定类型的视图时,可以使用泛型来代替 AnyView。通过使用泛型参数,可以灵活地存储和使用视图,而无需使用 AnyView。
🐕 In Search of a Smooth Scroll
@水水:本文记录了作者由于对更平滑滚动的追求而将 LazyVGrid 替换为 NSTableView 的过程,可以见到结果是 NSTableView 确实会有更丝滑的效果,不过作者并不是希望大家认为 SwiftUI 很慢而 AppKit 很快,或者 macOS 上的 SwiftUI 还没有为重要的应用程序做好准备,事实上作者重写过程中 SwiftUI 已经解决了部分问题。最后作者聊了对 AppKit 的非官方见解和反思,也希望大家对两种技术都有着同样的热爱。
🐎 Exploring ABI stability, @frozen, and library evolution mode
@DylanYang:本文作者通过 @frozen
关键字,引申出 Swift 的 ABI 稳定和 library evolution mode。其中 @frozen
关键字确保了 enums
和 structs
的接口不再改变,因此也保证了内存布局的固定,带来了更好的性能。ABI 稳定则使得面得不同的语言版本,swift 库不再需要每次重新编译就可以兼容高版本。而 library evolution mode 是一个编译器能力,开启它后使得编译器会产出额外的用于描述关于库的数据结构、方法等的元数据,确保在不同的语言版本下,这些数据依然保持一致。这三者共同确保了 Swift 库在不同语言版本、不同操作系统版本下的兼容性,并最终带来了更好的的开发体验。
工具
🐕 Mac OS X Debugging Magic
@Cooper Chen:在 MacOS 开发中,Apple 提供了许多调试工具,以协助开发者针对特定场景进行开发和调试。这些工具中的许多被保留在发布的系统中,供开发者使用以调试其代码。下面列举了一些在 Mac OS X 中的“秘密”调试工具,包括环境变量、首选项、可从 GDB 调用的例程以及特殊文件等。若你正致力于 Mac OS X 软件开发,这个调试工具集合列表将极具帮助。
代码
🐕 COW Macro Package
@Kyle-Ye:Swift 的大量标准库内的 struct 出于性能等因素考虑都进行了 Copy On Write(后简称 COW)优化(如 String、Array、Set、Dictionary),但是对于业务自定义的 struct 默认没有此类优化。
因此如果业务定义了一个巨大的 struct,在此 struct 作为参数传递过程中,容易产生较大的包大小并且有一定性能影响。
对于每个希望开启 COW 的 struct 进行手写优化较为繁琐,下面是本期推荐的两个相关 COW Macro 的开源库,可以帮助我们快速 opt-in 此项优化。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #284 | 2024-04-08
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
文章
🐎 Generate and read analytics reports from the App Store Connect API
@Smallfly:这篇文章介绍了苹果公司最近推出的 50 多种新的分析报告,这些报告包括应用商店参与度、应用商店商务、应用使用情况、框架使用情况和性能等方面的数据。虽然这些新数据提供了很多洞察力,非常有价值,但它们仅通过 App Store Connect API 独家提供,而且获取数据的方式并不直观。文章中介绍了如何使用 App Store Connect Swift SDK 来访问这些新的指标。如果对该方式感兴趣,值得一读。
🐕 Swift Isolation Intuition
@DylanYang:本文详细介绍了 swift 并发框架中的隔离(Isolation)概念,作者通过一系列的例子阐述了如何判断当前代码上下文的隔离状态。关于隔离,作者总结了三条规律:
- 隔离状态是在方法、数据结构、变量等声明时就确定的
- 隔离状态只会被 async 改变
- Protocal 也可以声明隔离状态
同时应当牢记隔离状态是一个编译时的声明,运行时的状态并不重要,即使一段代码在运行时只会跑在主线程上也不代表它是一段主线程隔离(MainActor-isolated)的代码。
本文在书写过程中假设读者已经对 swift 并发的基础概念((Actor、Task 等))有了一些了解,建议未接触过 swift 并发的读者可以简单了解下这几个概念后再阅读此文。
🐢 Near real-time UI code generation on iPad
@BluesJiang: 本论文展示了如何利用 YOLO 模型实现从草图到 SwiftUI 代码的流程。详细说明了从数据收集处理、模型训练以及利用 CoreML 实现单机完成部署投放。这里利用 iPad 强大的绘画、机器学习、SwiftPlayground 的能力,可以充分的展示这种可能性。具体展示的效果可以查看 Demo 视频。这篇论文很好的展示了机器学习实践的完整流程,值得学习。
理解 C++ 的六种 Memory Order
@老驴:本文详细介绍了 C++11 中引入的六种内存顺序(memory order)的概念,目的是解决多线程环境下的数据一致性和可见性问题。内存顺序包括:
Relaxed:不保证顺序性的最宽松内存顺序。
Consume:保证读操作能看到数据依赖的写操作。
Acquire:确保读操作可以看到在相应 release 操作之前的所有写操作。
Release:确保写操作之前的所有操作对其他线程可见。
Acquire-Release:同时包含 acquire 和 release 语义。
Sequential Consistent:所有线程看到一致顺序操作的最严格内存顺序。
想要了解 C++ 内存的话,值得一读。
🐕 Using @_silgen_name to forward declare functions in Swift and improve build times
@Cooper Chen:文章介绍了使用 @_silgen_name
属性在 Swift 中前向声明函数以及改善构建时间的方法。作者强调了谨慎使用这一技巧的重要性,并解释了其工作原理和潜在风险。通过示例和技术细节,文章展示了如何使用该属性来提高 Swift 应用程序的构建效率,尽管牺牲了一些类型安全性。最后,作者呼吁 Swift 支持更多类似的功能,以满足开发者对更多控制和灵活性的需求。这对于需要提升 Swfift 编译速度相关内容的开发者有一定的参考价值。
🐕 lldb remove randomness
@极速男孩:这篇文章介绍了如何使用 LLDB 调试器去除调试第三方应用时的随机性。通过一个示例程序,演示了生成随机数据并打印出来的过程。文章重点在于展示如何通过设置 LLDB 断点和特定命令,强制 randomData 函数返回固定长度和内容的数据,从而消除随机性。作者分步骤说明了如何先返回固定大小的数据,然后是动态大小但固定数据,最终是动态大小且看似随机但实际一致的数据。这一技巧在需要调试包含随机元素的程序时非常有用,能够提高调试的效率和准确性。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #283 | 2024-04-01
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
周报编辑组又来新人啦~
欢迎 DylanYang 加入老司机技术,目前就职于字节跳动,参与音乐相关客户端开发,业余喜欢看看番、打打游戏。
欢迎 Kyle-Ye 加入老司机技术,他是 Swift Documentation Workgroup 成员,独立开发者,专注于 OpenSwiftUI / Swift 相关研究。
希望 DylanYang 与 Kyle-Ye 的加入也能为大家带来更多元化的内容输出!
文章
🐎 A better pull request
@Smallfly:在使用 Git 时,执行 git diff master...alice/master
,「三个点」查看当前分支与远端分支的差异,清楚的了解将要拉取的内容,然而当远端分支有提交时,新的提交无法在 diff 中显示,这么设计有其合理性。本文作者认为不太方便,在 Bitbucket 中使用「两个点」展示与最新分支的 diff 会更清晰。对实现感兴趣的同学可阅读原文了解。
🐎 SwiftUI Previews-based architecture
@DylanYang:本文作者通过一个简单的 demo 阐述了如何实现基于 SwiftUI Previews 框架的开发流程。同时作者也借此引入了他认为实现代码灵活性和解耦的两个工具:接口(Interface)和依赖注入(Dependency Injection),并在 demo 中进行了实践。接口在 Swift 中以原生的 Protocol 呈现而依赖注入则可以凭借 SwiftUI 中的环境变量(Environment Values)来实现。此外借助 @Observable
、ObservableObject
和环境变量等能力,整个框架在渲染性能、内存和数据同步方面都非常优秀。
🐕 Using a Swift macro to generate an EnvironmentKey
@Barney:这篇文章介绍了如何使用名为 @EnvironmentStorage
的 Swift 宏来简化 SwiftUI 中 Environment 的使用,自动生成 EnvironmentKey 和相关的 EnvironmentValues 代码,减少样板代码,提高开发效率。通过引入 SwiftUIMacros 包并应用该宏,开发者只需定义属性名、类型和默认值即可快速创建环境存储,从而节省时间并减少错误。
🐕 Be Careful When You Initialize a State Object
@AidenRao:在这篇文章中,Jared Sinclair 谈到了在使用 @StateObject 时需要注意的一些最佳实践:如果你必须显式地初始化 @StateObject,请密切注意属性包装器的初始化参数是一个名为 thunk 的转义闭包,而不是一个名为 wrappedValue 的对象。请在闭包内部完成所有封装对象的初始化和预处理,否则就会损害性能优势,而性能优势很可能正是你使用 @StateObject 的初衷。
🐕 Unrestricted View Replication
@JonyFang: 本文讨论了在 iOS 应用中单 UIView 实例多副本场景的处理。首先介绍了使用私有 API _UIPortalView
来实现复制视图的方法,但指出这不符合苹果的规定,因此需要寻找其他解决方案。
接下来,引出 CAReplicatorLayer
来实现复制视图的方法。CAReplicatorLayer
可以创建多个视图的副本,并对每个副本应用递归变换。文中也讨论了使用嵌套的 CAReplicatorLayer
来创建复杂布局的方法,但指出这种方法会导致视图复制的复杂性和性能问题。
最后,提到了 CAReplicatorLayer
的 instanceDelay
属性,该属性可以在复制的视图实例之间创建动画延迟。
🐎 How to run asynchronous code in Swift Playground correctly?
@zoeGuo:Swift Playground 是快速试验 Swift 代码的绝佳工具。默认情况下,Swift Playground 从程序的顶部到底部同步执行代码。当运行异步代码时,会遇到代码执行不会结束的问题。引入 PlaygroundSupport
库,配合使用 needsIndefiniteExecution
、finishExecution()
两个 API,即可在 Swift Playground 中编写异步代码并顺利执行,文中例举了在 Swift Playground 中使用 dispatchGroup 完成异步逻辑的操作。
🐎 Make Your iOS App Smaller with Dynamic Frameworks
@Leo:iOS 的 Widget 和 ShareExtension 是独立的 target,sandbox 和主 App 是独立的,如果多个独立的 Target 采用静态链接的方式来构建,那么某些基础库的的代码和资源会被在多个 Target 之间拷贝多份。本文提出了一种解决多 Target 之间共享代码和资源的方式,即用 Dynamic Framework,可以显著优化包大小。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #282 | 2024-03-25
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新手推荐
@zoeGuo:文章是一篇关于 Cocoapods 版本号使用的一个建议:要注意使用标准化的版本号,不要在主干分支使用 prerelease 版本号。原因是 Podfile 中强指定一个库的版本号,如果是一个 prerelease 版本号,最终依赖的不一定是这个版本,这其中的不确定性便来于 Cocoapods 底层对 prerelease 版本的处理策略。文中解释了 Cocoapods 如何判断 Source 里面的版本是否满足依赖要求的,可以配合语义化版本号规范一起阅读。
文章
🌟🐕 Apple 也在用的 Benchmark 框架
@kemchenj:这篇文章介绍了一个专为 Swift 编写的 Benchmark 包,除了支持追踪常用的 CPU 时间和内存占用情况,还支持了 ARC 相关的数据,swift-foundation 之类的 Apple 官方开源项目也都在使用。
另外 Benchmark 的文档也写得非常好,手把手教你生成 baseline,生成可视化图表,甚至连 GitHub CI 的 workflow 都教你怎么写,直接评论到 PR 上看对比结果。
🐢 A Gentle Introduction to LLVM IR
@Kyle-Ye: 本文由浅入深地介绍了 LLVM IR 的一些基本常识和概念,并给出了相关例子。
- % 和 @ 的在 LLVM IR 中的含义
- LLVM IR 的类型表示
- CFG 和不可达优化等
了解 LLVM IR 的主要用途是,在进行性能优化时,介于源代码和汇编代码之间的 LLVM IR 可能会是更方便的选择。
🐎 Swift Tooling: Windows Edition
@Kyle-Ye: 本文介绍了 Arc 公司所推动 Swift on Windows 的最新进展和一些他们的开发体验分享
- 🔨 开发环境 : VSCode 是 Swift on Windows 上的首选开发环境。
- ✍️ 代码编辑 : VSCode IDE 目前已提供了代码补全、导航和错误显示功能等功能。
- 🧪 构建和测试 : 支持通过 Swift Package Manager 和 CMake 进行构建和测试。
- 🐛 调试能力 : LLDB 调试和命令行调试目前都已支持。
🐢 Nerdy internals of an Apple text editor & 9 years of Apple text editor solo dev
@含笑饮砒霜:作者作为一位全栈 Web 开发者,出于对 Mac 上独特应用程序生态系统的热爱,踏上了制作 Mac 原生文本编辑器的旅程。经过两年的努力,成功推出了名为 Paper 的 Mac 应用程序,随后又将其扩展到了 iOS 平台。作者尤其注重用户体验和应用程序的稳定性,因此选择了开发本土应用,充分利用了 Xcode、AppKit 和 Objective-C 等技术的优势。
正是作者的坚持和追求,使得 Paper 文本编辑器得以诞生并逐渐完善。而当我们深入了解 Paper 背后的工程细节时,不禁为作者的专业素养和技术实力所折服。Paper 的核心组件 TextView,通过 NSTextStorage、NSTextContainer 和 NSLayoutManager 等旗舰类的协同工作,实现了流畅而高效的文本编辑体验。这些技术细节不仅展示了作者的精湛技艺,更是他对用户体验极致追求的体现。
🐕 lsregister: How Files Are Handled in Mac OS X
@Barney:这篇文章主要讲述了如何使用 lsregister 命令管理 Mac OS X 中的 Launch Services 数据库,这个数据库决定了文件的默认打开方式。文章详细介绍了如何查询、导出、强制重新注册文件类型、取消应用程序的注册等操作,以及如何关闭文件类型默认被隔离的功能。同时,文章也指出了清理和重建大规模数据库的方法,以及如何指定某应用打开特定文件类型或网络协议。
🐕 Sending trial notifications with provisional authorization on iOSX
@享耳先森:Push 是很好的吸引用户注意的方式,但难点是如何获取用户的授权,本文介绍了 provisional notifications
这一通知机制。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
[杭州] 淘宝 - Meta 技术团队 - iOS 工程师 / Vision Pro 工程师 (校招)
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)
老司机 iOS 周报 #281 | 2024-03-18
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
文章
🐕 Swift Predicate: 用法、构成及注意事项
@JonyFang: 文章详细介绍了如何有效利用 Swift Predicate,包括谓词的构建技巧、全局函数和实例方法的限制、支持创建多种泛型参数的谓词、线程安全和序列化等。通过具体代码示例,展示了 Swift Predicate 在不同场景下的应用,如如何处理可选值、实现线程安全的数据处理等,同时对比了 NSPredicate 与 Swift Predicate 的不同之处,强调了 Swift Predicate 在 Swift 开发中的好处和优势。
🐎 Third-party libraries acknowledgments using a Settings bundle
@Damien: 三方库可以帮助开发者更快地构建应用,但通常会包含开源协议 License,如 MIT License 等,本篇文章介绍了如何在你的应用中添加三方库致谢和开源协议的展示信息,而不需要花费太多的工作,作者介绍了一个开源项目:swift-package-list,并且提供了一键集成脚本,推荐各位 iOS 开发者也集成致谢模块,这将会让您的 App 更加合规。
🐕 What you should know about visionOS volumes before using them in an app
@EyreFree:这篇文章讨论了 visionOS 中使用 volumes 时的一些限制。作者列出了 15 个问题,包括 volumes 创建后无法改变大小,最大尺寸限制为 2 立方米,以及受用户 Window Zoom 设置的影响而改变大小。还提到了 volumes 的初始位置无法设置,手势追踪和射线投射功能不支持,且 volumes 可能无法与系统控件或评分提示交互。文章建议,如果这些限制影响到应用设计,开发者可以考虑使用 immersive space。感兴趣的朋友可以看一下。
🐕 Debug for visionOS using Xcode simulator visualizations
@Barney:这篇文章讲解了如何通过使用 Xcode 的 visionOS 模拟器中的六种主要调试模式(锚定、轴向、边界、碰撞形状、遮挡网格和表面模式)进行应用开发。这些模式有助于完成空间定位、理解定向、增强空间认知、事件检测、实现虚实交互以及精确实体定位。文章还指出了额外资源,以便于更好地运行和交互应用。掌握这些调试模式对于开发出富有交互性的空间计算应用并充分利用诸如 Apple Vision Pro 等设备至关重要。
🐢 Modding Plugins back into Xcode
@享耳先森:因 macOS 安全机制升级导致 Xcode 老的插件体系被废弃,本文写了与此相关的一些 Xcode 插件背景知识,以及提供了一些 黑魔法
让新版 Xcode 也可以加载老的插件,如果对 Xcode 插件开发敢兴趣,建议阅读。
🐎 If you ’ ve created a visionOS app with a volume, you probably did it wrong
@Smallfly:文章讨论了 visionOS 应用开发中的 volume 内容剪裁问题,指出 Apple 官方示例代码在用户更改 Window Zoom 设置时可能导致异常。Apple 工程师说是符合预期的,并提出使用 GeometryReader3D 来动态调整内容以适应 volume 大小的解决方案,文档中未充分说明这一点请开发者关注。
🐎 Vision Pro Connectivity
@极速男孩:这篇文章探讨了如何通过连接多个设备,特别是 iPhone 和 Apple Watch,来增强使用苹果 Vision Pro 的体验,以及如何利用 Multipeer Connectivity 和 Watch Connectivity 框架实现这一目标。作者同时还讨论了一些可能的应用场景,例如使用苹果铅笔进行更精确的输入、利用 Apple Watch 上的触觉反馈来反映 Vision Pro 上的操作,以及设计需要多个设备协同合作的游戏等。
🐎 Shattered Glass: Customizing Windows in visionOS
@DylanYang:本文介绍了如何在 visionOS 的开发中自定义视图的样式,详细讲述了几种视图常用的 modifier,每种样式都有给出相关的图片示例,简单易懂。
🐎 __inline__
是否会改变 local static variable 的行为?
@kemchenj:本文介绍了为什么不能将 __inline__
的作用理解为宏展开:
__inline__
并不会改变局部static
变量原本的行为,因为编译器将最终决定是否进行 inline ,编译器自然应该抹平区别。当然你如果还添加了__attribute__((always_inline))
就一定会内联。- 尽量不要在 .h 中声明
static
函数(包括NS_INLINE
函数),除非你很清楚你在做什么。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考
具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2023」,领取 2023 及往年内参
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)