编译成功后watchOS Complication未出现在表盘可选列表的问题咨询
我按照以下步骤将iOS Widget扩展为watchOS Complication:
- 复制iOS Widget目标以扩展到watchOS
- 将Targeted Device Families修改为Apple Watch
- 将Base SDK修改为watchOS
- 修改bundle identifier和配置文件(provisionings)
- 将Complication目标嵌入到watch app目标中
所有步骤编译无错误、警告,但添加Complication到表盘时,它并未出现在可选列表里。我是不是漏了什么?
我的Widget代码如下:
import WidgetKit import SwiftUI struct CurrentMonth: Widget { @available(watchOS 9.0, *) var families: [WidgetFamily] { #if os(watchOS) return [.accessoryInline, .accessoryCircular, .accessoryRectangular] #else if #available(iOS 16.0, *) { return [.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge, .accessoryInline, .accessoryCircular, .accessoryRectangular] } else { return [.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge] } #endif } @available(watchOS 9.0, *) var body: some WidgetConfiguration { StaticConfiguration( kind: "WidgetCurrentMonth", provider: MonthTimeline(), content: { entry in WidgetCurrentMonthView(entry: entry) }) .configurationDisplayName("widget.currentmonth.title".localized) .description("widget.currentmonth.description".localized) .supportedFamilies(families) } } @available(watchOS 9.0, *) struct WidgetCurrentMonthView: View { let entry: LastMonthEntry @Environment(\.widgetFamily) var family var body: some View { HStack { Image.briefcase Text("abcd") } } }
这份代码同时用于iOS Widget目标和watchOS Complication目标。
另外,我下载了苹果官方的Complication示例项目,尝试安装到watch模拟器和真机上,同样无法正常显示Complication。这是怎么回事?
我使用的表盘如图所示,我的应用名为Field Service Watch,应该出现在Compass和Heart Rate之间。
可能的原因及解决办法:
系统版本兼容性
代码中声明了@available(watchOS 9.0, *),需确认测试的手表/模拟器系统版本是否≥watchOS 9.0。低于该版本的设备会直接忽略这个Complication。Target配置遗漏
- 检查watchOS Complication目标的
Info.plist:必须添加NSExtension字典,其中NSExtensionPointIdentifier设为com.apple.widgetkit-extension,同时NSExtensionAttributes内要有WKComplicationSupportedFamilies数组,填入你支持的Complication类型(如accessoryInline、accessoryCircular、accessoryRectangular)。 - 确认bundle ID层级:watch app的bundle ID需是iOS主应用ID加上
.watchkitapp后缀,Complication的bundle ID需是watch app ID加上.widget后缀(例如主应用ID为com.xxx.app,watch app为com.xxx.app.watchkitapp,Complication为com.xxx.app.watchkitapp.widget)。同时watch app的Info.plist中WKCompanionAppBundleIdentifier要正确指向iOS主应用的bundle ID。
- 检查watchOS Complication目标的
WidgetKind唯一性
确保StaticConfiguration中的kind值在整个应用(iOS+watchOS)内唯一,避免与其他Widget/Complication冲突导致加载失败。缓存清理
- 模拟器:彻底删除watch模拟器上的应用,重启模拟器后重新安装。
- 真机:卸载手表上的应用,重启手表后重新同步安装。
- 清理Xcode Derived Data:打开
Xcode -> Preferences -> Locations -> Derived Data,点击路径删除对应文件夹。
官方示例运行注意事项
运行官方示例时需选择watch app目标(而非单独的Complication目标),且确保iOS与watch模拟器配对正常;真机则需手机与手表已配对,应用在两者上均正确安装。表盘类型匹配
确认你使用的表盘支持你声明的Complication类型。比如若只支持accessoryInline,但表盘没有对应插槽,Complication不会出现在可选列表中。
内容的提问来源于stack exchange,提问作者kunass2

