Watch Complications

RSS for tag

Display timely and relevant information about your app on the Apple Watch face using Complications.

Posts under Watch Complications tag

166 Posts

Post

Replies

Boosts

Views

Activity

CLKComplicationDescriptor identifier for very old complications
I'm in the process of updating an app that uses complications that originally had a deployment target of watchOS 4.3. These complications used CLKComplicationSupportedFamilies defined in Info.plist. There are no CLKComplicationDescriptors in use. Updated complications that use a new CLKComplicationDescriptor.identifier display correctly in the complication picker, but the original complication that's using CLKDefaultComplicationIdentifier displays "--" or "---" depending on placement. This happens whether you are using a ComplicationController instance or WidgetKit. Using CLKDefaultComplicationIdentifier as the identifier when creating the CLKComplicationDescriptor doesn't work: the complication doesn't appear in the picker. My question is there a way to "upgrade" an older complication configured by the customer to a new complication identifier? I'm not using WidgetKit for this project so a widgetMigrator isn't an option. -ch
0
0
1.7k
Nov ’22
How can I make it behave like deeplink when watchOS Complication made by WidgetKit tapped.
Hi, now I'm trying to create watchOS Complication with our existing widgets from WidgetKit for iOS. I successfully made it work on watchOS as Complications. Next, I want to have a feature that when you tap that complication, not just launching our watchOS App, but open specific view of our watchOS App by passing some data to the app from the complication. I've been looking for the way how to detect which complication tapped and hopefully get some data the complication contains (like Entry). It's really helpful if you can give me any idea. Thank you.
1
2
1.7k
Oct ’22
WidgetKit Watch Complication not displaying Images
My complication code is very similar to that found in the Migrating ClockKit complications to WidgetKit tutorial. Except, I am only interested in displaying the app icon as the complication. I just cannot get any 'custom' images to display in the simulator, nor on a Watch. Image(systemImage: "") work fine, however. Does the image need to be re-sized to a specific resolution? The original image is 1024×1024, I have tried re-sizing this down to multiple smaller resolutions with no success. import WidgetKit import SwiftUI import Intents struct Provider: IntentTimelineProvider { func placeholder(in context: Context) -> SimpleEntry { SimpleEntry(date: Date(), configuration: ConfigurationIntent()) } func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { let entry = SimpleEntry(date: Date(), configuration: configuration) completion(entry) } func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) { var entries: [SimpleEntry] = [] // Generate a timeline consisting of five entries an hour apart, starting from the current date. let currentDate = Date() for hourOffset in 0 ..< 5 { let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! let entry = SimpleEntry(date: entryDate, configuration: configuration) entries.append(entry) } let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) } func recommendations() -> [IntentRecommendation<ConfigurationIntent>] { return [ IntentRecommendation(intent: ConfigurationIntent(), description: "Treadmill Assistant") ] } } struct SimpleEntry: TimelineEntry { let date: Date let configuration: ConfigurationIntent } struct Tread_Cadence_ComplicationEntryView : View { var entry: Provider.Entry var body: some View { Image("AppIcon") //.resizable() //.frame(width: 50, height: 50) //.scaledToFill() } } @main struct Tread_Cadence_Complication: Widget { let kind: String = "Tread_Cadence_Complication" var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in Tread_Cadence_ComplicationEntryView(entry: entry) } .configurationDisplayName("Treadmill Assistant") .description("Opens Treadmill Assistant.") } } struct Tread_Cadence_Complication_Previews: PreviewProvider { static var previews: some View { Tread_Cadence_ComplicationEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) .previewContext(WidgetPreviewContext(family: .accessoryRectangular)) } }
2
2
2.1k
Oct ’22
What is the callback for widgetURL on WKExtensionDelegate? I tried handleUserActivity, but it failed to be called.
The demo code is as follows.      case .accessoryRectangular:       ZStack() {         AccessoryWidgetBackground()         Text(entry.date, style: .time)       }       .widgetURL(URL(string: "demo://test")) I didn't get any useful information on the related documentation. Am I missing something?
3
2
1.7k
Oct ’22
Neither getCurrentTimelineEntry nor getLocalizableSampleTemplate get called by Complication Controller
I have an iPhone with Watch Project, I was getting good results on my Complications but lately they don't want to update… When I build and run on my iPhone the new Watch build gets transferred to the paired watch and is running there fine. Almost: it refuses to update the Complications. After Watch restart I only get ----- My server correctly tells me that I have two active complications on the current watchFace and I am calling server.reloadTimeline(for:) on both of them but the getCurrentTimelineEntry function never gets executed by the server. Neither does the getLocalizableSampleTemplate When I remove the App from the Watch, restart the Watch and then put the App back on the Watch using the iPhone's Watch App -- then it works, but only about 3 minutes after starting the Watch App on the Watch. During these 3 minutes my app's complications are only --. I can't ship it like this… My hunch is that somewhere the complication controller crashes, but it doesn't take my app down with it and thus my complications don't work any more. All other apps' complications do update alright though. Now my question is: is that a bug in Xcode, in WatchOS, or in my code? Will this happen when I first deploy my app on the App Store or will it be an issue with updates via App Store? Is this only relevant for my "local" build? Any hints where to hunt this bug?
1
0
2k
Oct ’22
Can't Load Image on Apple Watch Complications with New iOS 16 Widget
Image("sticker5")             .resizable()             .frame(width: 47, height: 47)             .scaledToFill() sticker5 is a picture with 94px * 94px. This is the size recommended by guideline. The Error is ComplicationsExtension[403:17806] [archiving] Widget archival failed due to image being too large [2] - (94, 94). We don't want to use low pixel images. That would look terrible. Please Help!
3
1
2.4k
Sep ’22
WatchOS9 - Widgetkit complications do not appear on simulator
Hi, I followed excactly the steps in https://developer.apple.com/videos/play/wwdc2022/10050 to add Widgetkit for watchOS to my existing iOS Widgets. Both widgets do work for iOS, but on my Apple Watch, my widget is invisible to be set as a complication. Any idea what I'm doing wrong? ... @available(iOSApplicationExtension 16.0, *) struct MyWidget: Widget {  private let kind: String = "MyWidget"     var body: some WidgetConfiguration {   return IntentConfiguration(kind: kind, intent: WidgetConfigurationIntent.self, provider: Provider()) { entry in    MyWidgetComponent(entry: entry)   }   .configurationDisplayName("widget_name_description".localized())   .description("widget_name_description".localized())   .supportedFamilies([.accessoryCircular, .accessoryRectangular, .accessoryInline])  } } @main struct MyAppWidgets: WidgetBundle {  #if os(watchOS)  var body: some Widget {   return MyWidget()  }  #else  var body: some Widget {   if #available(iOS 16.0, *) {    return WidgetBundleBuilder.buildBlock(OtherIosWidget(), MyWidget())   } else {    return OtherIosWidget()   }  }  #endif } ...
2
0
2.1k
Sep ’22
watchOS 9 complications - where do they go?
I have an app with Home Screen widgets, and new Lock Screen widgets, and I'm trying to get my complications to work on the Watch. The widgets are running off dynamic intents, taking a list of items from user defaults and providing that list for the user to choose when they add a Home Screen or Lock Screen widget. This works fine. In the "Complications and widgets: Reloaded" video from WWDC2022 at about 7:00 the guy tells you to duplicate the widget extension, rename it, and set it to run on watchOS. I ended up with these targets: Main App (embeds Widget, Intents Handler and Watch App) Widget Intents Handler Watch App (embeds Complications) Complications (new, copy of Widget) At about 8:30 he adds the supported families for the Watch to his EmojiRangersWidget WidgetConfiguration, so it looks like the code for the accessory widgets is used for both Lock Screen widgets and complications? Should I be putting all my complications views in the Widget target, something like this? @main struct WidgetEntry: Widget { public var body: some WidgetConfiguration { IntentConfiguration(kind: kWidgetKind, intent: DynamicItemSelectionIntent.self, provider: Provider() ) { entry in WidgetEntryView(entry: entry) } .configurationDisplayName("abc") .description("def") #if os(watchOS) .supportedFamilies([.accessoryCircular, .accessoryInline, .accessoryRectangular, .accessoryCorner]) #else .supportedFamilies([.accessoryCircular, .accessoryInline, .accessoryRectangular, .systemSmall, .systemMedium]) #endif } } struct WidgetEntryView: View { var entry: Provider.Entry @Environment(\.widgetFamily) var family @ViewBuilder var body: some View { #if os(watchOS) switch family { case .accessoryCircular, .accessoryCorner, .accessoryInline, .accessoryRectangular: ComplicationView(item: entry.item) @unknown default: UnknownComplicationView(item: entry.item) } #else switch family { case .accessoryCircular, .accessoryInline, .accessoryRectangular: LockScreenWidgetView(item: entry.item) case .systemSmall: SmallWidgetView(item: entry.item) case .systemMedium, .systemLarge, .systemExtraLarge: MediumWidgetView(item: entry.item) @unknown default: UnknownWidgetView(item: entry.item) } #endif } } I've previously been told by an Apple engineer on these forums: "The complication code should be in the watch app target. That's where watchOS 7 and 8 will look for complications, and where watchOS 9 will look for old ClockKit complications for migration to their WidgetKit counterparts." I'm no longer supporting watchOS 7/8, but does this mean that watchOS 7/8 will look for old complications in there to migrate to the new stuff into the Widget target? I asked a couple of follow-up questions but they never got answered ¯\_(ツ)_/¯ Apple make this stuff so unnecessarily complex, even though their videos make it look so easy. How many times have we all paused their videos to see exactly what code they're writing and where they're putting it? There's practically zero help out there - these forums are full of questions and few answers. Xcode should have much better documentation and help to guide you through this. It takes so long to get anything done because there just isn't the information we need.
1
0
2.4k
Sep ’22
WatchKit: Complications update failure
Hello, My AppleWatch app supports complications on X-Large and Modular WatchFaces. I use common data models for the complication families. I reload complications by calling server's reloadTimeline() and as the result my datasource's getCurrentTimelineEntry() is called. After that I get my complication on X-Large and Modular Faces updated. But sometimes complication on X-Large watchface is not updated on reloadTimeline() call or updated in a couple of minutes after the call. Though Modular complications works fine and do not have problems. Does anyone have similar problem with updates of X-Large complication?
0
0
630
Aug ’22
Please, eli5 me the flow to update AppleWatch complications in background, using data from iOS companion app
My god I feel so dumb. Please help. I have: an iOS app that displays calendar/reminders list (using EventKit data) a set of iOS widgets that also display these lists, but in a widget form the data fetch logic is shared, as well as most of the UI (everything's in SwiftUI) I'm trying to: create a WatchOS app and a a set of watch complications, to display calendars/reminders on the watch IMPORTANT: iOS app is the source of truth for all the data (it need to be post-processed after fetching from EventKit) Here's what works/flow fine (I understand how it works): iOS app updates its data upon launch (or EventKit update message). All good. iOS widgets update their data when iOS asks them to provide a new timeline. Widgets just reach out into EventKit directly on iPhone, and are done with everything (same device, enough processing power, direct access). All good. Watch app (as far as I understand), upon launch, would just need to send a request for data message to the iOS companion app, and iOS companion app would then just "push" the data back to the watch app (after post-processing it into a proper dictionary). So, I'm mostly good with it as well, I think. Watch app could update complications once it is launched and received data from iOS companion app (right?…) And here's where I'm stuck: I can't for the life of me to figure out what would be the flow to update Watch complications automatically in the background, using data from the iOS app's source of truth. I would assume it might be something like: watchOS requests a complication to provide its timeline (at whatever time it decides to do that - I can only be partially in control of the timing) complication, in turn, um…… calls the WatchOS app? (right?……) and requests the data required to build the timeline from the watch app once watch app receives that request from complication, it: sends request for data message to the companion iOS app receives the data from iOS app in a form of dictionary rebuilds the complication's timeline with the data it received from the iOS app Questions: Does the above flow sounds right at all? There does seem to be a lot of messages flowing around and between… Is it how it's supposed to be? What would be the very best approach to this situation? A simple flow outline would help immensely. I tried to look through the documentation and I'm feeling completely worn out… I can't connect the pieces and I just can't find the right place to start so I can untangle the logic (what starts when, request data from where, how) Any guidance is appreciated. I think I'm probably missing something very basic, but I have no idea what exactly :( Thanks! PS: I would like to support watchOS 8+, iOS 15+, so I guess newest additions to watchOS 9 are not applicable. I build everything in SwiftUI.
0
1
1k
Aug ’22
CLKComplicationDescriptor identifier for very old complications
I'm in the process of updating an app that uses complications that originally had a deployment target of watchOS 4.3. These complications used CLKComplicationSupportedFamilies defined in Info.plist. There are no CLKComplicationDescriptors in use. Updated complications that use a new CLKComplicationDescriptor.identifier display correctly in the complication picker, but the original complication that's using CLKDefaultComplicationIdentifier displays "--" or "---" depending on placement. This happens whether you are using a ComplicationController instance or WidgetKit. Using CLKDefaultComplicationIdentifier as the identifier when creating the CLKComplicationDescriptor doesn't work: the complication doesn't appear in the picker. My question is there a way to "upgrade" an older complication configured by the customer to a new complication identifier? I'm not using WidgetKit for this project so a widgetMigrator isn't an option. -ch
Replies
0
Boosts
0
Views
1.7k
Activity
Nov ’22
How can I make it behave like deeplink when watchOS Complication made by WidgetKit tapped.
Hi, now I'm trying to create watchOS Complication with our existing widgets from WidgetKit for iOS. I successfully made it work on watchOS as Complications. Next, I want to have a feature that when you tap that complication, not just launching our watchOS App, but open specific view of our watchOS App by passing some data to the app from the complication. I've been looking for the way how to detect which complication tapped and hopefully get some data the complication contains (like Entry). It's really helpful if you can give me any idea. Thank you.
Replies
1
Boosts
2
Views
1.7k
Activity
Oct ’22
WidgetKit Watch Complication not displaying Images
My complication code is very similar to that found in the Migrating ClockKit complications to WidgetKit tutorial. Except, I am only interested in displaying the app icon as the complication. I just cannot get any 'custom' images to display in the simulator, nor on a Watch. Image(systemImage: "") work fine, however. Does the image need to be re-sized to a specific resolution? The original image is 1024×1024, I have tried re-sizing this down to multiple smaller resolutions with no success. import WidgetKit import SwiftUI import Intents struct Provider: IntentTimelineProvider { func placeholder(in context: Context) -> SimpleEntry { SimpleEntry(date: Date(), configuration: ConfigurationIntent()) } func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { let entry = SimpleEntry(date: Date(), configuration: configuration) completion(entry) } func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) { var entries: [SimpleEntry] = [] // Generate a timeline consisting of five entries an hour apart, starting from the current date. let currentDate = Date() for hourOffset in 0 ..< 5 { let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! let entry = SimpleEntry(date: entryDate, configuration: configuration) entries.append(entry) } let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) } func recommendations() -> [IntentRecommendation<ConfigurationIntent>] { return [ IntentRecommendation(intent: ConfigurationIntent(), description: "Treadmill Assistant") ] } } struct SimpleEntry: TimelineEntry { let date: Date let configuration: ConfigurationIntent } struct Tread_Cadence_ComplicationEntryView : View { var entry: Provider.Entry var body: some View { Image("AppIcon") //.resizable() //.frame(width: 50, height: 50) //.scaledToFill() } } @main struct Tread_Cadence_Complication: Widget { let kind: String = "Tread_Cadence_Complication" var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in Tread_Cadence_ComplicationEntryView(entry: entry) } .configurationDisplayName("Treadmill Assistant") .description("Opens Treadmill Assistant.") } } struct Tread_Cadence_Complication_Previews: PreviewProvider { static var previews: some View { Tread_Cadence_ComplicationEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) .previewContext(WidgetPreviewContext(family: .accessoryRectangular)) } }
Replies
2
Boosts
2
Views
2.1k
Activity
Oct ’22
What is the callback for widgetURL on WKExtensionDelegate? I tried handleUserActivity, but it failed to be called.
The demo code is as follows.      case .accessoryRectangular:       ZStack() {         AccessoryWidgetBackground()         Text(entry.date, style: .time)       }       .widgetURL(URL(string: "demo://test")) I didn't get any useful information on the related documentation. Am I missing something?
Replies
3
Boosts
2
Views
1.7k
Activity
Oct ’22
Neither getCurrentTimelineEntry nor getLocalizableSampleTemplate get called by Complication Controller
I have an iPhone with Watch Project, I was getting good results on my Complications but lately they don't want to update… When I build and run on my iPhone the new Watch build gets transferred to the paired watch and is running there fine. Almost: it refuses to update the Complications. After Watch restart I only get ----- My server correctly tells me that I have two active complications on the current watchFace and I am calling server.reloadTimeline(for:) on both of them but the getCurrentTimelineEntry function never gets executed by the server. Neither does the getLocalizableSampleTemplate When I remove the App from the Watch, restart the Watch and then put the App back on the Watch using the iPhone's Watch App -- then it works, but only about 3 minutes after starting the Watch App on the Watch. During these 3 minutes my app's complications are only --. I can't ship it like this… My hunch is that somewhere the complication controller crashes, but it doesn't take my app down with it and thus my complications don't work any more. All other apps' complications do update alright though. Now my question is: is that a bug in Xcode, in WatchOS, or in my code? Will this happen when I first deploy my app on the App Store or will it be an issue with updates via App Store? Is this only relevant for my "local" build? Any hints where to hunt this bug?
Replies
1
Boosts
0
Views
2k
Activity
Oct ’22
Can't Load Image on Apple Watch Complications with New iOS 16 Widget
Image("sticker5")             .resizable()             .frame(width: 47, height: 47)             .scaledToFill() sticker5 is a picture with 94px * 94px. This is the size recommended by guideline. The Error is ComplicationsExtension[403:17806] [archiving] Widget archival failed due to image being too large [2] - (94, 94). We don't want to use low pixel images. That would look terrible. Please Help!
Replies
3
Boosts
1
Views
2.4k
Activity
Sep ’22
WatchOS9 - Widgetkit complications do not appear on simulator
Hi, I followed excactly the steps in https://developer.apple.com/videos/play/wwdc2022/10050 to add Widgetkit for watchOS to my existing iOS Widgets. Both widgets do work for iOS, but on my Apple Watch, my widget is invisible to be set as a complication. Any idea what I'm doing wrong? ... @available(iOSApplicationExtension 16.0, *) struct MyWidget: Widget {  private let kind: String = "MyWidget"     var body: some WidgetConfiguration {   return IntentConfiguration(kind: kind, intent: WidgetConfigurationIntent.self, provider: Provider()) { entry in    MyWidgetComponent(entry: entry)   }   .configurationDisplayName("widget_name_description".localized())   .description("widget_name_description".localized())   .supportedFamilies([.accessoryCircular, .accessoryRectangular, .accessoryInline])  } } @main struct MyAppWidgets: WidgetBundle {  #if os(watchOS)  var body: some Widget {   return MyWidget()  }  #else  var body: some Widget {   if #available(iOS 16.0, *) {    return WidgetBundleBuilder.buildBlock(OtherIosWidget(), MyWidget())   } else {    return OtherIosWidget()   }  }  #endif } ...
Replies
2
Boosts
0
Views
2.1k
Activity
Sep ’22
watchOS 9 complications - where do they go?
I have an app with Home Screen widgets, and new Lock Screen widgets, and I'm trying to get my complications to work on the Watch. The widgets are running off dynamic intents, taking a list of items from user defaults and providing that list for the user to choose when they add a Home Screen or Lock Screen widget. This works fine. In the "Complications and widgets: Reloaded" video from WWDC2022 at about 7:00 the guy tells you to duplicate the widget extension, rename it, and set it to run on watchOS. I ended up with these targets: Main App (embeds Widget, Intents Handler and Watch App) Widget Intents Handler Watch App (embeds Complications) Complications (new, copy of Widget) At about 8:30 he adds the supported families for the Watch to his EmojiRangersWidget WidgetConfiguration, so it looks like the code for the accessory widgets is used for both Lock Screen widgets and complications? Should I be putting all my complications views in the Widget target, something like this? @main struct WidgetEntry: Widget { public var body: some WidgetConfiguration { IntentConfiguration(kind: kWidgetKind, intent: DynamicItemSelectionIntent.self, provider: Provider() ) { entry in WidgetEntryView(entry: entry) } .configurationDisplayName("abc") .description("def") #if os(watchOS) .supportedFamilies([.accessoryCircular, .accessoryInline, .accessoryRectangular, .accessoryCorner]) #else .supportedFamilies([.accessoryCircular, .accessoryInline, .accessoryRectangular, .systemSmall, .systemMedium]) #endif } } struct WidgetEntryView: View { var entry: Provider.Entry @Environment(\.widgetFamily) var family @ViewBuilder var body: some View { #if os(watchOS) switch family { case .accessoryCircular, .accessoryCorner, .accessoryInline, .accessoryRectangular: ComplicationView(item: entry.item) @unknown default: UnknownComplicationView(item: entry.item) } #else switch family { case .accessoryCircular, .accessoryInline, .accessoryRectangular: LockScreenWidgetView(item: entry.item) case .systemSmall: SmallWidgetView(item: entry.item) case .systemMedium, .systemLarge, .systemExtraLarge: MediumWidgetView(item: entry.item) @unknown default: UnknownWidgetView(item: entry.item) } #endif } } I've previously been told by an Apple engineer on these forums: "The complication code should be in the watch app target. That's where watchOS 7 and 8 will look for complications, and where watchOS 9 will look for old ClockKit complications for migration to their WidgetKit counterparts." I'm no longer supporting watchOS 7/8, but does this mean that watchOS 7/8 will look for old complications in there to migrate to the new stuff into the Widget target? I asked a couple of follow-up questions but they never got answered ¯\_(ツ)_/¯ Apple make this stuff so unnecessarily complex, even though their videos make it look so easy. How many times have we all paused their videos to see exactly what code they're writing and where they're putting it? There's practically zero help out there - these forums are full of questions and few answers. Xcode should have much better documentation and help to guide you through this. It takes so long to get anything done because there just isn't the information we need.
Replies
1
Boosts
0
Views
2.4k
Activity
Sep ’22
WatchKit: Complications update failure
Hello, My AppleWatch app supports complications on X-Large and Modular WatchFaces. I use common data models for the complication families. I reload complications by calling server's reloadTimeline() and as the result my datasource's getCurrentTimelineEntry() is called. After that I get my complication on X-Large and Modular Faces updated. But sometimes complication on X-Large watchface is not updated on reloadTimeline() call or updated in a couple of minutes after the call. Though Modular complications works fine and do not have problems. Does anyone have similar problem with updates of X-Large complication?
Replies
0
Boosts
0
Views
630
Activity
Aug ’22
Please, eli5 me the flow to update AppleWatch complications in background, using data from iOS companion app
My god I feel so dumb. Please help. I have: an iOS app that displays calendar/reminders list (using EventKit data) a set of iOS widgets that also display these lists, but in a widget form the data fetch logic is shared, as well as most of the UI (everything's in SwiftUI) I'm trying to: create a WatchOS app and a a set of watch complications, to display calendars/reminders on the watch IMPORTANT: iOS app is the source of truth for all the data (it need to be post-processed after fetching from EventKit) Here's what works/flow fine (I understand how it works): iOS app updates its data upon launch (or EventKit update message). All good. iOS widgets update their data when iOS asks them to provide a new timeline. Widgets just reach out into EventKit directly on iPhone, and are done with everything (same device, enough processing power, direct access). All good. Watch app (as far as I understand), upon launch, would just need to send a request for data message to the iOS companion app, and iOS companion app would then just "push" the data back to the watch app (after post-processing it into a proper dictionary). So, I'm mostly good with it as well, I think. Watch app could update complications once it is launched and received data from iOS companion app (right?…) And here's where I'm stuck: I can't for the life of me to figure out what would be the flow to update Watch complications automatically in the background, using data from the iOS app's source of truth. I would assume it might be something like: watchOS requests a complication to provide its timeline (at whatever time it decides to do that - I can only be partially in control of the timing) complication, in turn, um…… calls the WatchOS app? (right?……) and requests the data required to build the timeline from the watch app once watch app receives that request from complication, it: sends request for data message to the companion iOS app receives the data from iOS app in a form of dictionary rebuilds the complication's timeline with the data it received from the iOS app Questions: Does the above flow sounds right at all? There does seem to be a lot of messages flowing around and between… Is it how it's supposed to be? What would be the very best approach to this situation? A simple flow outline would help immensely. I tried to look through the documentation and I'm feeling completely worn out… I can't connect the pieces and I just can't find the right place to start so I can untangle the logic (what starts when, request data from where, how) Any guidance is appreciated. I think I'm probably missing something very basic, but I have no idea what exactly :( Thanks! PS: I would like to support watchOS 8+, iOS 15+, so I guess newest additions to watchOS 9 are not applicable. I build everything in SwiftUI.
Replies
0
Boosts
1
Views
1k
Activity
Aug ’22
How to support VoiceOver on Apple Watch complication
Anyone dealt before with Apple Watch complications accessibility? I'm using CLKComplicationTemplateGraphicCornerGaugeText to display custom data but VoiceOver adds degrees (º) after saying the value. I've tried with accessibilityLabel on CLKTextProvider but doesn't fix it. Any idea? Thanks in advance!
Replies
1
Boosts
1
Views
2.3k
Activity
Aug ’22