Flutter 项目 -从 0 到 1 实现 iOS WatchApp

没做过那就得问专业的

开局先整个 iOS WatchApp 专家

第一步:添加 Watch Target

1、打开你现有的 iOS 工程。

2、点击 Xcode 顶部的 File > New > Target。

3、在弹出的窗口中,顶部选择 watchOS 选项卡。

4、选择 App 模板,点击 Next。

5、配置参数:

  • Product Name: 建议叫 YourAppNameWatch。
  • Interface: 选 SwiftUI(官方标准)。
  • Language: Swift。
  • Watch App Setup: 选 Watch App for Existing iOS App(这会把 Watch 和你现在的 iOS App 绑定)。

6、点击 Finish,如果询问是否 Activate Scheme,点击 Activate。

创建好的目录结构

简单介绍一下:

好极了!看到这个目录结构,说明你已经成功迈出了第一步。这是最现代的 SwiftUI-based Watch App 结构。

作为你的"技术合伙人",我来为你详细拆解这几个文件的分工,让你一眼看穿它们的逻辑:

  1. watchkitappApp.swift (App 入口)
    这是整个 Watch App 的生命周期管理器,相当于 iOS 中的 AppDelegate。
  • 作用:它定义了 App 的启动入口。你会看到 @main 属性,这意味着系统从这里开始运行。
  • 代码逻辑:它包含一个 WindowGroup,里面包裹着你的主视图(通常是 ContentView)。
  • 建议:如果你需要初始化一些全局变量、或者监听 App 进入后台/回到前台的状态,在这里处理。
  1. ContentView.swift (主界面)
    这是你的核心画布,也就是你刚才在模拟器上看到的那个界面。
  • 作用:所有的 UI 元素(Text, Button, List 等)都写在这里。
  • 建议:Watch 的屏幕很珍贵,建议尽量使用 SwiftUI 的 List 进行纵向布局,并配合 navigationTitle 使用。
  1. watchkitapp Watch App (黄色图标文件)
    这是一个 Entitlements(权限/声明)文件,或者叫配置声明。
  • 作用:它告诉系统这个 App 有哪些"特权"。比如是否需要访问健康数据(HealthKit)、是否支持实时活动(Live Activities)等。
  • 注意:平时你不需要去改动它,但如果你后面要做"表盘组件(Complications)",这里的配置会变得很重要。
  1. Assets.xcassets (资源库)
  • 作用:存放所有的图片资源、颜色定义,以及最重要的 App Icon。
  • 关键点:Watch 的图标和 iPhone 不同,它是圆形的。你需要在这里提供各种尺寸的圆形图标,否则安装到真机上会显示默认的占位图。
  1. Preview Content (预览辅助)
  • 作用:专门放开发阶段用的"假数据"或测试图片。
  • 优点:这里的文件只会在 Xcode 预览模式下加载,不会被打包进最终发布给用户的 App 里,所以不会增加 App 的体积。

因为我是在 Flutter 项目中创建的,因此报错了

bash 复制代码
Cycle inside Runner; building could produce unreliable results.
Cycle details:
→ Target 'Runner' has copy command from '/Users/liyanhong/Library/Developer/Xcode/DerivedData/Runner-gepurqquasximiaamgsyefnfbzwb/Build/Products/Debug-watchsimulator/watchkitapp Watch App.app' to '/Users/liyanhong/Library/Developer/Xcode/DerivedData/Runner-gepurqquasximiaamgsyefnfbzwb/Build/Products/Debug-iphonesimulator/Runner.app/Watch/watchkitapp Watch App.app'
○ That command depends on command in Target 'Runner': script phase "[CP] Copy Pods Resources"
○ That command depends on command in Target 'Runner': script phase "Thin Binary"
○ Target 'Runner' has process command with output '/Users/liyanhong/Library/Developer/Xcode/DerivedData/Runner-gepurqquasximiaamgsyefnfbzwb/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist'
○ Target 'Runner' has copy command from '/Users/liyanhong/Library/Developer/Xcode/DerivedData/Runner-gepurqquasximiaamgsyefnfbzwb/Build/Products/Debug-watchsimulator/watchkitapp Watch App.app' to '/Users/liyanhong/Library/Developer/Xcode/DerivedData/Runner-gepurqquasximiaamgsyefnfbzwb/Build/Products/Debug-iphonesimulator/Runner.app/Watch/watchkitapp Watch App.app'
...

这个报错在 Flutter 项目中添加 Watch Target 时非常经典。它的核心原因是 Xcode 编译顺序冲突(Dependency Cycle)。

简单来说,Xcode 的新构建系统非常严格。你的 Runner (iOS) 试图在某些脚本(比如 CocoaPods 的脚本)还没跑完时就去拷贝 Watch App,导致了逻辑闭环。
解决方案:调整 Build Phases 顺序

  1. 在 Xcode 左侧项目导航栏点击最顶部的蓝图标 Runner。
  2. 在右侧 TARGETS 列表中选择 Runner (注意是 iOS 的那个 target,不是 Watch 的)。
  3. 点击顶部的 Build Phases 选项卡。
  4. 找到 Embed Watch Content 这一行。
  5. 关键动作:用鼠标拖动 Embed Watch Content,把它移动到如图位置。

第二步:写界面

当然不是自己写,交给AI 写,用的国产AI 给他设计图和需求描述,别说还原度还挺高的

再让 AI 微调一下

至此我的需求已经完成咯,网络请求接口定义、数据解析这里是提前写好的让AI 调用的,资源这些也是下载命名好的,这些准备好了,就可以让AI 完成需求了。

最后模拟器跑一下,完美

相关推荐
ujainu11 小时前
Flutter + OpenHarmony 游戏开发进阶:用户输入响应——GestureDetector 实现点击发射
flutter·游戏·openharmony
hudawei99611 小时前
TweenAnimationBuilder和AnimatedBuilder两种动画的比较
flutter·ui·动画·tweenanimation·animatedbuilder
ujainu11 小时前
Flutter + OpenHarmony 实现无限跑酷游戏开发实战—— 对象池化、性能优化与流畅控制
flutter·游戏·性能优化·openharmony·endless runner
ZH154558913112 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
晚烛14 小时前
CANN + 物理信息神经网络(PINNs):求解偏微分方程的新范式
javascript·人工智能·flutter·html·零售
一起养小猫14 小时前
Flutter for OpenHarmony 实战:扫雷游戏完整开发指南
flutter·harmonyos
晚烛15 小时前
CANN 赋能智慧医疗:构建合规、高效、可靠的医学影像 AI 推理系统
人工智能·flutter·零售
晚霞的不甘15 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小哥Mark16 小时前
Flutter开发鸿蒙年味 + 实用实战应用|绿色烟花:电子烟花 + 手持烟花
flutter·华为·harmonyos
一只大侠的侠18 小时前
Flutter开源鸿蒙跨平台训练营 Day 3
flutter·开源·harmonyos