将一个应用从 Obj-C 转换 - TrozWare

主要观点:作者收到 App Store Connect 通知其一款 3 年未更新的 iPhone 应用将被移除,因不想应用下架,决定将其从 Objective-C 转换为 Swift 和 SwiftUI。该应用为专业双簧管演奏者或音乐学生设计,支持 1969 年创作的特定音乐作品。作者不认同苹果仅因应用老旧就移除的政策,此次转换过程中,作者详细介绍了各个界面(主屏幕、设置页面、无人机播放、计时等)在 Swift 和 SwiftUI 中的实现及遇到的问题和解决方法,最后总结此转换过程很有趣,还需完善设置页面布局及寻找 Swift 播放特定频率无人机的方法,且希望收到读者反馈。
关键信息:

  • 应用为Berio’s Sequenza VII,市场极小,专为专业双簧管演奏者设计。
  • 苹果移除应用的合理原因包括不支持最新硬件或系统、是骗局、是其他应用的克隆等,但仅以年龄为由不合理。
  • 主屏幕 UI 用 SwiftUI 实现,解决了Text视图显示问题;设置页面用嵌套VStacks布局,@AppStorage简化了设置处理;无人机播放需根据演奏者调整频率并与 B4 匹配;计时部分先尝试TimerDispatchQueue.main.asyncAfter,后通过记录误差自我调整。
    重要细节:
  • 主屏幕使用SpacersVStacks保持布局,中间大计数器用.monospacedDigit()防止数字跳动。
  • 设置页面尝试多种技术仍未达到理想效果,之后意识到应使用GeometryReader根据屏幕大小调整布局间距。
  • 计数代码行数,设置页面从 173 行减少到 101 行,降低 42%;条形和声音视图从 166 行减少到 124 行,降低 25%。
  • 计时测试中,最初使用自定义线程准确到 0.01 秒,后使用DispatchQueue.main.asyncAfter时前两栏约差 0.1 秒,通过记录误差自我调整后与原精度相当。
  • 日志记录使用OSLog,在ContentView.swift顶部导入import OSLog,创建日志记录器private let logger = Logger(subsystem: "Berio", category: "ContentView"),用于跟踪计时。
阅读 12
0 条评论