iOS 动图优化实践

GIF 和 Animated WebP 是互联网上最主流的动图格式, 但是在 iOS 开发中, 原生的 UIImage 并不直接支持 GIF 以及 Animated WebP 的展示, 因此有了各种优秀的第三方开源方案, 例如 SDWebImage 以及 YYImage 等. 这篇文章将以我在开发中优化动图的实践为基础, 来介绍不同方案的思路以及优劣, 并给出优化的方案.

阅读全文 »

Objective-C 头文件展开

在 Objective-C 中, 头文件展开是在预处理阶段处理的, 如果项目头文件过多以及头文件写法不规范, 经常产生各种问题, 比如想找某个头文件是在哪里被导入的, 搜索代码基本搞不定, 比如我想找 ComHelper.h 是在哪里被引入的, 需要先展开头文件

阅读全文 »

iOS 无障碍化(适老化)适配总结

VoiceOver 和 Accessibility

iOS 开发中主要讨论的是 UIAccessibility 的 API 在 VoiceOver 上的运用.

重要: 使用旁白过程中遇到不明白的可以参考这个文档
旁白使用手册-在 iPhone 上学习旁白手势
比如下面这些情况

  1. 页面滚动, 旁白操作是 “三指轻扫”
  2. 激活项目, 旁白操作是 “轻点两下”
  3. “幕帘屏”功能, 屏幕会关闭, 但是屏幕依旧可以操作(不是 bug) 开关这个功能操作是”三指轻点三下”
  4. UISlider 的操作是 “轻点以选择滑块,然后单指上下轻扫”
阅读全文 »

SDWebImage4 分析


简书地址

导航

按照模块分析 SDWebImage

1. UI交互的基类 UIView+WebCache

2. SDWebImage 的主要管理者 SDWebImageManager

3. 缓存模块 SDImageCache

4. 下载模块 SDWebImageDownloader

5. 下载的执行者 SDWebImageDownloaderOperation

6. 预加载 SDWebImagePrefetcher

7. GIF子模块 FLAnimatedImage


阅读全文 »

由于原文已经删除, 在此转载供个人学习记录.

[转载]滴滴 iOS 动态化方案 DynamicCocoa 的诞生与起航

方案诞生

动态化一直是 App 开发梦寐以求的能力,而在 iOS 环境下,Apple 禁止了在 Main Bundle 外加载和执行的自己的动态库,所以像 Android 一样下发原生代码的方案被堵死。

后来像 React Native、Weex 这样的基于 Web 标准的跨端方案出现,各大公司都有对其进行尝试,但对于滴滴现状,也许并不适合:

  • 滴滴 App 强交互、以地图为主体、端特异性高;
  • 客户端人员充足,跨技术栈学习和开发有较大成本;
  • 大量固化 Native 代码,重写成本高。

所以我们思考,能不能做一套保持 iOS 原生技术栈、不重写代码就神奇的拥有动态化能力的方案呢?

于是,我们设计和实现了一个具有里程碑意义的 iOS 专属动态化方案:DynamicCocoa

阅读全文 »

今天被反馈了一个 UIPageControl 莫名错位的线上问题, 本应在屏幕底部中间的指示器, 突然跑到了屏幕的右下角, 经过定位, 是 pageControl的宽度由 428 变成了 856 导致的, hook 了 pageControl 的 setFrame: 后, 断点停在了自动布局的堆栈, 系统自动布局计算宽度就是 856, 一番 Google 后最后发现是 autoresizingMask 的问题.

阅读全文 »

由于原文已经删除, 在此转载供个人学习记录.

[转载]OCS:史上最疯狂的iOS动态化方案

在iOS的发展历程上,涌现了很多动态化方案,有历史悠久的WaxPatch动态化方案,有远近闻名的JSPatch动态化方案。今天我们向大家介绍一款堪称“史上最疯狂”的iOS动态化方案——OCS.

初窥OCS

OCS是全新设计的iOS动态化方案。我们定义了一套精确描述OC语义的字节码指令集(OCScript),开发了一套全自动编译器(OCSCompiler),实现了一个高性能的虚拟机(OCSVM)以及一个可以跟底层无缝对接的桥接器(OCSBridge)。我们首先使用OCS编译器把OC源码转化成OCS字节码,然后通过OCS桥接器实现OCS虚拟机与Native运行时的互联,最后使用OCS虚拟机对OCS字节码进行解释运算,并驱动Native运行时完成逻辑的执行,以此达到Native代码动态化的效果。OCS被用于iOS APP安装包减包、功能插件化、HotPatch等方方面面动态化需求。

阅读全文 »

iOS 工程在云服务器打包, 打普通的体验包没问题, 但是打 TestFlight 包就报错, 错误日志如下

1
2
3
4
IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/rw/4zvtml0922j4k36bbjxbny380000gp/T/App_2022-03-03_18-38-20.927.xcdistributionlogs'.
xcodebuild[39445:78833] [MT] IDEDistributionMethodManager: -[IDEDistributionMethodManager orderedDistributionMethodsForTask:archive:]: Error = Error Domain=IDEDistributionMethodManagerErrorDomain Code=2 "Unknown Distribution Error" UserInfo={NSLocalizedDescription=Unknown Distribution Error}
exportArchive: exportOptionsPlist error for key 'method': expected one of {}, but found app-store
Error Domain=IDEFoundationErrorDomain Code=1 "exportOptionsPlist error for key 'method': expected one of {}, but found app-store" UserInfo={NSLocalizedDescription=exportOptionsPlist error for key 'method': expected one of {}, but found app-store}

从上面日志粗略看是编译错误, 搜索相关的错误描述, 网上会有不少相关案例, 在问题分析定位结束后, 解决方案是这一个xcodebuild -exportArchive: exportOptionsPlist error for key ‘method’: expected one of {}, 将子工程的 SKIP_INSTALL 设置为 YES. 但是要注意的是 子工程的 Project 设置以及 Target 设置都应该设置为 YES, 我一开始只设置了 Target 的, 子工程 Project 设置的 SKIP_INSTALL 未设置, 默认值是 NO, 导致后续浪费了很多时间. 以及移除子工程中 “Build Phase” 的’Headers’选项, 两个改动后 tf 可以正常打包.

阅读全文 »