之前的文章介绍了图片优化和代码优化的几种方式,本篇文章重点介绍HEIC图片和无用类检测的优化实践。HEIC是High Efficiency Image Format(高效图像格式)的缩写,是一种新的图像文件格式,它是2017年苹果公司在iOS 11中引入,用于代替JPEG图像格式,以更高效地压缩图像并减少存储空间占用。HEIC支持多帧图像、透明度和16位深度色彩,使得它成为高质量图像和动画的理想选择。本文重点探究HEIC图片在百度APP中使用的可行性和包体积收益,验证HEIC图片在Bundle和Asset Catalog的兼容性,重点研究了Asset Catalog管理图片的机制,记录了验证过程中发现的特殊问题和解决思路。无用类则是详细介绍了如何用静态分析和动态分析相结合的方式,精简代码体积。
百度APP iOS端包体积优化系列文章的前六篇重点介绍了包体积优化整体方案、图片优化、资源优化、代码优化、无用类优化、HEIC图片优化实践和无用方法清理,图片优化是从无用图片、Asset Catalog和HEIC格式三个角度做深度优化;资源优化包括大资源优化、无用配置文件和重复资源优化,代码优化包括无用类优化、无用模块瘦身、无用方法瘦身、精简重复代码、工具类瘦身和AB实验固化。本文重点介绍编译器优化,在百度APP实践中,编译器优化包括GCC语言编译优化、Swift编译优化、LTO优化、剥离调试符号、剥离符号表、剔除未引用的代码、Asset 优化、C++虚函数优化和三方SDK编译器方向瘦身。此外,我们重点介绍了指令集架构优化、XCode升级优化和Swift内置动态库优化,这三个模块优化的基础原理都涉及到编译器,所以我们在此篇章一起介绍。
在可访问性方面,图表是复杂的事物之一。iOS 15 引入了一项名为“音频图表”的新功能。 下面我们将学习如何通过使用 accessibilityChartDescriptor 视图修饰符为任何 SwiftUI 视图构建音频表示,呈现类似自定义条形图视图或图像的图表。
很多应用开发者都会遇到这样一个需求,当程序需要处理某个敏感的核心任务,或者执行某些动画时,需要杜绝一切外部干扰,优先保证任务的完成,之后再去处理其它任务。否则如果在处理过程中受到外部事件的干扰,可能会引入严重的问题,而规避这些问题需要额外编写过多的逻辑。 例如,当程序在忙着清理应用内缓存的过程中去处理其它任务,这时候由于其它任务可能会产生新的缓存,这就会和现有的任务冲突。所以在清理缓存的过程中,app 一般会暂时中断用户和非用户的请求,优先保证缓存清理的完成。 所以,为了简化产品设计逻辑,开发者一般会选择在处理任务时暂时屏蔽其它任务,优先保障现有任务的完成。
在 iOS16 上,苹果推出了实时活动( Live Activities )。实时活动可以出现在用户锁屏界面,并可实时展示用户关心的一些核心信息。由于使用远程推送通道更新实时活动不需要主 app 保持开启,并且相比小组件需要用户手动添加到桌面这个门槛,实时活动功能是默认开启的,所以这一机制保证了信息的触达概率会远高于小组件。 笔者认为,实时活动是一种更高级的推送形态,对比传统的推送,实时活动显得灵活许多。传统推动在用户接收并读取到内容的瞬间信息就失效了,如果想要为用户提供持续更新的信息需要依赖一条接一条的推送才可以实现,这无论从成本还是用户体验上,都是难以接受的。而实时活动则会在持续期间,无干扰的保持着信息的更新,并且又会在合适的时机自行消失,因此用户体验极佳。 作为一家在线旅行产品平台,我们一直追求为用户提供极致的用户体验,在今年的上半年,我们上线了基于实时活动开发的实时出行信息展示功能,用户可以在出行全周期内,通过锁屏或者灵动岛看到最新实时的出行信息。
Monorepo 和 Bazel 给我们带了很多优势,比如快速、正确、易扩展、易协作等。虽然 Bazel 早期版本对于 iOS 开发并不太友好,甚至让一些团队产生了放弃使用 Bazel 的想法;但 Bazel 本身极其优秀的扩展性,使得社区对其一直抱有极高的热情,开发出了许多优秀的 Rules,促使社区和 Bazel 本身一直向前进化,如今的 Bazel 已不同往日,一些早期令人诟病的问题也被一一解决。目前我们正在使用 Bazel 6.1.2 版本,且即将紧跟官方的脚步更新到 6.3.0 版本。今天我们就来聊聊我们哔哩哔哩近一年(主要是Bazel 5.0.0 版本以后)所应用的一些新特性、新 rules 以及在自建 rules 方面的探索。