孙同生的博客

为美好的世界献上祝福

iOS页面路由,具体可能需要处理的场景、问题有:

  1. 最普通 原生页面跳转到原生页面
  2. 有多种技术栈的app,可能包含原生、h5/rn/flutter等页面。就扩展出:
    • 原生页面和h5页面互相跳转
    • 原生和rn页面互相跳转
    • 原生和flutter互相跳转等
  3. 在上述的基础上,很多原本原生实现的页面,需要通过新的H5页面进行升级/降级,或者原本PC或者H5页面,需要重定向到已有的原生页面。而这些基本都是硬编码的跳转逻辑,需要随着版本不停改动。跳转的逻辑需要根据版本迭代走,无法统一远程进行改动(例如:每次新增一个需要拦截跳转原生的页面,都需要通过发版来解决)
    • 跨技术栈跳转的实现成本比较高,必须在桥接模块中进行特殊适配。H5页面中,某些跳转需要跳转原生或者其他页面,必须要通过WebView跳转的拦截做特殊判断处理
    • 需要梳理的各技术栈跳转逻辑,将这些跳转整合,能够满足动态性、可配置的需求。
  4. 一些应用有社交分享功能,需要分享出去一个链接以打开自身app内特定页面。或者有应用内分享链接 也可以打开自身app内特定页面。
    • 一般来说 应用外打开app需要使用iOS的URL Scheme功能或者Universal links功能
阅读全文 »

探究一下我们计算app储存空间的大小时和系统设置里的差距

App自身大小差距

系统设置里App的存储空间分为:“App大小”和“文稿与数据”。

阅读全文 »

App里总会有很多的弹窗,为了美观,大多数弹窗都需要盖住导航栏;这时弹窗会添加到window上以满足需求。但添加到window上的弹窗却不方便管理,也与页面脱离关系,如果有异步的情况,弹窗会更加复杂难以处理,如何才能对window弹窗统一进行管理,解决这些问题?

遇到的问题

阅读全文 »

今天聊一下页面加载时间的检测。

  • viewDidappear
  • viewIsAppearing
  • 监听某个元素渲染完时间
阅读全文 »

之前介绍了一下 iOS中的编译过程 iOS编译过程 。 现在来对整体编译时间做一个优化。

编译耗时分析

xcode完整的build详细的步骤如下:

  • 创建Product.app的文件夹
  • 把Entitlements.plist写入到DerivedData里,处理打包的时候需要的信息(比如application-identifier)。
  • 创建一些辅助文件,比如各种.hmap,这是headermap文件,具体作用下文会讲解。
  • 执行CocoaPods的编译前脚本:检查Manifest.lock文件。
  • 编译.m文件,生成.o文件。
  • 链接动态库,o文件,生成一个mach o格式的可执行文件。
  • 编译assets,编译storyboard,链接storyboard
  • 拷贝动态库Logger.framework,并且对其签名
  • 执行CocoaPods编译后脚本:拷贝CocoaPods Target生成的Framework
  • 对Demo.App签名,并验证(validate)
  • 生成Product.app
阅读全文 »

优化指标

itunes connect上有两种包大小显示:“Download Size”,“Install Size”。“Download Size”即下载包大小,超过150M需要使用无线网下载的限制就是这个大小(现在已经放宽到200M);“Install Size”即安装后占用的磁盘空间大小,在appstore上显示的也是这个大小,用户往往会误认为这是下载安装包消耗的流量大小。所以一开始我们就将“Install Size”作为了优化指标。“Install Size”减小后,“Download Size”自然也会减小。

阅读全文 »

启动过程

iOS应用的启动可分为pre-main阶段和main()阶段,pre-main阶段为main函数执行之前所做的操作,main阶段为main函数到首页展示阶段。其中系统做的事情为:

  • premain
    • 加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法)
    • 加载动态链接库加载器dyld(dynamic loader)
    • 定位内部、外部指针引用,例如字符串、函数等
    • 加载类扩展(Category)中的方法
    • C++静态对象加载、调用ObjC的 +load 函数
    • 执行声明为__attribute__((constructor))的C函数
  • main
    • 调用main()
    • 调用UIApplicationMain()
    • 调用applicationWillFinishLaunching
阅读全文 »

iOS 原生代码的编译调试,都是通过一遍又一遍地编译重启 APP来进行的。所以项目代码量越大,编译时间就越长。虽然我们可以将部分代码先编译成二进制集成到工程里,来避免每次都全量编译来加快编译速度,但即使这样,每次编译都还是需要重启App,需要再走一遍调试流程。

幸运的是,John Holdsworth 开发了一个叫做 InjectionIII 的工具可以动态地将 Swift 或 Objective-C 的代码在已运行的程序中执行,以加快调试速度,同时保证程序不用重启。

阅读全文 »
0%