iOS常识问题总结
iOS常识问题总结
最近在封装 UE4 接入 iOS SDK,本想等 UE4 做完了完整来一篇总结,由于刚开始接触 UE 引擎与 iOS,没有系统的学习基本上都是边做边学,但是没想到 Android/iOS 跨平台的封装因为各种原因,拖拉了近两个月才算是做完,后续把 UE4 接入跨平台过程中遇到的各种坑分享出来。先分享一下最近一周对于 iOS 的总结。
查看 iOS log 方式
- Xcode → Window → Devices and Simulators →iOS 真机设备 → open view log
- 开始查看日志,注意输入应用名或 Bundld 进行过滤 ,否则日志太多了不太好定位 重点查看崩溃日志,重点可以留意类似崩溃报告路径/文件名,比如:
UE4Demo-2026-01-30-143521.ips
iOS 应用异常定位
- Xcode → Window → Devices and Simulators
- 选你的 iPhone
- 点 View Device Logs
- 查看下面这些错误日志(最有用):
Exception TypeTermination ReasonTriggered by Thread- Backtrace(调用栈):看最上面几个栈帧属于哪个模块(
DemoUE4/ 你的 SDK framework)如果你这条崩溃栈全是地址,说明没符号:需要用这次打 IPA 对应的 dSYM来符号化(必须匹配同一次打包产物)。
符号表 dSYM
- 符号表生成
- UE4 Project Setting -> iOS -> Build
- Generate dSYM file for code debugging and profiling 自己用
- Generate dSYM bundle for third party crash tools 上传三方
- 符号表使用
- 符号表是否和包对应,查看 UUID 即可,比如
1 2
dwarfdump --uuid UE4Test.app/UE4Test dwarfdump --uuid UE4Test.app.dSYM
b. atos 单地址定位
1 2 3 4
atos -arch arm64 \ -o /path/to/UE4Test.app.dSYM/Contents/Resources/DWARF/UE4Test \ -l 0x100610000 \ 0x100744090 0x100743e10 0x100743e58
- 符号表是否和包对应,查看 UUID 即可,比如
关于运行与直接出 iOS 包的差异
Launch/Run 常是 Development,Package 很可能是 Shipping/Distribution(优化/裁剪/宏不同) 优化会改变对象生命周期/内联/时序,使“本来就有的野指针问题”更容易爆
所以开发时要注意
- Development: 为调试与开发体验服务(更可调试、更多检查与日志、优化较弱)
- Shipping: 为发布性能与体积服务(优化强、检查/日志少、定位更难、更容易暴露未定义行为)
关于 IPA 的安装类型
iOS 上“能不能装、怎么装”,主要由证书 + Provisioning Profile + 签名方式决定:
A. Development(开发调试包)
- 证书:iOS Development
- Profile:Development provisioning(绑定设备 UDID)
- 安装方式:Xcode run / 导出 ipa 后安装到已登记设备
- 用途:开发调试、可配合调试器/诊断工具
B. Ad Hoc(测试分发包)
- 证书:iOS Distribution(或 Apple Distribution)
- Profile:Ad Hoc provisioning(绑定 UDID)
- 安装方式:直接装到这些 UDID 设备(常见通过企业内测平台/OTA 安装)
- 用途:小范围外部测试(受 UDID 数量限制)
C. Enterprise / In-House(企业内部分发)
- 证书:Enterprise(企业开发者计划)
- Profile:In-House
- 安装方式:企业 MDM、内部网页 OTA、内部平台
- 用途:公司内部员工分发(不允许对公众分发)
D. App Store(商店发布)
- 证书:Distribution
- 安装方式:App Store 安装
- 用途:公开发布
E. TestFlight(苹果官方测试渠道)
- 由 App Store 构建上传后,通过 TestFlight 安装
- 用途:内测/公测(无需 UDID 列表,受 TestFlight 规则限制)
iOS framework 类库
- Framework 是一个分层目录,它将动态共享库、资源文件、头文件等封装在一个包中
- 静态库 (Static Library / Static Framework)
- 打包时通过链接器(Linker)将此库合入到主程序文件中
- 动态库 (Dynamic Library / Dynamic Framework)
- 打包时会将 Framework 文件完整地拷贝到
.app/Frameworks文件夹 - 运行时加载
- 打包时会将 Framework 文件完整地拷贝到
- 如何分辨是静态库还是动态库
- 命令 file MySDK.framework/MySDK
- 输出包含
dynamically linked shared library-> 动态库。 - 输出包含
current ar archive-> 静态库。
本文由作者按照 CC BY 4.0 进行授权