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 完成需求了。

最后模拟器跑一下,完美

相关推荐
ujainu4 小时前
Flutter + OpenHarmony 游戏开发进阶:轨迹拖尾特效——透明度渐变与轨迹数组管理
flutter·游戏·openharmony
一起养小猫4 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
2501_944525545 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
微祎_8 小时前
Flutter for OpenHarmony:构建一个 Flutter 躲避障碍游戏,深入解析帧同步、动态难度与归一化坐标系统
flutter·游戏
一起养小猫8 小时前
Flutter for OpenHarmony 实战:番茄钟应用完整开发指南
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
一起养小猫9 小时前
Flutter for OpenHarmony 实战:数据持久化方案深度解析
网络·jvm·数据库·flutter·游戏·harmonyos
雨季66610 小时前
Flutter 三端应用实战:OpenHarmony “微光笔记”——在灵感消逝前,为思想点一盏灯
开发语言·javascript·flutter·ui·dart
2501_9159214310 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
kirk_wang11 小时前
Flutter艺术探索-Flutter三方库鸿蒙适配实战:从原理到实践
flutter·移动开发·flutter教程·移动开发教程
晚霞的不甘11 小时前
Flutter for OpenHarmony 实现高级视差侧滑菜单:融合动效、模糊与交互动画的现代 UI 设计
flutter·ui·前端框架·交互·鸿蒙