文章

iOS常识问题总结

iOS常识问题总结

最近在封装 UE4 接入 iOS SDK,本想等 UE4 做完了完整来一篇总结,由于刚开始接触 UE 引擎与 iOS,没有系统的学习基本上都是边做边学,但是没想到 Android/iOS 跨平台的封装因为各种原因,拖拉了近两个月才算是做完,后续把 UE4 接入跨平台过程中遇到的各种坑分享出来。先分享一下最近一周对于 iOS 的总结。

查看 iOS log 方式

  1. Xcode → Window → Devices and Simulators →iOS 真机设备 → open view log
  2. 开始查看日志,注意输入应用名或 Bundld 进行过滤 ,否则日志太多了不太好定位 重点查看崩溃日志,重点可以留意类似崩溃报告路径/文件名,比如: UE4Demo-2026-01-30-143521.ips

iOS 应用异常定位

  1. Xcode → Window → Devices and Simulators
  2. 选你的 iPhone
  3. 点  View Device Logs
  4. 查看下面这些错误日志(最有用):
    • Exception Type
    • Termination Reason
    • Triggered by Thread
    • Backtrace(调用栈):看最上面几个栈帧属于哪个模块(DemoUE4 / 你的 SDK framework)

      如果你这条崩溃栈全是地址,说明没符号:需要用这次打 IPA 对应的 dSYM来符号化(必须匹配同一次打包产物)。

符号表 dSYM

  1. 符号表生成
    1. UE4 Project Setting -> iOS -> Build
    2. Generate dSYM file for code debugging and profiling 自己用
    3. Generate dSYM bundle for third party crash tools 上传三方
  2. 符号表使用
    1. 符号表是否和包对应,查看 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
      

关于运行与直接出 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 文件夹
    • 运行时加载
  • 如何分辨是静态库还是动态库
    • 命令 file MySDK.framework/MySDK
    • 输出包含 dynamically linked shared library -> 动态库
    • 输出包含 current ar archive -> 静态库
本文由作者按照 CC BY 4.0 进行授权