Files
OSGKeyboard/CHANGELOG.md
T
Zhongshu e93bab50b4 [P0-②] On-device ASR three-piece set
- Add NSSpeechRecognitionUsageDescription to both target Info.plists
- KeyboardViewController.requestSpeechPermission() wraps
  SFSpeechRecognizer.requestAuthorization
- pressBegan() now requests Speech permission right after mic permission
- ASRService emits a DEBUG warning when recognizer.supportsOnDeviceRecognition
  is false so cloud fallback is visible during dev
- CHANGELOG: move iOS 26 SpeechAnalyzer out of Unreleased into [0.2.0] Planned,
  so the iOS 18 SFSpeechRecognizer path is the only ASR shipped in v0.1

xcodebuild iOS Simulator: SUCCEEDED
2026-06-18 10:41:20 +08:00

3.6 KiB
Raw Blame History

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]

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 NSSpeechRecognitionUsageDescription to both targets' Info.plist and an explicit SFSpeechRecognizer.requestAuthorization call inside pressBegan(). Without these the iOS 18 ASR path silently returned .denied and 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 now fatalErrors with a precise remediation message (was a soft print + .standard fallback, which desynced the keyboard extension from the main App).
    • In release, the fallback is preserved but logged via NSLog.
  • KeyboardViewController.loadPersistedLocale self-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.handleFinalTranscript typed-error routing: LLMError.noAPIKey (401) and LLMError.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).
  • PolishingService timeout raised from 12 s to 15 s to align with LLMClient's URL request timeout. Previously the polisher would race the network call and discard a successful response that arrived in the 1215 s window.
  • DEBUG print cleanup: the four 🔥 [OSGKeyboardApp] … instrumentation prints in OSGKeyboardApp.init() and root views are now wrapped in #if DEBUG.

Added

  • "Test connection" button in APISettingsCard: fires a single polish("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, and mode = .off short-circuit.

Changed

  • README + README.zh.md: replaced <OWNER> placeholder with hkgood and rephrased the iOS 26 SpeechAnalyzer line as "planned for the next release" (the iOS 18 SFSpeechRecognizer path remains the only working ASR for v0.1).

Known limitations

  • iOS 26 SpeechAnalyzer + DictationTranscriber on-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 + DictationTranscriber on-device ASR (lower latency, more locales).
  • Bilingual UI (中文 / English) driven by a real Localizable.strings table; will land alongside a Settings → Language picker.

[0.1.0] - 2026-06-17

Added

  • First public pre-release.