Post

Replies

Boosts

Views

Activity

Reply to What Does toolbarTitleDisplayMode Do?
This allows you to customize the appearance of the navigation bar title. You set it on the contents within a navigation stack (same place you specify a toolbar and navigation title). The new option that brought about this API is inlineLarge, which iOS 17 introduces. The App Store and TV apps use this style - you can see it in the Search tab. The difference from the large style is it’s pushed up further on screen, so there’s more room for your content (like ads in App Store), and it doesn’t support leading (or center) items.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Sep ’23
Reply to Interactive Widget (iOS 17) reload timeline on interaction
It is intentional behavior for the widget to reload upon performing an AppIntent. This is what enables the system to get a new timeline entry and animate between the old and new entries. Your code is not executing in the widget except to get a static “snapshot” and then the widget process may terminate, so the state is not being saved in memory to be able to modify upon tapping the button. With that being the case perhaps you can think of another way to achieve the desired behavior. For example perhaps you can persist the last liked item identifier in UserDefaults and show that instead of a random item. Probably need more than that to achieve what you have in mind but should point you in the right direction to persist to disk instead of relying on in-memory state.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Aug ’23
Reply to Is CLGeocoder free?
This API is free. If you reach the limit (which I believe is not documented and may vary), additional requests will fail for a period of time until you’re no longer rate limited. You will not be charged and there’s not a way to pay for additional requests if you wanted to.
Aug ’23
Reply to Xcode Cannot generate model encryption key
Same here, the model load request fails due to a 503 error. Filed FB11653274. Error Domain=com.apple.CoreML Code=8 "Fetching decryption key from server failed." UserInfo={NSLocalizedDescription=Fetching decryption key from server failed., NSUnderlyingError=0x28b08a310 {Error Domain=CKErrorDomain Code=6 "CKInternalErrorDomain: 2022" UserInfo={NSDebugDescription=CKInternalErrorDomain: 2022, RequestUUID=F7349D6B-6F83-4C92-84AD-51AF9D682735, NSLocalizedDescription=Request failed with http status code 503, CKErrorDescription=Request failed with http status code 503, CKRetryAfter=32, NSUnderlyingError=0x28b08a5b0 {Error Domain=CKInternalErrorDomain Code=2022 "Request failed with http status code 503" UserInfo={CKRetryAfter=32, CKHTTPStatus=503, CKErrorDescription=Request failed with http status code 503, RequestUUID=F7349D6B-6F83-4C92-84AD-51AF9D682735, NSLocalizedDescription=Request failed with http status code 503}}, CKHTTPStatus=503}}}
Oct ’22
Reply to WidgetKit and CoreData/CloudKit
In testing today, syncing in the background with NSPersistentCloudKitContainer seems to be working more reliably with the iOS 16 SDK. The first time you change something on another device it still seems to schedule a task to perform that work with utility priority (via -[NSCloudKitMirroringDelegate checkAndScheduleImportIfNecessary:andStartAfterDate:] which logs Scheduling automated import with activity CKSchedulerActivity priority 2 Utility), so it doesn't execute right away. If you change it again then I'm seeing it does immediately import the two accumulated changes (NSCloudKitMirroringDelegate Beginning automated import - ImportActivity - in response to activity, then -[PFCloudKitImportRecordsWorkItem applyAccumulatedChangesToStore:inManagedObjectContext:withStoreMonitor:madeChanges:error:] followed by NSCloudKitMirroringImportRequest Importing updated records) which triggers NSManagedObjectContextObjectsDidChange, NSPersistentStoreRemoteChange, and NSPersistentCloudKitContainer.eventChangedNotification. This process seems to repeat - the 3rd change will be scheduled, 4th will cause import. In my app, I have logic to detect if the widget needs to reload from NSManagedObjectContextObjectsDidChange examining the info in the notification's userInfo. In this specific scenario updating one record, NSRefreshedObjectsKey contains an instance of my NSManagedObject subclass, so I call WidgetCenter.shared.reloadAllTimelines() after DispatchQueue.main.async and the database is updated at that time so the widget gets a new timeline that includes the latest change. But do note that sync won't happen unless the app is open in the background as the remote notifications do not launch your app, so for example restarting the device will result in sync not occurring until they open the app again. Perhaps background task API can be explored to attempt to keep the widget up-to-date otherwise.
Topic: App & System Services SubTopic: iCloud Tags:
Jun ’22
Reply to What Does toolbarTitleDisplayMode Do?
This allows you to customize the appearance of the navigation bar title. You set it on the contents within a navigation stack (same place you specify a toolbar and navigation title). The new option that brought about this API is inlineLarge, which iOS 17 introduces. The App Store and TV apps use this style - you can see it in the Search tab. The difference from the large style is it’s pushed up further on screen, so there’s more room for your content (like ads in App Store), and it doesn’t support leading (or center) items.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Sep ’23
Reply to Interactive Widget (iOS 17) reload timeline on interaction
It is intentional behavior for the widget to reload upon performing an AppIntent. This is what enables the system to get a new timeline entry and animate between the old and new entries. Your code is not executing in the widget except to get a static “snapshot” and then the widget process may terminate, so the state is not being saved in memory to be able to modify upon tapping the button. With that being the case perhaps you can think of another way to achieve the desired behavior. For example perhaps you can persist the last liked item identifier in UserDefaults and show that instead of a random item. Probably need more than that to achieve what you have in mind but should point you in the right direction to persist to disk instead of relying on in-memory state.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Aug ’23
Reply to Is CLGeocoder free?
This API is free. If you reach the limit (which I believe is not documented and may vary), additional requests will fail for a period of time until you’re no longer rate limited. You will not be charged and there’s not a way to pay for additional requests if you wanted to.
Replies
Boosts
Views
Activity
Aug ’23
Reply to Xcode Cannot generate model encryption key
Same here, the model load request fails due to a 503 error. Filed FB11653274. Error Domain=com.apple.CoreML Code=8 "Fetching decryption key from server failed." UserInfo={NSLocalizedDescription=Fetching decryption key from server failed., NSUnderlyingError=0x28b08a310 {Error Domain=CKErrorDomain Code=6 "CKInternalErrorDomain: 2022" UserInfo={NSDebugDescription=CKInternalErrorDomain: 2022, RequestUUID=F7349D6B-6F83-4C92-84AD-51AF9D682735, NSLocalizedDescription=Request failed with http status code 503, CKErrorDescription=Request failed with http status code 503, CKRetryAfter=32, NSUnderlyingError=0x28b08a5b0 {Error Domain=CKInternalErrorDomain Code=2022 "Request failed with http status code 503" UserInfo={CKRetryAfter=32, CKHTTPStatus=503, CKErrorDescription=Request failed with http status code 503, RequestUUID=F7349D6B-6F83-4C92-84AD-51AF9D682735, NSLocalizedDescription=Request failed with http status code 503}}, CKHTTPStatus=503}}}
Replies
Boosts
Views
Activity
Oct ’22
Reply to WidgetKit and CoreData/CloudKit
In testing today, syncing in the background with NSPersistentCloudKitContainer seems to be working more reliably with the iOS 16 SDK. The first time you change something on another device it still seems to schedule a task to perform that work with utility priority (via -[NSCloudKitMirroringDelegate checkAndScheduleImportIfNecessary:andStartAfterDate:] which logs Scheduling automated import with activity CKSchedulerActivity priority 2 Utility), so it doesn't execute right away. If you change it again then I'm seeing it does immediately import the two accumulated changes (NSCloudKitMirroringDelegate Beginning automated import - ImportActivity - in response to activity, then -[PFCloudKitImportRecordsWorkItem applyAccumulatedChangesToStore:inManagedObjectContext:withStoreMonitor:madeChanges:error:] followed by NSCloudKitMirroringImportRequest Importing updated records) which triggers NSManagedObjectContextObjectsDidChange, NSPersistentStoreRemoteChange, and NSPersistentCloudKitContainer.eventChangedNotification. This process seems to repeat - the 3rd change will be scheduled, 4th will cause import. In my app, I have logic to detect if the widget needs to reload from NSManagedObjectContextObjectsDidChange examining the info in the notification's userInfo. In this specific scenario updating one record, NSRefreshedObjectsKey contains an instance of my NSManagedObject subclass, so I call WidgetCenter.shared.reloadAllTimelines() after DispatchQueue.main.async and the database is updated at that time so the widget gets a new timeline that includes the latest change. But do note that sync won't happen unless the app is open in the background as the remote notifications do not launch your app, so for example restarting the device will result in sync not occurring until they open the app again. Perhaps background task API can be explored to attempt to keep the widget up-to-date otherwise.
Topic: App & System Services SubTopic: iCloud Tags:
Replies
Boosts
Views
Activity
Jun ’22