Skip to content

Releases: SwiftOldDriver/iOS-Weekly

老司机 iOS 周报 #267 | 2023-11-13

13 Nov 14:08
9558f61

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

 Developer - 设计开发加速器

Apple Vision Pro 挑战赛

挑战赛地点在上海,分为两场,分别是 11 月 21、22 日,12 月 5、6 日,还没有亲自体验过 Vision Pro 的同学可以报名尝试参加,苹果会培训 空间计算 相关的知识。

文章

🐢 深入浅出 MachO

@JonyFang: 本文通过对 MachO 文件的文件格式研究,介绍了 MacOS 和 iOS 中可执行文件的加载过程,从内核中的处理一直到动态连接器 dyld 的代码分析。可以看出 MachO 与 ELF 相比实现方式各有优势,但是在内核中原生增加了对代码的签名和加密,其实 ELF 也很容易实现类似的功能,但开放系统需要更多考虑兼容性的问题,不像苹果可以大刀阔斧的改动。对于 MachO 的深入理解其实也有助于日常的相关优化,比如 Apple Store 的加密实现以及代码签名的大致原理,还有针对 dyld_cache 的处理等,其中每一项都值得去深入挖掘。

🐎 Calculating a Smooth Clock Hands Animation

@Smallfly:这篇文章分享了作者在 Widgetsmith 应用中解决时钟指针旋转角度计算问题的经历。开始是发现在 iOS17 下旋转动画问题,于是进行了多次调整,尝试通过考虑每天的开始角度和连续旋转的方案,不过依然存在问题。最终,作者采用了一种基于天数计算的方法,考虑了每天时钟指针的完整旋转次数,并通过测试验证了这一解决方案的有效性。作者提供了方案的 Demo,有相关需求的读者不妨一读。

🐕 Bad practice: not using multiline strings

@Barney:本次推荐是一篇博客,简单介绍了 Swift 对多行字符串的支持,尽量避免主动在字符串中加入 \ 使得代码越来越难以维护。文章浅显易懂还附带视频,一分钟时间就可以掌握一个小知识,值得一看。

🐕 iOS Crash 治理:淘宝 VisionKitCore 问题修复

@Cooper Chen:本文详细介绍了手淘技术团队定位 iOS 16.0 ~ iOS 16.2 WKWebView 的系统 bug 的过程,文章详细介绍了如何通过堆栈特征分析、版本对比等方式进行问题原因分析,到最终提出了详细的解决方案,并进行线上验证的过程,其中涉及的 Crash 排查思路值得开发者学习和借鉴。

🐕 iOS libMalloc 源码分析

@老峰:libMalloc 作为内存分配器,研究相关机制,对于理解操作系统内存管理有较大价值。本文作者针对 iOS 底层堆内存分配器 libMalloc 的开源版本(libmalloc-409.40.6)结合源码分析了 NanoZone、ScalableZone(tiny、small、medium、large )不同的内存机制。

🐕 Progress toward the Swift 6 language mode

@AidenRao:该文章介绍了 Swift 6 的发展和计划,目前的重点在于默认情况下避免数据竞争。逐步采用即将到来的语言 对于迁移到 Swift 6 至关重要:可以一次启用一项即将推出的功能,以逐步将代码库迁移到 Swift 6。

🐎 Things I wish someone would have told me about configuring VSCode

@anotheren:本文介绍了一些 VSCode 设置的小技巧,包括:

  • 使用 .gitignore_global 来全局忽略 .vscode 文件夹;
  • 工作区级别的插件设置;
  • 内建终端的使用;

推荐使用 VSCode 的同学一看。

🐎 Hierarchical background styles in SwiftUI

@Damien:本文内容主要讲述了如何在 SwiftUI 中获取和使用系统背景颜色。在 iOS 17 之前,我们通常需要从 UIColor 转换来获取这些颜色。但从 iOS 17 开始,可以直接通过 ShapeStyle 的实例来获取,例如 secondary,tertiary 等属性。这些背景颜色取决于当前的操作系统和颜色方案(启用了浅色或深色模式)。

🐎 Why Curiosity Is Better Than Being Smart?

@水水:为什么好奇心比聪明更重要?这篇文章作者从自己出发来告诉读者为什么好奇心很重要,聪明人的思维过程是怎样的、好奇心为什么可以让人变聪明甚至可以变的更聪明、以及如何提高好奇心。好奇的读者可以看看本文哦 ~

开源库

🌟 Grape

@Leo:一款 swift 编写的支持力模拟和可视化绘制的开源库,兼容 iOS/macOS/vision OS/watch OS. 开发者可以直接利用可视化能力绘制 Force Directed Graph(力导向图),也可以用力模拟模块来自定义实现一些能力。

音视频

NSSpain XI (2023)

@含笑饮砒霜:NSSpain 是一个知名的 iOS 开发者会议,在 NSSpain XI (2023) 中,涵盖了包括应用程序设计、性能优化、新的开发工具、Swift 编程语言的最新进展以及与 Apple 生态系统相关的多个主题,这个会议为开发者提供了与同行建立联系和交流的绝佳机会。

内推

重新开始更新「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 周报 #266 | 2023-11-06

06 Nov 02:15

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新手推荐

🐕 2023 年每个软件开发者都必须知道的关于 Unicode 的最基本的知识(仍然不准找借口!)

@xuyafei86:本文使用风趣幽默的语言和生动的配图介绍了字符串编码的发展和 Unicode / UTF-8 的 “基本知识”,可以帮助读者更深入的理解 Swift 中字符串的设计。感兴趣的同学可以阅读原文了解。

文章

🐕 视频号直播:如何进一步降低功耗占用?

@莲叔:这篇文章从一个简单的问题出发:同样的直播间,在有点赞动画时的帧率和 gpu 占用显著高于无动画时,一步步讲解了 iOS 系统渲染的原理以及推导了问题的原因,给出了解决办法(通过 iOS 15 提供的新的 CAAnimation 的 API)。之后进一步分析了系统方案的原理,并且给出了将动画帧率控制从 CAAnimation 动画扩展到 UIView block 动画以及 UIScrollView 动画中,实现整体更稳定的帧率,方案很完整。另外,解决问题是一方面,文章更有价值的点还是对于 ios 的渲染原理做了比较详实的描述,推荐大家阅读。

🐕 深入理解 MachO 结构与运行时系统

@Barney:本篇文章详细介绍了 MachO 的结构。前半段主要是结构分析,后半段着重描述 OC 相关数据。理解这些有助于日常写出更高性能的代码,可以反复仔细阅读。

  1. LINK EDIT、符号表、Fishhook 原理介绍。
  2. OC 相关数据的详细介绍
  3. 探究这些的意义

🐎 Switching Build Systems, Seamlessly

@Smallfly:本文主要分享了 Spotify 团队无缝切换构建系统到 Bazel 的过程。随着移动应用程序的规模越来越大,他们的代码库年均增长率超过 30 %,开发者的幸福感和生产力显著下降。通过迁移到 Bazel,一个超大工程原本使用 Xcode 构建耗时超过 45 分钟,迁移后时间缩短到少于 10 分钟。这个过程经历多套构建系统并存以及层层的验证,最后实现能完全由 Bazel 构建 iOS 客户端。

🐢 How async/await works internally in Swift

@EyreFree:文章主要探讨了 Swift 中 async/await 的内部工作机制。开头解释了 Swift 的内存安全目标,及并发问题如何影响这个目标。随后,文章深入探讨了 GCD 如何处理并发,以及它的局限性。文章强调了 Swift 引入 async/await 的重要性,例如用以改善并发管理,减少未定义行为等。最后,概述了 async/await 的历史,以及如何利用它来简化并发代码的编写,推荐阅读。

🐢 Working With UIViewRepresentable

@极速男孩:这篇文章中,他探讨了在 SwiftUI 中使用 UIViewRepresentable ,NSViewRepresentable 或 UIViewControllerRepresentable 来实现 SwiftUI 和 UIKit/AppKit 之间状态通信的几个挑战和解决方案。主要点包括:

  1. 根据 SwiftUI 状态变化更新 UIView 时,只更改必要的 UIView 属性。
  2. 对于 UIKit 变化影响的 SwiftUI 更新,应异步执行以避免运行时警告。
  3. 通过创建一个 MapView 包装器和一个 NSTextView 包装器为例,解释了如何在更新方法中仅在必要时更新视图,以及如何缓存并比较值以避免不必要的更新。
  4. 如何通过修改绑定或调用闭包来从 NSView 向 SwiftUI 通信事件。

🐕 Fatbobman ’ s Swift Weekly

@老驴:Fatbobman 在结束了 100 期的摸鱼周报之后新开了个新坑,叫 Fatbobman ’ s Swift Weekly,目前已经出到了第三期。Fatbobman 的周报和老司机的周报比较类似,会推荐一些 Swift,iOS 开发的相关内容,但是提供了双语内容。有兴趣的话可以关注或者订阅一波。

🐕 记一个诡异的 TCP 挥手乱序问题

@Crazy:本文是一篇网络底层的讲解文章,内容有一定深度,并且给大家提供了很多解决这种疑难问题的思路。作者从一个挥手乱序问题开始,告知了大家问题出现的原因:四次挥手中,由于 fin 包和 ack 包乱序,导致等了一次 timeout 才关闭连接。之后又从这个结果开始介绍解决问题的思路与过程,其中包括问题复现试验,内部源码分析,修改内核配合测试,最后确认问题位置。本文最后更是讲解了 close() 下的 tcp 状态转移问题。本篇文章涉及了许多 TCP 的源码与底层知识,读起来会偏久,重要的是学会作者处理这种疑难问题的思路与方法。

音视频

🐕 Swift Connection 2023 - Hidde van der Ploeg - How to Make Your App Look Like You've Hired a Designer

@Cooper Chen:这个视频是 Swift Connection 2023 关于普通开发者如何在没有设计师的情况下,遵循一些设计规范来保证 App 的设计感,其中包含以下几点:

  • 定义明确品牌(Define a clear brand)
  • 设计是一种感觉(Design is how it feeling)
  • 保证设计的一致性(Consistence)
  • 保证用户的关注点(Keep focus)
  • 使用层次结构(hierarchical)
  • 给 UI 保留空隙(Give sapce to breath)

这个视频对于独立开发有着很好的参考价值,能帮助开发者更好的设计自己的 UI 界面。

内推

重新开始更新「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 周报 #265 | 2023-10-30

30 Oct 03:11

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

iOS & iPadOS 17.2 Beta & Xcode 15.1 Beta 2 Release

上周苹果发布了 iOS & iPadOS 17.2watchOS 10.2Xcode 15.1 等系列 Beta 版本的更新。较为重要的信息如下:

  • SwiftUI 新增了 API _logChanges() 方便开发者在 Debug 下打印 SwiftUI 的变更。与 _printChanges() 区别仅在于 _logChanges() 会将日志也打印到系统控制台中。此 API 对所有 iOS/iPadOS/watchOS 等都有效。

  • 对使用 Xcode 15.0 构建包含 swift 代码的 App 会较老的 MAC 版本 (10.13) 启动时崩溃,workaround 方案是添加 $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/macosx/libswiftAppKit.dylib 到 Other Linker Flags 中,此问题在 15.1 Beta 中已修复。详见:swift/issues/68163

文章

🐎 Bad practice: not using Phantom Types

@Damien:这篇文章讨论了在 Swift 编程中使用虚类型(Phantom Types)引发的错误。作者首先构造了 2 个示例对象,使用虚函数并且导致了错误的行为。随后提出了改进的方案,从而避免了错误的代码行为,想了解 Swift 虚函数感兴趣的同学不妨一读。

🐎 Designing for spatial computing: from iOS and iPadOS to visionOS

@Smallfly:这篇文章介绍了苹果的 visionOS 以及它在空间计算领域的重要性。文章强调了设计师和开发人员需要了解空间设计的基本原则,以及如何将应用程序从 iOS/iPadOS 平稳地过渡到 visionOS。文章还介绍了 visionOS 应用程序的核心结构,包括窗口、体积、标签栏、侧边栏、装饰、菜单和弹出窗口、以及模态视图。最后,文章强调在从 iOS/iPadOS 过渡到 visionOS 时,需要考虑应用程序的核心功能,并将其适应空间计算范式,而不仅仅是简单地将应用程序移植到新平台。

🐎 Being a good citizen in the land of SwiftSyntax

@zvving:作者使用 SwiftSyntax 依赖管理的实例,详细解释了如何制定更加灵活的主版本依赖声明,从而规避由与第三方库的依赖关系引起的冲突。同时,他建议通过将核心库和可选库分拆,来防止不必要的编译开销。这些思路为 Swift 库的开发者提供了有益的参考。

🐎 Apple ’ s use of Swift and SwiftUI in iOS 17

@JonyFang:通过 iOS 内置应用程序使用的编程语言,分析到 iOS17 的版本过程中 Swift、SwiftUI 的覆盖比例。通过分析结果可以看到:Objective-C 仍然是 iOS 的核心,并被大多数应用程序直接或间接使用。Swift 和 SwiftUI 的采用持续增长,而 Objective-C、C 和 C++ 的份额逐渐减少。

🐎 The Care and Feeding of Developer ID

@水水:这个链接集中记录了对于开发者 ID 签名身份方面会遇到的问题,以及一些注意事项和 Tips。这里还介绍了如何备份你的私钥以及如果你没有独立备份你的开发者 ID 签名身份,如何从 Mac 的常规备份中恢复它。读者可以收藏此链接,可以作为后续关于签名方面的问题参考 ~

工具

🐎 Apparency - The App That Opens Apps

@J_Knight_:介绍了一个可以查看 Mac 应用信息的 Mac 应用:Apparency。具体可以查看的信息是:使用的 framework,Info.plist,macOS version info,identifiers,document types 和 URLs 等等信息。

音视频

Matthew Massicotte - The Bleeding Edge of Swift Concurrency

@含笑饮砒霜:这是一个探讨 Swift 并发编程主题的视频,并发编程是一个涉及异步操作和并行处理的领域。该视频将介绍 Swift 中的 async/await 机制和 actor 模型,并讨论如何避免在引入这些机制时可能出现的竞争条件和死锁等陷阱。它的目标是帮助观众了解如何在编写并发代码时避免常见的陷阱和错误,从而编写出更可靠、高效的代码。

内推

重新开始更新「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 周报 #264 | 2023-10-23

22 Oct 15:14
4c244f6

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

文章

🌟 🐎 云音乐如何「搭」出新首页

@JonyFang:本文介绍了云音乐如何通过可视化搭建系统支撑新版首页这样的核心场景,提出一套基于性能、动态化和精细化运营角度的解决方案。文章还探讨了动态化能力的重要性、各种动态化方案的能力和性能表现、针对不同业务诉求做出合适选择的必要性。

🌟 🐕 【iOS】一段防护代码引发的内存风暴

@Cooper Chen:本文详细描述了腾讯音乐在一次防护代码导致的 OOM 问题上进行排查的过程,不仅详细解释了内存分析问题从基建到详细手段的步骤,也从另一个侧面说明了 Runloop 和 Autoreleasepool 的关系。值得一提的是,这个 OOM 问题的原因是 CF 不同版本在 __CFRunLoopDoObservers 里面遍历 observer 的实现方式不同导致,采用数组方式的高版本系统会出现上述的 OOM 问题,这对于安全气垫相关需求开发同学有着极高的参考价值。

🌟 🐢 Swift Parameter Packs

@享耳先森:Swift 5.9 已经发布,除了广为人知的 Macros,还有一项比较少人提到的是 Parameter Packs,本文介绍了 Parameter Packs 的三种使用场景,如想更深入的理解 Swift 5.9 的更新,建议阅读另一篇:What’s new in Swift 5.9?

🐕 Xcode 15以下版本调试 iOS 17 设备

@含笑饮砒霜:这是在 Apple 开发论坛上讨论的,关于无法使用 Xcode 14.x 版本调试 iOS 17 设备的问题。最终找到一个行之有效的可行路径。先在终端中运行 defaults write com.apple.dt.Xcode DVTEnableCoreDevice enabled,然后重新启动 Xcode 14.x,iOS 17 设备将显示在 Xcode 中,进而可以像往常一样运行和调试应用程序。

🐎 Changes to URL string parsing in iOS 17

@Damien:在 iOS 17 系统中,URL 类中的 init(string:) 方法的行为和 URLComponents 的解析 URL 方法进行了对齐,使其解析行为发生了变化,新版本将会产生对无效字符进行编码,然而这一行为在 iOS 17 以下是不存在的,如果大家对 URL 类中产生的结果较为敏感,建议确认一下变化是否对当前的 App 是否有预期之外的影响。

🐎 A New Approach to Testing in Swift

@kemchenj:Swift 团队于近日发布了 swift-testing 预览版,旨在替代 XCTest 成为新的官方测试框架,将 Swift 的特性以及这些年测试框架的发展应用到这个新的库里。

XCTest 作为 Apple 平台的测试框架,最早在 1998 年编写并且大量使用 Objective-C 的动态特性,包括动态消息传递,NSInvocation 和 Objective-C Runtime 等。

当 Swift 诞生时,也顺理成章地继续沿用 XCTest,对 XCTest 进行了一系列拓展以便支持 Swift,但这始终是一个 1998 年编写的框架,并且与 Objective-C 重度耦合,很多功能与 Swift 天生冲突,所以需要一个全新的框架作为继任者。

🐎 直播流⻚⾯内存优化⽅案

@JonyFang:上下滑过程中高清直播背景图带来的内存问题相关优化,有类似诉求,解决方案可做参考。

🐎 Android 和 iOS 渲染架构差异对比,孰胜孰负?

@Crazy:本文是一篇科普类文章,主要对比了 Android 与 iOS 两个系统在绘制原理上的区别。文章开篇先简单的讲解了 SurfaceFlinger 和 backboard 的区别,通过对比两种渲染方法后引出 OpenGL 与 Metal 和 Vulkan 的区别,并简单的介绍了关于 OpenGL 的实现与缺点。文章的内容相对简单,没有很多的实现逻辑与长篇大论的代码,只是让大家简单的了解下双端绘制逻辑上的不同。

代码

🐕 SwiftUIViewDebug

@老峰:SwiftUIViewDebug 是 SwiftUI 调试工具库,可以使将调试信息编码为 Swift.Data,然后转换为 Swift.String,最后以可读的 JSON 格式来展示视图信息。

swift-macro-testing

@kemchenj:由 PointFree 开发的一款 macro 测试库,对比 SwiftSyntax 提供的测试函数提供了更多功能,例如更丰富的诊断信息,自动填充测试用例的 fix-it 等等,对于 macro 的编写和测试都有非常大的帮助。

内推

重新开始更新「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 周报 #263 | 2023-10-16

16 Oct 02:16

Choose a tag to compare

ios-weekly

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

ICP 备案上线

国庆节前夕,苹果审核商店也正式上线了 ICP 备案。目前新 APP 需要填写备案号才能提交审核;老 APP 目前不填备案号也能正常提审(预计是明年 4 月强制执行)。

中国工业和信息化部(MIIT)要求 App 必须具备有效的互联网信息服务提供者(ICP)备案号。此外,游戏 App 必须取得网络游戏出版物号。图书和报刊杂志 App 必须持有中国国家新闻出版署(NPPA)颁发的《网络出版服务许可证》。包含宗教内容的 App 必须持有中国国家宗教事务局(NRAA)颁发的《互联网宗教信息服务许可证》。新闻 App 必须持有中国国家互联网信息办公室(CAC)颁发的《互联网新闻信息服务许可证》。如果你已经或计划在中国大陆的 App Store 中提供上述类型的 App,则必须提供相关信息和证明文件。

Xcode 15.1 Beta Release Note

Xcode 15.1 Beta 版本发布,除了常规的新 SDK 发布,这次一条相对重要的信息是,从 15.1 开始,X86/64 的 芯片组(也就是 Intel CPU)不再能够开发 VisionOS ,必须使用 silicon 系列芯片组(俗称 M 系列),15.0 的时候还是支持 X86/64 的,此次放弃 X86/64 令人担忧苹果后续对老机型的支持。

文章

🐕 Migrating Ice Cubes to the SwiftUI Observation framework

@AidenRao:这篇文章介绍了作者将他的开源 Mastodon 客户端 Ice Cubes 迁移到了新的 Observation framework 的过程。作者分享了一些关键点:

  • 迁移并不复杂,作者只花了几个小时就完成了。
  • 迁移修复了一些 bug,并不会引入新的问题。
  • 性能改进明显,值得投入。

作者认为 Observation framework 是 SwiftUI 的一项重大改进,它简单易用,并且消除了以前数据流中的许多令人头疼的问题

🐕 Dismiss keyboard when return is pressed in a multiline SwiftUI TextField

@Smallfly:这篇文章主要介绍了在 SwiftUI 中如何实现多行文本框的回车键提交和键盘自动收起功能。作者使用 FocusStateonChange 修饰符来监听文本变化,实现了多行文本框的提交和键盘自动收起功能,并将其封装为了一个可重用的自定义 view modifier。如果你正在开发 SwiftUI 应用,并且遇到了类似的问题,这篇文章可能会对你有所帮助。

🐕 Interoperability: Swift ’ s Super Power

@Cooper Chen:Swift 作为现代的语言,在设计选择上使其展示了灵活性和兼容性且不需要以可用性为代价的特性,而使 Swift 专注于与其他语言的本地互操作性,成为 Swift 构建丰富的本地应用的一个重要目标。同时 Swift 的互操作性工具库使其成为在现有平台上构建丰富的本地应用程序和库的有力语言,并以其改进的内存安全性和强大的易用性为 C 和 C++ 提供了一个很好的替代方案。本文介绍了在 Swift 中使用 C++ Interop 和 C Interop 在 Windows 平台支持 COM 模式,同时也改进了 COM 对于 Swift 的支持,通过在 Windows 平台以及对 Swift 互操作性方法的探索,为开发者提供了一个良好的基础,让我们了解 Swift 的互操作性工具如何允许我们构建可以访问平台 API 的跨平台应用程序。

🐢 深入理解 iOS Jetsam 机制,助力提升 Flotsam 召回率

@xuyafei86:本文将深入介绍 iOS 系统中的 Jetsam 机制,探讨其原理和作用。Jetsam 机制负责在内存不足时终止进程以释放内存资源,了解 Jetsam 的工作原理和相关策略,可以帮助开发者优化应用程序的内存使用,提高 Flotsam 召回率。
Flotsam 是快手定义的指标,是指 iOS 上未被监控捕获到的前台异常退出,包括但不限于由于内存溢出引起的退出。与 Jetsam 不同,Flotsam 更多地关注那些零碎、尚未明确归因的异常退出。了解 Jetsam 的工作原理和相关策略,对开发者来说,不仅有助于优化应用内存使用,还能显著提高 Flotsam 召回率,进一步提升应用的稳定性和用户体验。

🐎 Swift 中闭包底层原理探索

@J_Knight_:本文作者使用代码实例并利用导出的 SIL 和 LLVM 文件内的代码(附上了详细的代码注释)详细介绍了在 Swift 中闭包捕获单个值和多个值的原理。

🐢 The Absolute Minimum Every Software Developer Must Know About Unicode in 2023

@水水:本文介绍了作者认为 2023 年每个软件开发人员需要知道的关于 Unicode 的一些基本知识点如下

  • 什么是 Unicode
  • Unicode 有多大
  • Unicode 目前分配情况
  • Unicode 作为私人用途的有哪些
  • UTF-8 是什么
  • 为什么显示 �、Emoji 长度是怎么计算的

...... 等一系列的问题进行了整理和解释 ~

代码

🐕 @Model for CoreData

@极速男孩:Apple 在 2023 年 WWDC 上发布了 Swift 数据持久化框架 SwiftData。本文主要介绍了 ManagedModels 这个库,他为 CoreData 提供类似 SwiftData 的 API ,但不需 iOS 17+ 版本。主要区别包括:ManagedModels 中的类需明确从 NSManagedObject 继承,使用 @fetchrequest 而非 SwiftData 的 @query 。文章提供了使用 ManagedModels 的代码示例,以及两个示例程序。

内推

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

[上海 / 北京] 西瓜视频 - iOS

[北京] 百度网盘 - 基础架构 / 业务 - iOS/Android/FE

[上海 / 杭州 / 北京] TikTok - 短视频 - iOS/Android/TL

[广深] TikTok 直播 - 社交互动团队 - iOS/Android

[杭州] 淘宝 - 终端平台 - iOS/Android/C++

[广州] 微信公众号 - iOS

[北京] 快手 - 本地生活 - iOS

[上海 / 北京] MiniMax - iOS

[北京] 知乎 - 会员业务 - iOS

[上海] 扫描全能王 - iOS

[深圳] 手机 QQ - 终端架构 - iOS - T10/T11

具体信息请移步: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 周报 #262 | 2023-09-25

25 Sep 03:25

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

WebP 堆缓冲区溢出 安全漏洞

23 年 9 月 12 日 Libwebp 公布了一个高危漏洞 CVE-2023-4863,评级为 Critical(8.8) 。受影响方众多,包括 Chrome,Firefox 等浏览器;集成 libWebP 的客户端 APP,以及包括部分版本的 Electron、flutter 。列举部分受影响的组件:

  • webP(< 1.3.2),推荐直接升级至 1.3.2
  • Electron(< 26.2.2/25.8.2/24.8.3/22.3.24)
  • flutter(< 3.13.4)

由于漏洞已被公开,有被利用后攻击的风险(具体攻击方式不便展开),大家可以视项目情况进行升级。

文章

🐕 iOS 点九图 NinePatch 解析

@Barney:文章主要介绍了 iOS 点九图的应用实战。有原理介绍也有代码,是非常具体的实践,值得学习。

  • 点九图制作生成。
  • PNG 文件格式介绍和代码实践。

🐕 开箱即用-移动网络 IPv6 浓度检测工具

@含笑饮砒霜:本文介绍了一款移动网络 IPv6 浓度的检测工具,旨在推动 IPv6 技术的广泛应用。本文详细说明了该工具的背景、使用方法,以及如何通过抓包和数据分析来评估移动应用的 IPv6 流量占比,进而指导网络改进工作。此外,本文还提供了其他诸如手机抓包、Safari 调试等检测方法,以帮助读者更好地理解和推广 IPv6 技术在移动网络中的应用。

🐎 Shake to undo in a SwiftUI app

@zoeGuo:这篇文章介绍了如何在 SwiftUI 应用中实现"摇一摇撤销"的功能。作者从怎么在 SwiftUI 中使用 UndoManager ,到具体如何在 SwiftUI 中实现"摇一摇"手势,给予用户适当的提示保证数据不会被误操作丢失,以及监听 undo 操作的发生来正确处理逻辑,提供了使用 SwiftUI 实现"摇一摇撤销"功能的详细步骤和思路。作者最后展示了将所有这些逻辑和 UI 实现封装至一个可重用的修饰符中,整个功能的使用代码变得极其简洁。

🐢 How to build an iOS Live Activity

@anotheren:这是一篇新手向的文章,从创建、UI 展示、数据更新等各方面给出了如何构建你的第一个“ Live Activity ”(实时活动) 的全流程指导,是时候将实时活动加入你的应用了。

🐕 Swift Macro: Revisited - The Strengths and Essence

@AidenRao:这篇文章详细探讨了 Swift 宏的优势和本质。

  • 通过在编译时转换程序员的代码来生成代码。具备类型检查和语法树检查能力,能够限定宏的使用场景,还可以明确宏接受的参数类型。
  • 对于独立宏,它们可以影响使用处的控制流并共享词法范围。
  • 对于附加宏,它们可以将现有成员变量,转换成另一种形式来扩展该类型,并通过添加访问器来重写属性。扩展内容不仅带来新的行为,而且共享扩展点的”命名空间”。还值得注意的是,向存储属性添加访问器也会将其语义从存储属性更改为计算属性。

相比 Swift 中现有的代码重用方法,Swift Macro 通过拥抱不同的设计理念,提高了语言的代码可重用性。

🐕 Swift Macro: Revisited - Traps and Pitfalls

@邦Ben

该文章对 Swift 宏使用过程中会出现的一些陷阱问题进行了示例说明,例如:

  • 宏里面如果包含了 return,在 for 循环里用,展开会直接 return 而不是继续执行
  • 定义命名冲突,其他框架的 propertyWrapper 导致的冲突,或者是 lazy 都会冲突,重复访问等
  • 语义冲突

解决方案文中也给了建议:

  • 宏名字清晰,如果不允许在某个场景使用的话,可以写清楚
  • 将宏扩展放在闭包内进行保护
  • 引用其他库的时候尽量保证命名唯一
  • 宏内部不进行定义变量
  • 提供重命名的方法
  • 提供 ignore 方法
  • 提供对应的使用说明文档

展开后的问题和你在 OC 中用到宏也是会遇到类似的场景,大规模以及复杂场景使用的时候,尤其需要注意这类异常 case

🐎 iPhone 15 Screen Sizes

@ChenghzhiHuang:本文总结了 iPhone 15 系列的屏幕信息,包括 StatusBarHeight、SafeArea、屏幕分辨率等。需要适配的同学可以自行翻阅。

工具

🐎 Flutter 最优秀动画库「完全商业化」,Rive 2 你全面了解过吗?

@CrazyCoderShi: Rive 动画在 Flutter 领域类似于 Lottie 在 iOS 和 Android 上的地位,同样提供了在线编辑器;当然了,Rive 也是支持全平台的,本文带你详细入手 Rive 动画,从制作到代码联动。

代码

🐎 ExampleKit

@Cooper Chen:这个开源工程提供了在 Swift Playgrounds 中创建自己的库并进行发布管理,其中详细介绍了如何创建模板、源控制等操作,这对于需要进行相同代码不同平台开发的开发者来说是一个实用的工具。

🐎 SnapshotTesting

@J_Knight_:提供了一个开源的用于 Swift 开发的快照测试(Snapshot Testing)框架。除了支持对 UIView 进行快照以外, 还支持其他数据类型以及在不同设备型号上的快照。

内推

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

[北京] 百度网盘 - 基础架构 / 业务 - iOS/Android/FE

[上海 / 杭州 / 北京] TikTok - 短视频 - iOS/Android/TL

[广深] TikTok 直播 - 社交互动团队 - iOS/Android

[杭州] 淘宝 - 终端平台 - iOS/Android/C++

[广州] 微信公众号 - iOS

[北京] 快手 - 本地生活 - iOS

[上海 / 北京] MiniMax - iOS

[北京] 知乎 - 会员业务 - iOS

[上海] 扫描全能王 - iOS

[深圳] 手机 QQ - 终端架构 - iOS - T10/T11

具体信息请移步: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 周报 #261 | 2023-09-18

18 Sep 08:33

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

App Store submissions now open for the latest OS releases

Xcode 15 RC 版本已经正式发布,目前 AppStore 已经可以接受使用 RC 版 Xcode 构建的产物了,同时苹果预告将在 2024 年 4 月起禁止使用 Xcode 14 提交新的产物。

文章

🐎 网易云音乐 Tango 低代码引擎正式开源!

@Crazy:本文主要介绍了网易云开发的一款快速构建低代码平台的低代码设计器框架 Tango,该框架主要用于简化前端系统的搭建流程。相较于基于私有 Schema 的低代码搭建方案,Tango 的基于源码 AST 转换方式可以做到面向以源码为中心的应用搭建场景,并且具有更好的扩展性,原有组件亦可以无缝低成本接入。现今 Tango 已经开源,大家可以去 GitHub 直接查看源码以及应用文档。

🐎 Symbolicating SwiftUI (and any Apple Framework)

@邦Ben:Apple 为大多数系统框架(UIKit,AVFoundation 等)提供了符号,但其他如 SwiftUI,Combing 等则没有提供,那么依赖这个进行符号化的工具,这无法正确的显示。文中作者通过参考 Libc 中开源的代码 backtrace.c 中的实现,并且改进了方法进一步实现了获取完整符号的方法,在做相关内容的同学,可以参考一下。

🐎 Understanding Container Background for Widget in iOS 17

@享耳先森:在即将发布的 iOS 17 中,Apple 扩展了 Widget 的使用范围,为了适应这一变化,引入了 containerBackground(for:alignment:content:) 这一 API。如果使用 Xcode 15 编译项目而 Widget 没有适配这一 API 将会报错,文章解释了这一 API 的作用及用法。

🐢 A Day in the Life of a SwiftUI View

@Smallfly:这篇文章是 SwiftConf.to 大会上的演讲稿。主题是关于作者所理解的 SwiftUI 背后的思维模式。作者通过演示如何将 SwiftUI 代码转化成视图树(View Tree)和渲染树(Render Tree)的方式来分享他的理解。

演讲内容包括以下要点:

  • 如何将 SwiftUI 的代码转化成视图树和渲染树。
  • 视图树是短暂的,而渲染树是持久的,它们之间的区别和重要性。
  • 如何处理异步加载数据,以及在渲染树中使用任务(task)来实现数据加载。
  • 对 SwiftUI 布局系统的讲解,包括如何使用 resizableaspectRatio 来控制视图的大小和比例。
  • 使用环境(Environment)和偏好设置(Preferences)在视图树和渲染树中传递信息的方法。

文章中提到了一些 SwiftUI 的内部工作原理和技巧,以及如何更好地理解和利用 SwiftUI 进行应用程序开发。这篇文章可能对希望深入了解 SwiftUI 的开发者有所帮助。

🐎 我给 iOS 系统打了个补丁——修复 iOS 16 系统键盘重大 Crash

@JonyFang:因键盘 Crash 问题,通过逆向分析定位到 iOS16 系统键盘 tryLock 时的系统 Bug,提供了一套可修复的方案。借助 +(void)load 方法在 App 启动时执行的特点实现对 -[UIKeyboardTaskQueue tryLockWhenReadyForMainThread] 方法的 Hook,仅在 iOS 16 的 Arm64 架构上生效。

工具

Introducing swiftly, a new Swift toolchain installer and manager

@kemchenj:Swiftly 是一个 Swift 的版本管理器,类似于 nvm,rvm,rustup,可以用来快速安装各个版本的 toolchain 并且进行切换,作为 SSWG 的项目正在孵化当中,以后有望成为官方首选的 Swift 安装方式。

代码

SwiftDataKit

@含笑饮砒霜:SwiftDataKit 是 SwiftData 的扩展库,它使 SwiftData 开发人员可以访问 SwiftData 元素背后对应的 Core Data 对象。由于 SwiftData 框架功能尚不完善,开发人员仍需通过调用 Core Data 的方法来实现一些高级功能。使用 SwiftDataKit,可以让开发人员在某些场景下避免重复创建 Core Data 版本的 Data Model 和 Stack。更多详情可参阅 SwiftDataKit:让您在 SwiftData 中使用 Core Data 的高级功能

音视频

🐎 Introducing a Memory-Safe Successor Language in Large C++ Code Bases - John McCall - CppNow 2023

@老峰:视频主要讲了 Apple 生态过去的编程语言(C/C++/Objective-C/Objective-C++)存在内存安全的问题,以及后继者 Swift 如何解决这些问题,为什么要使用 Swift 等。

🚧 Swift TO

@zvving:Swift TO,一个源自加拿大的 iOS 社区组织,尽管面临严峻的运营挑战并即将结束运营,但依旧保持开放性,将最近的技术分享视频公开,欢迎感兴趣的朋友通过视频参与交流学习。

内推

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

[北京] 百度网盘 - 基础架构/业务 - iOS/Android/FE

[上海/杭州/北京] TikTok - 短视频 - iOS/Android/TL

[广深] TikTok 直播 - 社交互动团队 - iOS/Android

[杭州] 淘宝 - 终端平台 - iOS/Android/C++

[广州] 微信公众号 - iOS

[北京] 快手 - 本地生活 - iOS

[上海 / 北京] MiniMax - iOS

[北京] 知乎 - 会员业务 - iOS

[上海] 扫描全能王 - iOS

[深圳] 手机 QQ - 终端架构 - iOS - T10/T11

具体信息请移步: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 周报 #260 | 2023-09-11

11 Sep 06:20

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新手推荐

🐕 Hidden feature: static properties

@极速男孩:Swift 的静态属性具有一项隐藏特性:它们是隐式懒加载的,只在首次访问时初始化。这意味着,即使应用中有许多静态属性,它们也不会在应用启动时全部初始化,从而优化性能。若尝试显式地用 lazy 关键字声明静态属性,Swift 会报错,因为静态属性已经是懒加载的。

文章

🐕 C++ 知识体系总结:语言核心与代码工程

@莲叔:这篇文章初看下属于谁看了必然会收藏但大概率不会看的文章。但看完后又给我很不一样的体感,虽然文章较长而且涉及的点比较多,但并不是单纯追求大而全,而是围绕 C++ 一些常用的新特性进行了介绍,根据我的经验在现代 C++ 的项目里几乎都会用到里面介绍的特性,同时每个特性都包含示例代码帮忙理解,大幅提高了学习的效率。对于工作中需要和 C++ 打交道的同学来说是很不错的资料。

🐎 The new Swift section in binaries built with Swift 5.9 and Xcode 15, __TEXT/__constg_swift

@kemchenj:Swift 在运行时经常需要遍历查询类型的元信息,但 Swift 编译链接后的二进制产物里,类型的元信息是各自分散的,导致启动时会频繁触发 page fault,并且 CPU 缓存命中率也会下降。

在即将发布的 Swift 5.9 里,编译器会将这些信息集中存放到各自的 Section 里,改善前面提到的问题。

🐕 一线大厂程序员的考公上岸心得

@老驴:一篇和我们之前推荐的很不一样的文章,是一位之前在微软的 Edge 的同学,后来如何考公务员的访谈。在大家都不容易的时间里,算是比较有意思的经验分享。当然,这不代表老司机的立场,只是做一个分享,能让大家看到一些不一样的视角。

🐕 Xcode 15 iOS 17 小组件适配必看:Widget needs to adopt container background

@anotheren:在使用 Xcode 15 后,如果你的项目代码包括了小组件,那么就会收到 "Widget needs to adopt container background" 的提示,要求进行相关适配。本文介绍了相关适配的要点,推荐阅读。

🐕 Develop and test OpticID for Vision Pro

@EyreFree:Optic ID 是一种全新的安全生物识别系统,用于对用户进行身份验证,它的调用方式和在 iOS App 中使用 FaceID 类似。在这篇博文中,作者解释了开发者应该如何利用 Optic ID 进行身份验证以及如何在 Vision Pro 模拟器中测试 OpticID,感兴趣的同学可以阅读原文进行了解。

🐕 实战总结|抽丝剥茧,记一次神奇的崩溃

@xuyafei86:本文详细回放了一个崩溃案例的分析过程,感兴趣的同学可以阅读原文了解。

  1. 回顾了 C++ 多态和类内存布局相关知识,了解原理后查看内存让我们看到了更多代码内部的细节。
  2. 回顾了 pc 指针的含义并了解了更多 arm 异常处理机制,解释了一些日常认为理所当然的结论背后的原理。
  3. 回顾了内存屏障相关知识,并构造了 demo 对理论分析进行了实践验证。

工具

🐎 京东京喜 iOS 包体积分析工具

@Damien:一款用于分析 iOS IPA 包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看。工具京东京喜团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加效率的优化包体积问题。

代码

🐎 add a label to the outer loop and use break with the label

@zoeGuo:在 Swift 中使用嵌套循环的时候,你可能会有这样的需求:同时跳出内部和外部的循环;这个时候就可以为外层循环添加一个标签,在需要 break 的时机,选择 break 这个标签。

内推

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

[杭州] 淘宝 - 终端平台 - iOS/Android/C++

[广州] 微信公众号 - iOS

[北京] 快手 - 本地生活 - iOS

[上海 / 北京] MiniMax - iOS

[广深] TikTok 直播 - 社交互动团队 - iOS/Android

[北京] 知乎 - 会员业务 - iOS

[上海] 扫描全能王 - iOS

[深圳] 手机 QQ - 终端架构 - iOS - T10/T11

具体信息请移步: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 周报 #259 | 2023-09-04

04 Sep 02:58

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

文章

🐕 一文入门最热的 LLM 应用开发框架 LangChain

@zoeGuo:LangChain 是一个用于开发由语言模型驱动的应用程序的框架。笔者认为 Langchain 解决了现在开发人工智能应用(以 GPT 模型为例)的一些切痛点:数据滞后、token 数量限制、不能进行联网、不能与其他数据源链接。文章逐一介绍了 LangChain 以下组件的使用:Models(模型)、Prompts(提示词)、Indexes(索引)、Chains(链)、Agents(代理)。简单示例了用 LangChain 加载 OpenAI 的模型,完成一次问答、通过谷歌搜索并返回答案、对超长文本进行总结、构建本地知识库问答机器人等几个 LangChain 实战。

🐕 Adding teachable moments to your apps with TipKit

在今年的 WWDC 中,苹果推出了 Tipkit,开发者可以通过 Tipkit 快速向应用中添加例如新手引导、新功能介绍等功能,并且 Tipkit 可以通过 iCloud 跨设备显示。本文是 Tipkit 使用的一个实战教程,想要了解这个新功能的同学,可以跟着示例快速实践并掌握如何使用。

🐕 Mastering Thread Safety in Swift With One Runtime Trick

@莲叔:作者首先简单的介绍了多线程开发中最典型会遇到的问题,然后介绍了在苹果平台中性能最好的锁:os_unfair_lock,同时介绍在了 Swift 中如何使用它。之后作者演示了如何通过 propertyWrapper 来更通用的实现原子化的变量,并搭配一个比较冷门的 _modify 方法来规避常见赋值可能因为 get+set 组合不原子化的坑。

🐕 Improve the build times of your SPM Packages and your apps

@含笑饮砒霜:本文主要涉及如何缩短 SPM(Swift Package Manager)包和应用程序的构建时间,以提高开发效率。以下是主要要点:

  • 测量和改进构建时间:文章开始强调了测量构建时间的重要性,并建议在测试前 / 测试后使用相同的环境来进行测量。它区分了两种构建类型:

    • Clean Builds(干净构建):完整重新编译整个代码库,无论是否有更改
    • Incremental Builds(增量构建):仅编译自上次构建以来发生更改的代码
  • 使用时序摘要和最近的构建时间线:文章介绍了 Xcode 提供的两个工具,用于测量编译时间和构建时间线,以帮助识别需要优化的区域

  • 改进 Xcode 项目中的编译时间:文章提供了一些建议,包括启用警告以标识编译时间过长的代码、明确指定类型以减少编译时间等

  • 改进 SPM 包中的编译时间:文章介绍了如何通过在 SPM 包中应用相同的优化来减少构建时间,以及如何使用自定义规则来规范代码以提高编译效率

  • SwiftLint 规则:文章提到了一些 SwiftLint 规则,如 explicit_init 和 explicit_type_interface,可以帮助简化代码并可能减少构建时间

总的来说,这篇文章提供了关于如何提高 SPM 包和应用程序构建效率的详细指南,包括测量、警告启用、类型明确指定等技巧和建议。通过实施这些优化,开发团队可以更快地构建和测试他们的代码。

🐕 为现有 App 及 API 架构实现 End-to-End Testing 的可能性验证

@EyreFree:本文记录了作者实验在现有的 App / API 架构之上使用 Proxy Server 录制 API Request & Response 并回放作为 Mock Server API 给 End-To-End Testing 测试时使用的做法试探,同时尝试了基于 Mitmproxy 套件自行撰写 API 录制和回放脚本,有在做相关工作的同学建议阅读。

🐕 解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

@Damien:SwiftUI 是一个响应式框架,当数据源发生变化时,框架会自动更新视图。本文解析了 SwiftUI 中两个由于未能贯彻响应式编程原则而导致的严重错误:

  • 通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死
  • 当视图正在滚动时返回上一层视图会导致应用崩溃

同时作者也提供了对应的解决方案,如果读者有遇到类似的问题,不妨一读。

🐕 腾讯 QQ 桌面版架构升级:内存优化探索与总结

@Leo:桌面版应用相比 Web 端具有停留时间长的特点,如果没有控制好内存,会导致交互响应慢或者崩溃。在这篇文章中,QQ 相关团队和大家分享新版 QQ 在内存优化方面的探索和阶段性优化进展。虽然本文的讨论主要集中在 Windows 平台,但由于 Electron 的跨平台特性,大部分优化措施也同样适用于 macOS 和 Linux 平台。

🐎 SwiftUI Tips:如何收起键盘

@享耳先森:文章列举了 SwiftUI 中多种收起键盘的方式,适合刚入 SwiftUI 的同学们。

🐎 Flutter 小技巧之 3.13 全新生命周期 AppLifecycleListener

@Crazy:本文主要介绍了 Flutter 在 3.13 版本中的新的生命周期类 AppLifecycleListener 的使用方法,新的 AppLifecycleListener 类不用再如之前一样选择 mixin 的处理方案,可以直接在类中进行初始化,使用起来更加方便并且有利于全局统一的处理。新的生命周期回调方法更多也更加直观。本文对 hidden 的由来也做了简单的讲解,有利于各位开发者更好的理解 hidden 与 show 方法。

工具

Arc on Windows projects: swift-build

@kemchenj:Arc 是一款在产品体验上做了很多革新的浏览器,除了产品之外,技术选型也非常激进,选择了 Swift 作为它们主要的编程语言,但 Arc 需要支持 macOS 之外的桌面系统,而 Apple 在 Windows/Linux 平台上的投入很少。

所以 Arc 团队找到了 LLVM 团队的工程师 Saleem Abdulrasool,出钱资助他去帮助搭建 Swift on Windows 的工具链,后来他甚至进入了 Swift 的核心团队专门负责这件事情,并且今年也正式加入了 Arc 团队的公司。

如果你也钟情于 Swift 并且需要在 Windows 上使用,可以关注这个项目了解 Swift on Windows 的最新进展。

内推

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

[杭州] 淘宝 - 终端平台 - iOS/Android/C++

[广州] 微信公众号 - iOS

[北京] 快手 - 本地生活 - iOS

[上海 / 北京] MiniMax - iOS

[广深] TikTok 直播 - 社交互动团队 - iOS/Android

[北京] 知乎 - 会员业务 - iOS

[上海] 扫描全能王 - iOS

[深圳] 手机 QQ - 终端架构 - iOS - T10/T11

具体信息请移步: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 周报 #258 | 2023-08-28

28 Aug 03:07

Choose a tag to compare

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

🌟 Flutter 3.13 更新

@CrazyCoderShi: Flutter 季度更新来啦 !!!本次更新依然在 3.x 系列之下,也就是说还是持续的修复和优化,那么本次带来了哪些有意思的能力呢 :

  • 优化了 Impeller 在 iOS 上的性能,同时 mac OS 已经可测试
  • 折叠屏设备获得支持
  • Material 3 持续增进支持,下一个版本讲默认 M3 选项
  • 应用生命周期监听改进
  • TwoDimensional,新的滚动机制
  • New slivers,支持组合使用

新手推荐

🐎 Applying metal shader to text in SwiftUI

@Cooper Chen:今年的 WWDC23 引入了用于将 shaders 着色器应用于 SwiftUI 视图的视图修改器,同时因为着色器还符合 ShapeStyle 协议,这意味着开发者可以直接将着色器传递给 foregroundStyle 视图修改器,然后 SwiftUI 就使用着色器计算视图的像素颜色值,本篇文章通过简单的例子,可以了解如何将着色器应用于文本,对于新入门相关开发的同学是一个不错的参考。

文章

🐕 Swift ’ s closure capturing mechanics

@JonyFang:尽管 Swift 的自动引用计数管理了内存,虽然我们常常听到过于简化的规则,比如“在闭包中始终使用弱引用”,但理解闭包的捕获方式以及如何引用对象和值很重要。日常开发中,需要深入了解这些机制,并根据实际情况进行合理应用。

  1. 隐式捕获。在定义逃逸闭包时,它会隐式捕获内部引用的对象、值和函数。为了防止在稍后执行时被释放,这些闭包需要保持对所有依赖项的强引用。举例说明了如何使用 GCD 延迟显示 UIAlertController,并提到了这种捕获方式可能导致一些棘手的错误和内存问题。同时,也提到了对于已被从视图层次结构中移除的视图控制器,需要谨慎处理以避免问题。

  2. 捕获列表。通过在闭包内部使用捕获列表,可以指定对象是以弱引用还是默认的强引用被捕获。通过弱引用捕获对象,可以避免潜在的保留循环问题,特别是在需要引用 self 时。通过示例展示了在闭包中使用捕获列表的具体应用场景,以及如何避免保留循环的问题。总体而言,捕获列表是解决闭包中引用问题的有效方式,能够更加精确地控制对象和值的引用关系。

  3. 使用捕获列表避免保留循环。弱引用不是所有情况的最佳解决方案。不同情况下应谨慎考虑如何使用 self,以及闭包在内存中的寿命。在短暂的闭包中,如 UIView 动画,捕获 self 通常没问题,而且代码易读。但在闭包中访问实例方法和属性时,需要明确引用 self,以明确捕获决策。有些情况下需要长时间保留 self,例如当当前对象在闭包中的工作是必要的时。同时,捕获列表能够让我们直接捕获闭包的依赖项,而无需引用整个 self。在仅需要访问少数属性而不是整个 self 时非常有用。

  4. 捕获值。值类型在闭包捕获中较复杂。值类型在闭包中被传递时是以副本的形式进行传递,这使得 Swift 的值类型非常强大,但在特定情况下可能会出现意外 case。例如,在给按钮分配处理闭包时,捕获 sendermessage 属性可能会导致值的不一致。对于可变值,解决方法是在闭包中只捕获 self,然后将该值直接映射到发送方法。然而,对于常量,将这些属性添加到闭包的捕获列表中没有问题。

  5. 无主引用(unowned)。闭包捕获中 unowned 引用与弱引用一样,也是通过捕获列表指定的,只能应用于引用类型。使用 unowned 与使用强制解包的可选项实际上会得到相同的结果,即将弱引用视为非可选项,但如果在引用释放后尝试访问它,会导致崩溃。使用 unowned 虽然让我们摆脱了可选项,有时可能非常方便,但它会在引用释放后引发崩溃,除非我们绝对确定给定的闭包在其中一个依赖项被释放后不会意外触发。然而,与其使用 unowned,我们可以通过断言来实现完全相同的效果。虽然这会导致一些额外的代码,但在失败时会提供更具可操作性的错误消息,并且不会在生产环境中引发崩溃。

理解闭包的捕获方式以及如何引用对象和值很重要,日常开发中需要合理应用。

🐕 Deterministic builds with clang and lld

@老峰:可重现构建(英语:Reproducible builds)也被称为确定性编译(英语:Deterministic compilation),即使用确定性编译编译的源代码在任何路径,时间,环境将始终输出相同的二进制文件。本文主要介绍了 Deterministic compilation 基本概念,以及如何使用 LLVM 创建确定性构建。

🐕 How to Automate Memory Leak Detection in Your Swift Code with XCTest

@AidenRao:这篇文章介绍了如何使用 XCTest 自动检测 Swift 代码中的内存泄露:使用 XCTestCase 中的 addTearDownBlock 方法,在测试方法结束时,通过断言检查对象是否正确释放。

🐎 How to check if you use a required reason API

@J_Knight_:我们在调用某些 API 的时候,需要我们向苹果官方告知使用的原因(比如一些可以用于标识设备的一些系统参数),本文作者把这类的 API 叫做 “ Required Reason API ”。作者简单介绍了这些 API 的类型,也提供了一个脚本用于在代码中查找出这类 API

代码

SwingAnimation:一份价值 500 的代码

@卓同学:事情的起因是自力 hzlzh在推特上“悬赏” 500 元想要知道小组件如何能做位移动画的秘密。苹果官方并不支持小组件做动画,因此要做到这个动画肯定是找到了一个特别的实现方式。悬赏发出来不到一天,就有一位开发者成功获得了悬赏。

我把这件事告诉了我们一位不愿意透露姓名的编辑后,这位编辑有着强烈的求知欲,于是也花了 500 获得了这个秘密。并在社交网络上分享:“昨天花了 500 买了一份代码,挺划算的”。于此同时我也在朋友圈说到:“彪子你太爱学习了”。

正当我们沉浸在一个价值 500 的秘密分享给另外一个人,等于白赚了 500 ,等于当时没花钱的喜悦的时候,某知名小组件开发者开源了这个方案。所以这是一份实打实价值 500 的代码了,如果有需要做小组件位移动画的欢迎前往了解学习。

内推

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

[杭州] 阿里巴巴 — 内容终端技术团队 — 手淘首页 & 信息流方向 — iOS/Android

[上海] - 完美世界 电竞 - iOS

[北京 / 杭州] - 抖音投屏 - Android/iOS

[北京] - 百度网盘 iOS/Android/FE/Server 研发工程师

[深圳 / 广州 / 北京 / 三亚] 字节跳动 - 剪映 - 招聘客户端开发

具体信息请移步: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)