如何配置SwiftUI应用文件以支持在WatchOS 6上独立部署应用
兼容watchOS 6.3的可行配置方案
首先明确前提:@SceneBuilder、Scene、WindowGroup、NavigationView均为watchOS 7.0及以上才提供的API,没有办法通过修改配置直接让低版本系统支持这些API,只能通过替换实现、添加版本判断的方式完成兼容。
方案1:全版本兼容watchOS 6.3实现(无需多版本判断)
该方案完全基于watchOS 6支持的API开发,适配所有watchOS 6及以上设备:
- 第一步:选中Xcode中Watch App Extension的编译目标,将Deployment Target修改为watchOS 6.3
- 第二步:删除默认生成的带
@main标记的SwiftUI App入口文件(该文件使用的WindowGroup等API仅支持watchOS 7+) - 第三步:在Watch App Extension的
Info.plist中添加配置项WKExtensionDelegateClassName,值设置为$(PRODUCT_MODULE_NAME).ExtensionDelegate - 第四步:新建
ExtensionDelegate.swift作为扩展入口,代码如下:
import WatchKit class ExtensionDelegate: NSObject, WKExtensionDelegate { func applicationDidFinishLaunching() { // 放置应用初始化逻辑 } }
- 第五步:新建
HostingController.swift作为根视图容器,代码如下:
import WatchKit import SwiftUI class HostingController: WKHostingController<AnyView> { override var body: AnyView { // 此处替换为你自己的应用根视图 return AnyView(YourRootView()) } }
- 第六步:替换所有不可用API:
- 移除所有视图外层的
NavigationView包裹,watchOS 6的SwiftUI默认自带导航栈能力,直接使用NavigationLink即可实现页面跳转 - 移除所有
@SceneBuilder、Scene、WindowGroup相关的代码
- 移除所有视图外层的
方案2:多版本兼容实现(同时支持watchOS 6和更高版本)
如果需要保留高版本系统的新API能力,可以通过版本判断实现双路径适配:
- 保留
@main的SwiftUI App入口,给整个App结构体添加@available(watchOS 7.0, *)标记 - 同时保留方案1中的
ExtensionDelegate和HostingController实现,作为watchOS 6的降级入口 - 所有使用
NavigationView的位置添加版本判断,示例如下:
var body: some View { if #available(watchOS 7.0, *) { NavigationView { ContentView() } } else { ContentView() } }
注意:Apple Watch Series 2最高仅支持升级到watchOS 6.3,无法升级到更高系统版本,如果你的应用需要支持该型号设备,必须完成上述兼容处理。
内容的提问来源于stack exchange,提问作者JS_is_awesome18
相关产品推荐
相关产品推荐

