Skip to content

老司机 iOS 周报 #242 | 2023-04-24

Compare
Choose a tag to compare
@ChengzhiHuang ChengzhiHuang released this 24 Apr 02:12
· 857 commits to master since this release

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

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

新闻

Enabling the Inspection of Web Content in Apps

WKWebView 与 JSContext 在 iOS 16.4 SDK 中新增了属性 isInspectable,只有开启了这个属性才会允许检查 Web 的元素,并且这个属性可以在任意时间修改(不需要重启 APP 或者重新创建 Webview 实例)。对于需要调试 Webview 的同学们需要对这个属性进行适配(开启)之后才能像往常一样通过 Web Inspector 进行查看。

 Developer - 设计开发加速器

挑战:让你的 App 更加无障碍 2023 年 5 月 10 日

在本次线上讲座中,你将了解如何通过 Apple 操作系统提供的无障碍功能、无障碍 API 和开发者工具,来为每一个人打造卓越的用户体验。

参加线上讲座的开发团队,可在讲座当天报名参与无障碍适配挑战活动,通过审核后我们将邀请你参加 5 月 18 日在上海设计与开发加速器举办的无障碍宣传日线下活动,在线下你将了解到更多无障碍开发技术,以及与其他开发者进行交流和互动。我们还将邀请使用无障碍功能的用户来分享他们的故事,了解 App 是如何赋能他们的日常生活;以及有经验的开发者来分享他们的工程实践,看如何在产品内部推进无障碍适配。你还可获得一对一咨询和深度辅导,获得针对你 App 的无障碍优化建议。

线上讲座:探索 Vision 框架

Vision 框架支持人脸检测、文本检测、二维码检测、图像配准、特征追踪等一系列能力。探索如何通过 Vision 框架,在你的 App 内应用计算机视觉相关能力,了解一系列 API,用来在图片和视频上执行不同的任务。

文章

抖音 Swift 编译优化 - 基于自定义 Toolchain 编译提速 60%

@kemchenj:抖音基础技术团队在这篇文章里分享了一个很有趣的编译问题:

  1. Swift 和 OC 混合的模块里,Swift 自动生成的 xxxx-Swift.h 文件里会 import 所有直接和间接依赖的模块。(这种行为也被称为 re-export)
  2. 所以依赖了这个混合代码的模块的 OC 模块,它的所有间接依赖都会变成直接依赖。
  3. 而对于编译器来说,当一个模块直接依赖的模块 API 发生变化时,它的编译缓存就会失效,需要重新进行编译。

由于上述的三点,底层库的 API 修改很容易触发大面积的编译缓存失效,并且由于上层模块的直接依赖变多,导致缓存失效的判断逻辑也会变得更加复杂,最终导致编译时间增长。

Swift 这么设计的原因主要是为了兼容 C/OC 头文件的行为在 Swift 的论坛里开发组也曾经解释过具体的细节

但实际代码里很少会依赖这个行为,抖音的技术团队就尝试定制 Toolchain,增加更多选项去限制这个行为的生效范围,从而最终实现编译提速 60%

PC GWP-ASan 方案原理 | 堆破坏问题排查实践

@xuyafei86:众所周知,与内存访问相关的崩溃是最难分析的崩溃类型之一。对于这种崩溃,线上采集到的崩溃日志能提供的有效信息十分有限。因为堆破坏的时间往往在发生崩溃很早之前,等到发生崩溃时,上下文早已丢失,而从崩溃的位置回溯堆破坏的源头,是一件非常有挑战性的工作。

GWP-ASan 是 Google 主导开发的用于检测堆内存问题的调试工具。它基于经典的 Electric Fence Malloc 调试器原理,概率采样内存分配行为,抓取内存问题并生成上传崩溃报告。其可以检测 Use-after-free、Buffer-overflow 和 free-invalid-address 等内存访问相关的错误。

本文介绍了剪映专业版接入字节内部 APM-PC 平台 GWP-ASan 功能的实践,包含对监控原理说明和 5 个线上实例。感兴趣的同学可以阅读原文了解。

🐎 What I Learned Writing My Own CloudKit Syncing Library

@SmallflyCloudSyncSession 是一个基于 CloudKit 框架的 Swift 库,旨在使编写支持同步和离线功能的应用程序更容易。作者通过一篇文章介绍了该库的开发背景,设计思路,以及使用姿势。

🐎 Mastering Canvas in SwiftUI

@享耳先森:SwiftUI 中,绘制图形可以使用高级的 ShapAPI,也可以使用 Canvas 直接绘制。本文介绍 Canvas 的基本用法,也介绍了如何使用 Canvas 绘制文本、图片,甚至给 Canvas 添加动画。

🐎 3 mistakes to avoid with async / await

@Cooper Chen:本文作者在 Swift 中使用 async/await 要避免的 3 个错误,其中包括:

  • 尽可能的不同时运行代码
  • 不能正确理解 Task 自动捕获 self 的原理
  • 在不需要的时候使用了 Task.detached

🐕 淘宝 iOS 拍立淘微距能力探索与实现

@EyreFree:在最近两年苹果发布的 iPhone13 Pro Max 和 iPhone14 Pro Max 系列的手机上,如果使用三方主流 App 进行近距离对焦,会产生画面模糊的问题。为了优化用户体验,拍立淘 iOS 端开发团队进行了摄像头切换(微距)问题的分析和解决。本文从原理开始分析,通过层层拆解,把「微距实现」这个命题划分成为三个主要的解决目标:变焦系数、光照水平、焦点位置的确定。并围绕链路实现、性能、适配三个层面进行可行性验证,完成微距能力的落地。建议正在研究相关问题的同学阅读。

🐎 Using DWARF to find call sites of inline functions

@Damien:DWARF 是一种调试信息文件格式,被许多编译器和调试器用来支持源代码级调试。它解决了一些程序性语言的要求,如 C、C++ 和 Fortran,并被设计为可扩展到其他语言。DWARF 是架构独立的,适用于任何处理器或操作系统。如果你对使用 DWARF 来查找内联函数的调用点有需要,不妨阅读下本文,这对你或许有很大的帮助。

🐎 Reducing iOS app size using linker and why_load

@Leo:why_load 是 Apple LD 提供的一个链接选项,通过这个选项我们可以了解到一个 Symbol 在链接形成最终产物的时候为什么被保留了下来。文中介绍了如何利用这个选项,来减少我们 App Extension 产物中保留的符号,进而优化包体积。当然,类似的方法也可以用于主二进制,不过对于主二进制的优化要更加的慎重,避免引入新的问题。

摸鱼周报

@摸鱼周报 #91:第 91 期摸鱼周报,一起来看下本期概要:

  • 本期话题:线上讲座:探索 Vision 框架;5 月 9 号,App Store 定价以美国价格为基准进行更新
  • 内容推荐:推荐近期的一些优秀博文,涵盖:App Clip、CloudKit、Swift ABI 稳定性等方面的内容
  • 摸一下鱼:建了一个交流 AGI 知识的社群;在 Vercel 上部署 ChatGPT 的聊天能力;一个把 AI 拟人化的网站;AI Talk 基于 GPT4 让马斯克和乔布斯进行对话;基于 Apple 健康数据分析的 App HealthGPT
  • 岗位招聘:蔚来汽车 App iOS 研发

内推

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

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

关注我们

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

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

说明

🚧 表示需某工具,🌟 表示编辑推荐

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)