[转载] 滴滴 iOS 动态化方案 DynamicCocoa 的诞生与起航
由于原文已经删除, 在此转载供个人学习记录.
[转载]滴滴 iOS 动态化方案 DynamicCocoa 的诞生与起航
方案诞生
动态化一直是 App 开发梦寐以求的能力,而在 iOS 环境下,Apple 禁止了在 Main Bundle 外加载和执行的自己的动态库,所以像 Android 一样下发原生代码的方案被堵死。
后来像 React Native、Weex 这样的基于 Web 标准的跨端方案出现,各大公司都有对其进行尝试,但对于滴滴现状,也许并不适合:
- 滴滴 App 强交互、以地图为主体、端特异性高;
- 客户端人员充足,跨技术栈学习和开发有较大成本;
- 大量固化 Native 代码,重写成本高。
所以我们思考,能不能做一套保持 iOS 原生技术栈、不重写代码就神奇的拥有动态化能力的方案呢?
于是,我们设计和实现了一个具有里程碑意义的 iOS 专属动态化方案:DynamicCocoa
PPT 模板
UIPageControl 的 autoresizingMask 属性导致布局异常
今天被反馈了一个 UIPageControl 莫名错位的线上问题, 本应在屏幕底部中间的指示器, 突然跑到了屏幕的右下角, 经过定位, 是 pageControl的宽度由 428 变成了 856 导致的, hook 了 pageControl 的 setFrame: 后, 断点停在了自动布局的堆栈, 系统自动布局计算宽度就是 856, 一番 Google 后最后发现是 autoresizingMask 的问题.
[转载] OCS:史上最疯狂的iOS动态化方案
由于原文已经删除, 在此转载供个人学习记录.
[转载]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等方方面面动态化需求。
xcodebuild 脚本打包导出错误
iOS 工程在云服务器打包, 打普通的体验包没问题, 但是打 TestFlight 包就报错, 错误日志如下
1 | IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/rw/4zvtml0922j4k36bbjxbny380000gp/T/App_2022-03-03_18-38-20.927.xcdistributionlogs'. |
从上面日志粗略看是编译错误, 搜索相关的错误描述, 网上会有不少相关案例, 在问题分析定位结束后, 解决方案是这一个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 可以正常打包.
线上问题处理步骤
记录一次遇到线上问题处理的步骤.
线上问题处理步骤
- 评估影响 影响范围以及严重程度.
- 是不是核心路径
- 影响级别, 是显示问题还是必现崩溃
- 影响用户量级
- 如果有线上上报, 查询上报数据库可知道影响量级.
- 根据当前版本 DAU 以及反馈数推测影响量级.
- 统计每个用户触发次数.
- 定位问题, 及时或定时(半小时或一小时)同步结论.
- 确定引入问题时间以及原因.
- 评估修复方案.
- 是否需要紧急合入代码, 如果是灰度发现问题, 就可以通过合代码解决.
- 总结问题出现原因, 以及避免方案.
- 确定是否有线上修复方案.
- 配置文件修改能否屏蔽问题.
- 后端配合修改能否解决.
- 是不是有热修复方案(Hotfix).
iOS NSURL 编码
在 RFC 3986 文档中规定,URL 中只允许包含以下四种:
- 英文字母 a-z 以及 A-Z
- 数字 0-9
- 4个特殊字符:中横线 -、下划线 _、小数点 . 以及波浪线 ~
- 保留字符:!*’();:@&=+$,/?#[]
除上述四种字符外,所有其他字符都将被替换成百分号 % + 两位十六进制数。
iOS 应用架构谈 学习笔记
<iOS应用架构谈> 学习笔记
本篇内容全部来自于 https://casatwy.com/ iOS应用架构谈 系列文章
iOS应用架构谈 开篇
架构要考虑的事情
- 调用网络API (网络) 如何让业务开发工程师方便安全地调用网络API?然后尽可能保证用户在各种网络环境下都能有良好的体验?
- 页面展示 (UI) 页面如何组织,才能尽可能降低业务方代码的耦合度?尽可能降低业务方开发界面的复杂度,提高他们的效率?
- 数据的本地持久化 (数据库) 当数据有在本地存取的需求的时候,如何能够保证数据在本地的合理安排?如何尽可能地减小性能消耗?
- 动态部署方案 iOS应用有审核周期,如何能够通过不发版本的方式展示新的内容给用户?如何修复紧急bug?
iOS 开发 - 衡量图片的在线加载及优化思路
iOS 开发 - 衡量图片加载及优化思路
图片展示是移动端开发非常重要的功能, 从展示 App 内置的图片到 Instagram 这样的图片 Feed 流应用, 图片加载消耗了巨大的带宽, 占用手机大部分的内存, 也在指尖的滑动过程中不断消耗着 CPU 资源. 本文将以优秀的开源库 SDWebImage 为例, 从开发的角度来衡量图片加载这一功能, 并会涉及到缓存/解码/图片格式等问题的研究, 从而引出后续优化方案.