ed11a11329
6 review-driven small fixes to the P0 commit series (e0b92ff/e93bab5/2e2d8e3/013c498). No behavior changes, no new features, no push yet. Code: - RED-1: Remove empty init() from OSGKeyboardApp; @StateObject is initialized inline and the only thing init() did was print a DEBUG log. - RED-4: Re-add .preferredColorScheme(.dark) to the 3 keyboard extension #Preview blocks. Custom keyboards always render dark; the preview should match. - RED-6: ThemedRoot #Preview blocks now use the new EnvironmentKey (\.themePalette) via a private ThemedPreviewContent, instead of hard-coding Palette.dark / Palette.light. - BUG-5: ThemedRoot body now also fills the background with the active palette's background color (repeats the colorScheme ternary — accepted because body must be a single expression). Docs: - DOC-1: CHANGELOG [Unreleased] top note: this is a v0.1.0 → v0.1.1 polish, nothing removed, iOS 26 SpeechAnalyzer still 0.2.0. - DOC-2: README + README.zh.md Limitations: explicit note for iOS 26+ users in v0.1.1. Verified: xcodebuild Debug-iphonesimulator BUILD SUCCEEDED, 8/8 unit tests pass on iPhone 17 sim (iOS 26.3.1).
4.0 KiB
4.0 KiB
Changelog
All notable changes to OSGKeyboard will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Note: v0.1.1 polish — this is a small follow-up to v0.1.0 focused on review-driven cleanup (theme follow-up, ASR robustness, debug-print hygiene, docs). No features are removed. The iOS 26
SpeechAnalyzerpath remains deferred to 0.2.0 (see below); v0.1.1 users continue to ship with the iOS 18SFSpeechRecognizerpath that shipped in v0.1.0. User experience is unchanged from v0.1.0.
Fixed
- Theme follows system appearance: main App now renders a true light palette in light mode via
ThemedRoot+EnvironmentKey<ThemePalette>. The keyboard extension deliberately stays dark (Apple's default) and now uses a transparent.background(Color.clear)so the system UI chrome shows through. - Speech Recognition permission requested on first press: added
NSSpeechRecognitionUsageDescriptionto both targets'Info.plistand an explicitSFSpeechRecognizer.requestAuthorizationcall insidepressBegan(). Without these the iOS 18 ASR path silently returned.deniedand the user heard nothing. - ASRService emits a DEBUG warning when on-device recognition isn't supported, so it's obvious during dev that the request fell back to cloud.
- App Group fallback behaviour:
- In
DEBUG, a missing App Group nowfatalErrors with a precise remediation message (was a soft print +.standardfallback, which desynced the keyboard extension from the main App). - In release, the fallback is preserved but logged via
NSLog.
- In
KeyboardViewController.loadPersistedLocaleself-check (DEBUG only) prints the active provider / baseURL / masked API key / mode / locale, so the keyboard extension's view of the App Group is visible in the device console.KeyboardViewController.handleFinalTranscripttyped-error routing:LLMError.noAPIKey(401) andLLMError.http(429)now surface as red, explicit error messages instead of silently inserting the raw transcript. Network / timeout errors still fall back to the raw transcript + error badge (no data loss).PolishingServicetimeout raised from 12 s to 15 s to align withLLMClient's URL request timeout. Previously the polisher would race the network call and discard a successful response that arrived in the 12–15 s window.- DEBUG
printcleanup: the four🔥 [OSGKeyboardApp] …instrumentation prints inOSGKeyboardApp.init()and root views are now wrapped in#if DEBUG.
Added
- "Test connection" button in
APISettingsCard: fires a singlepolish("ping")round-trip and surfaces success or the typed LLM error inline. Helps the user confirm the App Group + key are working without leaving the main App. - 5 new unit tests in
OSGKeyboardTests: App Group cross-process persistence, 401 / 429 / timeout / noAPIKey catch paths, andmode = .offshort-circuit.
Changed
- README +
README.zh.md: replaced<OWNER>placeholder withhkgoodand rephrased the iOS 26SpeechAnalyzerline as "planned for the next release" (the iOS 18SFSpeechRecognizerpath remains the only working ASR for v0.1).
Known limitations
- iOS 26
SpeechAnalyzer+DictationTranscriberon-device ASR is planned for 0.2.0 (moved out of Unreleased scope to keep the v0.1 release honest about what ships). - The keyboard does not work in password fields (iOS limitation).
- Microphone requires "Allow Full Access" to be enabled in iOS Settings.
- Whisper.cpp / on-device LLM polish is intentionally out of scope for v1 (cloud-only).
[0.2.0] - Planned
Added
- iOS 26+
SpeechAnalyzer+DictationTranscriberon-device ASR (lower latency, more locales). - Bilingual UI (中文 / English) driven by a real
Localizable.stringstable; will land alongside a Settings → Language picker.
[0.1.0] - 2026-06-17
Added
- First public pre-release.