WidgetKit

RSS for tag

Show relevant, glanceable content from your app on iOS and iPadOS Home Screen and Lock Screen, macOS Desktop, Apple Watch Smart Stack and Complications, and in StandBy mode on iPhone.

Posts under WidgetKit tag

200 Posts
Sort by:

Post

Replies

Boosts

Views

Activity

Handling reload of Widgets/Complications
I'm trying to find the best way to reload my Widgets and Complications. My App tries to show the current status vehicles. It gets the data using an API. And you don't know when this status changes. So I need to know when it makes sense to reload the widgets and complications. Here is a quote from the documentation: A widget’s budget applies to a 24-hour period. WidgetKit tunes the 24-hour window to the user’s daily usage pattern, which means the daily budget doesn’t necessarily reset at exactly midnight. For a widget the user frequently views, a daily budget typically includes from 40 to 70 refreshes. This rate roughly translates to widget reloads every 15 to 60 minutes, but it’s common for these intervals to vary due to the many factors involved. This is by far the worst "definition" if ever seen :( There is a 24 period, but you don't know when it starts and you don't know how much max refreshes you have and you also don't know how many refreshes you have left. How should someone develop a good solution with such a "definition"? So, I would like to know how you handle this? Perhaps a Apple engineer could light me up here :)
1
0
614
Oct ’23
Complications only allow you to select from 15 items?
Just finalising some work on my app update, and it seems that when you go to select an item to show in a complication, when you select your app in the list, the subsequent list only shows 15 of your items. If a user of my app has transferred 20 items to their Watch, they can't select five of them to be shown in a complication. Is that right? If that's a hard limit then I need to be able to separate them out into bunches of 15 items, or maybe have them display under A-E, F-J etc. Does this have to be done as a separate Widget in the WidgetBundle? And how do I do that? Given that I currently have one widget in that bundle that should show everything (20 items), how would I split it out to show an "A-E" widget with those items beginning with A...E? Do I have to have an A-E widget with its own set of data?
2
0
639
Oct ’23
Allowing taps only in vstack deep links within a HStack in widget
Hi, I would like to only allow taps on the deep link VStacks within the HStack. Here's the code snippet of the View: struct ThreeContactWidgetView: View { var entry: Provider.Entry var body: some View { HStack(spacing: 12) { Spacer() ForEach(contacts.prefix(3)) { contact in Link(destination: URL(string: "myApp://call?contactId=\(contact.identifier)")!) { VStack { Image(systemName: "person.crop.circle.fill") .resizable() .aspectRatio(contentMode: .fit) .clipShape(Circle()) Text("\((contact.givenName))") .font(.headline) .padding(.top, 4) } .frame(width: 100) } } Spacer() } .padding() .containerBackground(for: .widget) {} } } I tried placing Spacer().allowsHitTesting(false) for example. However, I was still able to tap on the Spacer() and go into the app, and strangely, uses the deep link of the last contact. Is it even possible to make certain parts of the widget un-tappable in the first place?
1
0
290
Oct ’23
WidgetKit widget is blank when app is installed from TestFlight
In our latest release, we noticed that the widget is blank when installed from TestFlight. This does not happen when we install the app from Xcode. The app is built using Xcode 15, and we have started using the new containerBackground API. But still the widget is blank when added. It can be resolved by restarting the device...But this is not a viable solution for our end-users. It only happens when using iOS 17 or iOS 17.1 Beta. When downloading the app from TestFlight on iOS 16, it works fine. I have tried looking in the console for any error, and found these: placeholder reload: No content - initial, (entry protected by: <private>) [[{BUNDLEID OF OUR WIDGET}:systemSmall:435336647345160163:(null)]] Security policy determined view will be empty: Keybag unlocked; Policy would prefer live entry, but couldn't find one to show; Couldn't find a placeholder to show. Content load failed: initial search for an existing archive was not found; session will be creating the content on demand:
1
0
694
Oct ’23
Cannot install watch app on watches running watchOS 7 & 8 after adding WidgetKit extension
In our most recent app update, we added a WidgetKit extension to our watch app. The WidgetKit extension has a minimum deployment target of watchOS 9, but the watch app has a minimum deployment target of watchOS 7. After releasing this update, we discovered customers running watchOS 7 & 8 can no longer install the app on their watch. When tapping the Install button in the Watch app on the phone, it spins for a while and then stops and returns to saying Install. No error message is displayed. If I build and run the iOS app through Xcode, I'm able to install the app on a watch running watchOS 8.8.1. However, I'm unable to install the app on the watch from TestFlight or the App Store. Has anyone else run into this or have any thoughts on what project settings we should look at to fix the issue?
4
1
686
Nov ’23
Unreliable Network Requests with Interactive Widgets in Production Environment
We've noticed that network requests triggered when a user interacts with our widget are very unreliable. In development, they almost always work, but in production, many of them never reach the server, especially when many requests are performed in a row. The requests are performed using the URLSession.shared singleton instance: let session = URLSession.shared let task = session.dataTask(with: request) { data, response, error in ... } task.resume() Are there any limitations or restrictions on Interactive Widgets in a production environment that might cause this behavior? Is there a different way to implement or configure widgets to ensure network requests are reliably performed? Thank you.
1
0
424
Oct ’23
Problem with image on WatchOS 10 Complication (WidgetKit)
I'm developing my app for WatchOS 10 with Xcode 15.0.1. I'm trying to make a complication with WidgetKit (SwiftUI) to make it easier the user to launch the app. I'm using a simple and small image 50x50px to test it first. But when I try to add to the Watch Face, it show a gray circle like there is nothing there. But when i'm editing the Watch Face it show the image :/, like the image bellow: And another problem is when is Accent mode, it fills the image with a gray color, as the image above shows it. I tryed to add monochrome png image with the alpha-channel, but even that didn't worked too. And my code is simpler has that: var body: some View { Image("Cat") } Someone is facing this same problem? Has any possible solution.
2
0
787
Oct ’23
Live Activity minimal presentation is cut off in iOS 17+
Hey there, I have noticed that my Live Activity's minimal presentation sometimes gets cut off when there is another app's Live Activity present. I tried adjusting the view in a number of ways, but it always seems to get cut off I'm just curious if this is a known issue with iOS 17, or if there is a potential workaround. This issue did not occur on iOS 16, and I've even updated to iOS 17.1 and the issue is still present. The view code is identical Here's the code that goes inside my minimal presentation ProgressView(timerInterval: Date.now...context.attributes.endDate, countsDown: true) { EmptyView() } currentValueLabel: { EmptyView() } .tint(.accent) And here is what ends up happening. I've also seen this with some of Apple's own Live Activities, so I'm assuming this is an iOS bug?
0
0
416
Oct ’23
Multiple Widget Extension Doesn’t show in Widget Gallery
I had two Widget Extensions, which are visible in the Widget Gallery. But the problem is another Widget Extension that I recently added. I have verified that the Widget Extension works fine in the Simulator, but when I deploy to TestFlight, the third Widget Extension I added is not visible in the Widget Gallery. I've been experimenting with this and have a few suspicions. #1 When I update the app, it doesn't get added to the Widget Gallery, but when I uninstall the app and reinstall the new version, it shows up in the Widget Gallery. This experiment makes me suspect that the new Widget Extension is missing for some reason during the update process. However, the counterpoint to this is that the second Widget Extension was added directly to the Widget Gallery upon update. It's strange that I only get this error when adding the 3rd Widget Extension. #2 This is actually the point that I think is causing it. When I was developing the 3rd Widget, 1 out of 10 times I would get the following log. I've looked around and found people like me who say they don't see it in the Widget Gallery, but I'm confused if this is the real culprit because it only comes up 1 out of 10 times. Also, if this error is the cause, why does uninstalling and reinstalling the app work? SendProcessControlEvent:toPid: encountered an error: Error Domain=com.apple.dt.deviceprocesscontrolservice Code=8 “Failed to show Widget ‘com.example.test.TestWidgets’ error: Error Domain=FBSOpenApplicationServiceErrorDomain Code=5 “The request to open “com.apple.springboard” failed.” UserInfo={NSLocalizedDescription=The request to open “com.apple.springboard” failed., NSLocalizedFailureReason=Unexpected error type., NSUnderlyingError=0x6000037e0690 {Error Domain=BSServiceConnectionErrorDomain Code=3 “XPC error received on message reply handler” UserInfo={BSErrorCodeDescription=OperationFailed, NSLocalizedFailureReason=XPC error received on message reply handler}}, BSErrorCodeDescription=InvalidResponse}.” UserInfo={NSLocalizedDescription=Failed to show Widget ‘com.mole.godlife.ScheduleWidgets’ error: Error Domain=FBSOpenApplicationServiceErrorDomain Code=5 “The request to open “com.apple.springboard” failed.” UserInfo={NSLocalizedDescription=The request to open “com.apple.springboard” failed., NSLocalizedFailureReason=Unexpected error type., NSUnderlyingError=0x6000037e0690 {Error Domain=BSServiceConnectionErrorDomain Code=3 “XPC error received on message reply handler” UserInfo={BSErrorCodeDescription=OperationFailed, NSLocalizedFailureReason=XPC error received on message reply handler}}, BSErrorCodeDescription=InvalidResponse}., NSUnderlyingError=0x6000037e0b10 {Error Domain=FBSOpenApplicationServiceErrorDomain Code=5 “The request to open “com.apple.springboard” failed.” UserInfo={NSLocalizedDescription=The request to open “com.apple.springboard” failed., NSLocalizedFailureReason=Unexpected error type., NSUnderlyingError=0x6000037e0690 {Error Domain=BSServiceConnectionErrorDomain Code=3 “XPC error received on message reply handler” UserInfo={BSErrorCodeDescription=OperationFailed, NSLocalizedFailureReason=XPC error received on message reply handler}}, BSErrorCodeDescription=InvalidResponse}}} Domain: DTXMessage Code: 1 User Info: {. DVTErrorCreationDateKey = “2023-10-26 23:19:56 +0000”; } — System Information. macOS Version 14.0 (Build 23A344) Xcode 15.0 (22265) (Build 15A240d) Timestamp: 2023-10-27T08:19:56+09:00 Summarize To summarize, I have 3 Widget Extensions, and the 3rd one is not showing up in the Widget Gallery. I have 2 suspicions as to why this is happening. First, the Widget Extension seems to get lost in the app update process, and second, there is an error message that comes up 1 out of 10 times, and I think that is the cause. I would love to hear your thoughts on this issue and if you need any additional information, I will provide it as soon as possible. Thank you for reading this long post.
0
1
346
Oct ’23
Widgets: Can you have a non-customisable static widget?
I want to add a large widget to my app, but it doesn't make sense to simply expand the information that's displayed in a small or medium widget to fill up the space of a large widget. Let's say I have a bunch of events in my app, and the user can add a small/medium widget to their Home Screen and choose which one of their events the widget shows. This is fine and works well, but for a large widget I want to have a totally different experience. I want to display the next four upcoming events in a list. These events are set by the order they're going to occur (date-wise) so you can't really pick which four you want to display, so I don't want to be able to edit the widget. However, if I add such a widget you can still hold down and edit the widget to select an event. Also - and I'm not sure why it does this - when you hold down and edit the widget, it displays the title and description that are assigned to my small/medium AppIntentConfiguration widget, and not the title and description that are provided to the large StaticConfiguration widget, i.e.: struct WidgetExtension: Widget // Small/medium dynamic widget { var body: some WidgetConfiguration { AppIntentConfiguration( kind: kWidgetKind, intent: WidgetEventIntent.self, provider: WidgetEventTimelineProvider() ) { entry in WidgetEntry(entry: entry) } .configurationDisplayName(smallMediumTitle). // This and the line below... .description(NSLocalizedString(smallMediumDescription) // are seen when editing the large widget .supportedFamilies([.systemSmall, .systemMedium]) } } struct WidgetExtension_Large: Widget // Large static widget { var body: some WidgetConfiguration { StaticConfiguration( kind: kWidgetKind, provider: WidgetEventTimelineProvider_Large() ) { entry in WidgetEntry_Large(entry: entry) } .configurationDisplayName(largeTitle) .description(largeDescription) .supportedFamilies([.systemLarge]) } } If it's not possible to have a non-editable widget, it might be more fun to let the user select four events themselves, so I'd need to change the large widget to an AppIntentConfiguration widget, but what would the four parameters look like? Currently, I have this for the small/medium widget that lets you select one event: @Parameter(title: "Event") var event: WidgetEventDetails? init(event: WidgetEventDetails? = nil) { self.event = event } init() { } static var parameterSummary: some ParameterSummary { Summary { \.$event } } How would I change it to select four events? It might be helpful to only be able to select a second event if a first one has been chosen, and a third if a first & second have been chosen etc. Any ideas? Thanks.
2
0
513
Oct ’23
ITMS-90626: Invalid Siri Support - No example phrase was provided for INSearchForMessagesInten
I've gotten the following error message a few times, does anyone know anything about it? I currently have a WidgetExtension and am suspecting that this is the circle. Your delivery was successful, but you may wish to correct the following issues in your next delivery: ITMS-90626: Invalid Siri Support - No example phrase was provided for INSearchForMessagesIntent in the 'en' language. Please refer to 'https://developer.apple.com/documentation/sirikit/registering_custom_vocabulary_with_sirikit/global_vocabulary_reference/intent_phrases' ITMS-90626: Invalid Siri Support - No example phrase was provided for INSetMessageAttributeIntent in the 'ko' language. Please refer to 'https://developer.apple.com/documentation/sirikit/registering_custom_vocabulary_with_sirikit/global_vocabulary_reference/intent_phrases' ITMS-90626: Invalid Siri Support - No example phrase was provided for INSetMessageAttributeIntent in the 'en' language. Please refer to 'https://developer.apple.com/documentation/sirikit/registering_custom_vocabulary_with_sirikit/global_vocabulary_reference/intent_phrases' ITMS-90626: Invalid Siri Support - No example phrase was provided for INSendMessageIntent in the 'ko' language. Please refer to 'https://developer.apple.com/documentation/sirikit/registering_custom_vocabulary_with_sirikit/global_vocabulary_reference/intent_phrases' ITMS-90626: Invalid Siri Support - No example phrase was provided for INSearchForMessagesIntent in the 'ko' language. Please refer to 'https://developer.apple.com/documentation/sirikit/registering_custom_vocabulary_with_sirikit/global_vocabulary_reference/intent_phrases' ITMS-90626: Invalid Siri Support - No example phrase was provided for INSendMessageIntent in the 'en' language. Please refer to 'https://developer.apple.com/documentation/sirikit/registering_custom_vocabulary_with_sirikit/global_vocabulary_reference/intent_phrases' After you’ve corrected the issues, you can upload a new binary to App Store Connect. Best regards,
0
1
622
Nov ’23
Implementing Apple Watch Widget Complications
I am trying to add Widget Complications to an existing Apple Watch app. I added the WatchOS widgets extension and followed instructions to create static, non-updating complications to merely launch the app from the watch home screen. Here is my code in the widget extension: import WidgetKit import SwiftUI struct Provider: TimelineProvider { func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) { } func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) { } func placeholder(in context: Context) -> SimpleEntry { SimpleEntry(date: Date()) } func snapshot(in context: Context) async -> SimpleEntry { SimpleEntry(date: Date()) } } struct SimpleEntry: TimelineEntry { let date: Date } struct TrapScores_WidgetsEntryView : View { @Environment(\.widgetFamily) var widgetFamily var entry: Provider.Entry var body: some View { switch widgetFamily { case .accessoryCorner: ComplicationCorner() case .accessoryCircular: ComplicationCircular() case .accessoryRectangular: Text("TrapScores") case .accessoryInline: Text("TrapScores") @unknown default: //mandatory as there are more widget families as in lockscreen widgets etc Text("AppIcon") } } } @main struct TrapScores_Widgets: Widget { let kind: String = "TrapScores_Complications" var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: Provider()) { entry in TrapScores_WidgetsEntryView(entry: entry) .containerBackground(.fill.secondary, for: .widget) } .configurationDisplayName("TrapScores") .description("This will launch TrapScores App") .supportedFamilies([.accessoryCorner, .accessoryCircular]) } } struct ComplicationCircular: View { var body: some View { Image("Graphic Circular") .widgetAccentable(true) .unredacted() } } struct ComplicationCorner: View { var body: some View { Image("Graphic Circular") .widgetAccentable(true) .unredacted() } } #Preview(as: .accessoryCircular) { TrapScores_Widgets() } timeline: { SimpleEntry(date: .now) } The complications appear fine in the preview: The complication can be added to the watch face, but no graphic comes with it and it is a blank circle: Any suggestions on what I'm doing wrong?
3
1
709
Nov ’23
In iOS 17 AppIntent, how we can perform dynamic data selection for Widget?
Before iOS17, when we implement "Edit widget" feature with dynamic data, we are using the following ways. Using an intent definition file Using an intent extension Here's the outcome. A searchable view controller Multi sectioned data view controller Here is the implementation intent definition file + intent extension class IntentHandler: INExtension, ConfigurationIntentHandling { func provideStickyNoteWidgetItemOptionsCollection(for intent: ConfigurationIntent, with completion: @escaping (INObjectCollection<StickyNoteWidgetItem>?, Error?) -> Void) { var stickyNoteWidgetItems = [StickyNoteWidgetItem]() var archivedStickyNoteWidgetItems = [StickyNoteWidgetItem]() let allStickyNoteWidgetItems = NSPlainNoteRepository.getStickyNoteWidgetItemsWithoutTrash() for allStickyNoteWidgetItem in allStickyNoteWidgetItems { if allStickyNoteWidgetItem.archived == 1 { archivedStickyNoteWidgetItems.append(allStickyNoteWidgetItem) } else { stickyNoteWidgetItems.append(allStickyNoteWidgetItem) } } var sections = [INObjectSection<StickyNoteWidgetItem>]() if !stickyNoteWidgetItems.isEmpty { let section = INObjectSection(title: nil, items: stickyNoteWidgetItems) sections.append(section) } if !archivedStickyNoteWidgetItems.isEmpty { let archivedSection = INObjectSection(title: "archive".localized, items: archivedStickyNoteWidgetItems) sections.append(archivedSection) } let collection = INObjectCollection(sections: sections) completion(collection, nil) } override func handler(for intent: INIntent) -> Any { // This is the default implementation. If you want different objects to handle different intents, // you can override this and return the handler you want for that particular intent. return self } } However, if I were using AppIntent in iOS17, I can only achieve the following Not searchable. Not section-able. Using AppIntent import Foundation import AppIntents @available(iOS 16.0, macOS 13.0, watchOS 9.0, tvOS 16.0, *) struct StickyNoteWidgetItemAppEntity: AppEntity { static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "StickyNoteWidgetItem") @Property(title: "archived") var archived: Bool? struct StickyNoteWidgetItemAppEntityQuery: EntityQuery { func entities(for identifiers: [StickyNoteWidgetItemAppEntity.ID]) async throws -> [StickyNoteWidgetItemAppEntity] { // TODO: return StickyNoteWidgetItemAppEntity entities with the specified identifiers here. return [] } func suggestedEntities() async throws -> [StickyNoteWidgetItemAppEntity] { // TODO: return likely StickyNoteWidgetItemAppEntity entities here. // This method is optional; the default implementation returns an empty array. return [ StickyNoteWidgetItemAppEntity(id: "id0", displayString: "note 0"), StickyNoteWidgetItemAppEntity(id: "id1", displayString: "note 1"), StickyNoteWidgetItemAppEntity(id: "id2", displayString: "note 2") ] } } static var defaultQuery = StickyNoteWidgetItemAppEntityQuery() var id: String // if your identifier is not a String, conform the entity to EntityIdentifierConvertible. var displayString: String var displayRepresentation: DisplayRepresentation { DisplayRepresentation(title: "\(displayString)") } init(id: String, displayString: String) { self.id = id self.displayString = displayString } } By using AppIntent, I would like to achieve what is previously achievable using intent defination file + intent extension Is that ever possible? Thanks.
0
1
572
Nov ’23
Apple Watch Modular Ultra face clips text and affects font positioning
I'm seeing problems with the new Apple Watch Modular Ultra Watch face... This is all using the latest WatchOS 10.1 and with WidgetKit complications. (Have also tested with the new WatchOS 10.2 beta in the simulator) The Graphic Circular (accessoryCircular) complications space the numbers differently sometimes causing maximum and minimum numbers to look like one long number (see small circular complications in screenshot) The exact same complication in the accessoryRectangular on the Modular Ultra face clips text when it doesn't on any other watch face I've filed feedback FB13344580 Hopefully the screenshots show the issue well.
1
0
676
Nov ’23
Widget not updated when selecting AppEnum with AppIntents
Hello, I'm new here so I apologize if this is obvious, but I can't seem to figure it out and I couldn't find anything online. I'm trying to select options for a widget using a drop-down, and provide the user with a limited list of options that will never change. I'm using an AppEnum as recommended. However, when selecting an element from the back of the widget, the widget doesn't update. Here's my code: import AppIntents import SwiftUI import WidgetKit struct TestProvider: AppIntentTimelineProvider { func placeholder(in context: Context) -> TestEntry { TestEntry(date: .now, bool: false, str: "Apple", enum1: TestEnum.test1) } func snapshot(for configuration: TestIntent, in context: Context) async -> TestEntry { return TestEntry(date: .now, bool: false, str: "Apple", enum1: TestEnum.test1) } func timeline(for configuration: TestIntent, in context: Context) async -> Timeline<TestEntry> { let testBool = configuration.bool let testStr = configuration.str return Timeline(entries: [ TestEntry( date: .now, bool: testBool, str: testStr, enum1: TestEnum.test1 ) ], policy: .atEnd) } } struct TestEntry: TimelineEntry { let date: Date let bool: Bool let str: String let enum1: TestEnum } struct TestIntent: AppIntent, WidgetConfigurationIntent { static var title: LocalizedStringResource = "Testing" static var description: IntentDescription = .init(stringLiteral: "1, 2, 3, testing") @Parameter(title: "Test bool") var bool: Bool @Parameter(title: "Test string", default: "Apple") var str: String @Parameter(title: "Test enum", default: .test1) var tenum: TestEnum } struct TestWidgetView: View { var entry: TestEntry var body: some View { VStack { Text(entry.str) .foregroundStyle(entry.bool ? .green : .red) Text(entry.enum1 == TestEnum.test1 ? "1" : "2") Text(entry.enum1.rawValue) } .containerBackground(for: .widget) {} } } struct testWidget: Widget { let kind: String = "Test Widget" var body: some WidgetConfiguration { AppIntentConfiguration(kind: kind, intent: TestIntent.self, provider: TestProvider()) { entry in TestWidgetView(entry: entry) } .configurationDisplayName("Test widget") .description("Just a test") .supportedFamilies([.systemSmall]) } } enum TestEnum: String, AppEnum { static var typeDisplayRepresentation: TypeDisplayRepresentation = "Test title 1" case test1 = "1" case test2 = "2" static var caseDisplayRepresentations: [TestEnum : DisplayRepresentation] = [ .test1: "test 1", .test2: "test 2" ] } #Preview(as: .systemSmall) { testWidget() } timeline: { TestEntry(date: .now, bool: false, str: "Apple", enum1: TestEnum.test1) } It's a pretty simple example. The widget updates correctly if I change the boolean or the string, but not if I change the enum selection. What am I doing wrong? Many thanks in advance for the help.
1
0
409
Nov ’23
The application and widget NSUbiquitousKeyValueStore sync problem
I found that the main application and widget NSUbiquitousKeyValueStore data is completely independent? (I signed in to the same iCloud account, the same AppGroup, the same iCloud Containers for the app and widget, and Key-value Storage was checked.) But when I get on the widget and modify NSUbiquitousKeyValueStore data, find the Key to the value of the same, such as in the screenshot, the main application of 'gemstone' value is 24, But the widget's value is still 0. I thought it was a synchronization problem, but using NSUbiquitousKeyValueStore.default.synchronize() or restart the App didn't solve the problem ... “Add Image”function can't used, this is the Logs: Main App Logs: ---ubiquitousKeyValueStoreDidChange ---Change reason: 0 ---The key 'experience' was updated to value '-28' ---UbiquitousKeyValueStoreDidChange: [AnyHashable("NSUbiquitousKeyValueStoreChangedKeysKey"): <__NSSingleObjectArrayI 0x280098960>( experience ) , AnyHashable("NSUbiquitousKeyValueStoreChangeReasonKey"): 0] ---ubiquitousKeyValueStoreDidChange ---Change reason: 0 ---The key 'gemstone' was updated to value '24' ---UbiquitousKeyValueStoreDidChange: [AnyHashable("NSUbiquitousKeyValueStoreChangedKeysKey"): <__NSSingleObjectArrayI 0x280081c70>( gemstone ) widget Logs: --- widget health: 0, level: 0, experience: 0 ---ubiquitousKeyValueStoreDidChange ---Change reason: 0 ---The key 'experience' was updated to value '2' ---UbiquitousKeyValueStoreDidChange: [AnyHashable("NSUbiquitousKeyValueStoreChangeReasonKey"): 0, AnyHashable("NSUbiquitousKeyValueStoreChangedKeysKey"): <__NSSingleObjectArrayI 0x159e752f0>( experience ) ] --- widget health: 0, level: 0, experience: 2 ---ubiquitousKeyValueStoreDidChange ---Change reason: 0 ---The key 'gemstone' was updated to value '2' ---UbiquitousKeyValueStoreDidChange: [AnyHashable("NSUbiquitousKeyValueStoreChangeReasonKey"): 0, AnyHashable("NSUbiquitousKeyValueStoreChangedKeysKey"): <__NSSingleObjectArrayI 0x15bb0cd80>( gemstone ) ]
2
0
418
Nov ’23