主流移动平台SDK差异:iOS vs Android 概览

做跨平台SDK,绕不开两个大平台:iOS和Android。很多新手问我,是不是写一套代码,两边都能跑?嗯,理想很丰满,现实很骨感。这两个系统的底层差异,比你想象的大得多。我个人习惯,在开始任何跨平台项目前,先列一张差异清单。今天我们就来聊聊这张清单上的核心内容。

移动平台SDK核心差异对比 iOS SDK 生态 开发语言:Objective-C / Swift 开发工具:Xcode (Mac Only) UI框架:UIKit / SwiftUI 分发渠道:App Store 权限模型:运行时动态请求 Android SDK 生态 开发语言:Java / Kotlin 开发工具:Android Studio (跨平台) UI框架:XML Layout / Jetpack Compose 分发渠道:Google Play / 第三方 权限模型:清单声明 + 运行时 适配核心:统一接口 + 平台差异化实现

开发语言与工具链

说到底,SDK集成第一步就是语言和工具。iOS这边,苹果用的是Swift和Objective-C。Android呢,官方推荐Kotlin,Java也还有大量存量项目。我在项目中遇到过很多团队,因为语言选择不当,导致SDK维护成本翻倍。

  • iOS:调试只能用Xcode,Mac是硬门槛。你说用Windows开发iOS?目前还没戏。我记得以前有个同事非要装黑苹果,折腾了两周,最后还是老老实实买了台Mac mini。
  • Android:Android Studio支持Windows、macOS、Linux。这给了跨平台SDK集成很大的灵活性。说白了,你可以在任何主力机上完成Android端的开发和调试。
避坑提示:我曾经在Windows上集成过一个iOS的静态库,折腾了半天,最后发现需要的是fat库(同时包含arm64和x86_64)。这种低级错误,花了我整整一个下午。所以,一定要提前确认SDK提供的架构和平台支持。

UI框架与布局

UI是用户的第一印象。但iOS和Android的渲染机制完全不同。我个人习惯把UI适配看作“映射”而非“复用”。

维度 iOS (UIKit/SwiftUI) Android (View/Jetpack Compose)
布局单位 Point (pt),与屏幕分辨率无关 dp + sp,密度无关像素
渲染引擎 Core Animation + Metal Skia (软件渲染或硬件加速)
屏幕适配 Auto Layout + Size Classes ConstraintLayout + 各种限定符 (sw600dp, land等)
手势系统 UIGestureRecognizer GestureDetector / OnTouchListener

你想想看,同样是按钮,iOS的UIButton和Android的Button,默认样式、圆角、阴影都不同。跨平台SDK要想做到视觉一致,要么用Flutter这样的自绘引擎,要么在原生层做封装。

权限模型——一个头疼的大坑

权限管理是SDK集成中最容易出问题的地方。为什么?因为两个系统的设计哲学完全不同。

  • iOS:严格的应用沙箱。权限必须在Info.plist中声明描述字符串,首次使用时弹窗请求。用户拒绝后,下次不会主动提示。我有一个项目,提前没有写《相机使用描述》,结果App一启动就闪退。
  • Android:6.0之前是安装时自动授权。6.0之后引入了运行时权限。而且Android的权限分组机制,让“请求一次授权,可能一次性获得一组权限”。
我的经验:在Android上,你如果请求多个权限,最好分批次请求。用户一次性看到三四个权限弹窗,大概率全部拒绝。iOS这边则更友好一些——一次只弹一个,用户更容易接受。

应用分发与更新

SDK最终是要打包到App里的。不同平台的分发和更新机制,直接影响SDK的版本管理和热修复策略。

  • App Store审核:每次提交新版本都要等审核。如果你的SDK依赖了私有API,那就等着被打回来吧。我记得有一次,SDK里不小心引用了UIPasteboard,审核直接被判违规。
  • Google Play审核:相对宽松一些,但也越来越严格了。而且Android支持多渠道分发,比如国内的各大应用商店、官方网站下载。这给SDK的版本追踪带来了麻烦。
警告:iOS不允许在运行时下载可执行代码(JIT编译除外)。如果SDK通过下发脚本或JS来动态改变行为,Android相对灵活,iOS几乎行不通。你的热修复方案,必须在设计初期就考虑这一点。

生命周期与进程管理

生命周期差异,是我见过导致崩溃最多的原因。没有之一。

  • iOS:AppDelegate统一的代理回调。App进入后台、前台、挂起、终止,都有清晰的时序。SDK可以依赖这些回调做资源释放和数据保存。
  • Android:Activity和Fragment都有自己的生命周期。而且系统随时可能为回收内存而销毁Activity。SDK如果持有Activity引用,就可能造成内存泄漏。我曾经处理过一个棘手问题:Android的SDK在用户旋转屏幕后,Activity重建,SDK内部状态却还在,直接Crash。

所以,Android SDK集成时,一定要避免在静态变量中缓存Activity Context。这是个老生常谈的问题,但每次都有新手栽在这里。

小结

iOS和Android的差异,不只是语言和工具的不同。它涉及权限、UI、生命周期、分发、调试等多个层面。做跨平台SDK,说白了就是在这两层中间搭一座桥——桥面统一,桥墩各不同。这个认知,会贯穿整个课程。接下来我们会深入每个差异点,看看具体怎么应对。