feat: iCloud settings sync and cold-start return redesign

- Add iCloud key-value settings sync (engine/language/polish/Flow prefs);
  API keys stay on-device. New "Sync settings via iCloud" toggle.
- Redesign cold-start handoff: bottom-bar left-to-right swipe guidance,
  auto-dismiss on app switch, tap-anywhere to close, retained return link.
- Harden keyboard->app handoff with host-disconnected hint.
- Include prior Unreleased ASR fixes (route-change crash, fallback warning,
  multi-utterance recognition, local ASR diagnostics).

Release 0.5.0 (build 18).
This commit is contained in:
Rocky
2026-07-07 17:56:01 +08:00
parent bf844caa7f
commit 128aab1b02
42 changed files with 1818 additions and 337 deletions
@@ -80,7 +80,12 @@ public final class PersonalDictionaryCloudSync {
/// Enable sync: merge local + remote, persist locally, then upload.
public func enableSync() async throws {
let store = makeStore()
store.setPersonalDictionaryICloudSyncEnabled(true)
ICloudSyncPreferences.pushDictionaryEnabled(true, kvs: kvs)
ICloudSyncPreferences.cacheToAppGroup(
settingsEnabled: store.settingsICloudSyncEnabled,
dictionaryEnabled: true,
store: store
)
let local = store.personalDictionary
let remote = loadRemote() ?? .empty
@@ -90,7 +95,9 @@ public final class PersonalDictionaryCloudSync {
}
public func disableSync() {
makeStore().setPersonalDictionaryICloudSyncEnabled(false)
let store = makeStore()
ICloudSyncPreferences.pushDictionaryEnabled(false, kvs: kvs)
store.setPersonalDictionaryICloudSyncEnabled(false)
}
// MARK: - Core operations
@@ -8,6 +8,8 @@ import Foundation
public protocol UbiquitousKeyValueStoreing: AnyObject {
func data(forKey key: String) -> Data?
func set(_ value: Data?, forKey key: String)
func object(forKey key: String) -> Any?
func set(_ value: Any?, forKey key: String)
@discardableResult
func synchronize() -> Bool
}