Sitelet https://github.com/KeyboardKit/KeyboardKit/releases
Skip to content

Releases: KeyboardKit/KeyboardKit

11.0.3

Choose a tag to compare

@danielsaidi danielsaidi released this 08 Oct 14:39

This version makes the KeyboardAppHomeScreen support the iPhone Duo.

📱 App

  • KeyboardAppHomeScreen can now inject a custom content view builder.
  • KeyboardAppHomeScreen can now inject a selection and splitViewColumnVisibility.
  • KeyboardAppHomeScreenItem is a new enum that describes all home screen list menu items.
  • KeyboardAppHomeScreenDetail is a new content view that renders default KeyboardAppHomeScreenItem content.
  • KeyboardAppHomeScreenSplitViewMode is a new enum that can be used to set how the screen adapts to split view.
  • KeyboardAppHomeScreenStyle has a new sidebarBackgroundColor that can be used to customize the sidebar background.

⚙️ Settings

  • KeyboardSettingsScreen now shows a keyboard status section if needed.

🩺 Status

  • KeyboardStatusSectionStyle is renamed to KeyboardStatusSectionVisibility.
  • KeyboardStatusSectionVisibility no longer applies the system settings values.

11.0.2

Choose a tag to compare

@danielsaidi danielsaidi released this 08 Oct 14:04

This version makes the KeyboardAppHomeScreen support the iPhone Duo.

📱 App

  • KeyboardAppHomeScreen can now inject a custom content view builder.
  • KeyboardAppHomeScreen can now inject a selection and splitViewColumnVisibility.
  • KeyboardAppHomeScreenItem is a new enum that describes all home screen list menu items.
  • KeyboardAppHomeScreenDetail is a new content view that renders default KeyboardAppHomeScreenItem content.
  • KeyboardAppHomeScreenSplitViewMode is a new enum that can be used to set how the screen adapts to split view.
  • KeyboardAppHomeScreenStyle has a new sidebarBackgroundColor that can be used to customize the sidebar background.

⚙️ Settings

  • KeyboardSettingsScreen now shows a keyboard status section if needed.

🩺 Status

  • KeyboardStatusSectionStyle is renamed to KeyboardStatusSectionVisibility.
  • KeyboardStatusSectionVisibility no longer applies the system settings values.

11.0.1

Choose a tag to compare

@danielsaidi danielsaidi released this 02 Oct 11:28

KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch and MainActor.run code, which makes the library more stable. This work also involved making more types MainActor, while aiming to keep most of the library unchanged. The KeyboardContext proxy logic is thus moved to a new main actor-bound KeyboardControllerContext, to keep the core context versatile.

KeyboardKit 11 almost doubles the number of supported locales, bringing the total to 111. This is made possible by the improved diacritics engines, which now supports combination marks. As part of this, we have also improved the layout engine and harmonized many layouts, to keep them consistent across configuration changes, and fixed a bunch of incorrect swipe down actions on iPad.

KeyboardKit 11 also adds a new plugin architecture, which lets us move sensitive code, like permissions and system API usage, out of the core library. This plugin model is an exciting new part of KeyboardKit, and will let us build more capabilities and integrations outside of the core SDK, and let you decide which plugins you want to use.

Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.

💡 Biggest Changes

The biggest structural changes in KeyboardKit 11 that will most likely affect you, is how controller-related state has been moved from the keyboard context to the new controller context, and how dictation and host application detection now requires plugins to be enabled.

📦 Package

KeyboardKit 11 uses Swift 6.2 and strict concurrency, and defines brand new plugin products.

  • The package now uses Swift 6.2 and strict concurrency.
  • The package defines new KeyboardKit...Plugin products.
  • Many types are now Sendable, and types that need it are now @MainActor.
  • dSYMs are now included in the package, so there's no need for a separate download.

🌱 Essentials

KeyboardKit 11 cleans up large parts of the library and adds new, powerful diacritic support.

  • Keyboard.BackgroundStyle is a new, separate background style type.
  • Keyboard.Diacritic has new Apache, Choctaw, Hawaiian, Hebrew, Navajo, and Samoan variants.
  • Keyboard.Diacritic has new combiningMark replacement support.
  • Keyboard.DiacriticInsertionResult has been renamed to DiacriticReplacement.
  • Keyboard.Diacritic.CombiningMark is a new type with common combining marks.
  • Keyboard.SpacebarMenuTitle can now render an image.
  • Keyboard.SpacebarMenuType has a new layout menu that switches between the current locale's layout types.
  • Keyboard.SpacebarMenuType has a new dockEdge menu that switches the one-handed keyboard dock edge.
  • KeyboardContext has a new localePresentationCase that defaults to capitalized.
  • KeyboardControllerContext is a new context type for controller-specific state.
  • KeyboardInputViewController has a new setPreferredKeyboardCase() function.
  • KeyboardInputViewController's setup function can now inject autocomplete engines.
  • KeyboardInputViewController's setup function can now inject a host application resolver.
  • KeyboardSettings.isUndoManagerEnabled is now true by default.
  • KeyboardState has a new controllerContext property of type KeyboardControllerContext.
  • KeyboardViewDragGestureOverlay is a new view that maps drag gestures to layout items.
  • KeyboardViewDragGestureOverlayStyle is a new style that can be applied with .keyboardViewDragGestureOverlayStyle(_:).

💥 Actions

KeyboardKit 11 doesn't change the action model in any significant way.

  • KeyboardAction has a new isDiacriticAction property.

📱 App

KeyboardKit 11 adds new ways to instruct users how to return to the keyboard.

  • KeyboardAppOpenReasonMessage is a new message struct.
  • KeyboardAppOpenReasonMessageView is a new message view.

💡 Autocomplete

The new KeyboardKitAutocompletePlugin will be used to define additional autocomplete engines in future KeyboardKit versions.

  • KeyboardKitAutocompletePlugin is a new plugin package.
  • AutocompleteContext no longer uses dispatch queues to update itself.
  • AutocompleteContext.isLoading property has been removed.
  • AutocompleteContext has a new controllerThrottleInterval property.
  • AutocompleteEngine is now public and adjusted to align with the plugin.
  • AutocompleteEngineWithDownloadSupport is a new protocol.
  • AutocompleteService moves some logic to the engine protocol.
  • AutocompleteService has a new supportedLocales property.
  • AutocompleteService has a new warmUp() function.
  • AutocompleteService.autocomplete(_:updating:) is now async throws.
  • AutocompleteSettings.isAutoLearnEnabled has been removed.
  • AutocompleteSettingsScreen has been cleaned up and polished.
  • AutocompleteSuggestion has a new deleteBackwardsCount property.
  • AutocompleteSuggestion.isUnknown has been renamed to isCurrent.
  • AutocompleteSuggestionSource is a new enum with known sources.
  • StandardAutocompleteService warms up its engine to avoid launch hangs.
  • StandardAutocompleteService now honors the new delete backwards count.
  • KeyboardInputViewController now uses the new throttle interval to throttle autocomplete operations.

🎤 Dictation

The new KeyboardKitDictationPlugin makes it a lot easier to set up dictation, and isolates permissions to the plugin.

  • KeyboardKitDictationPlugin is a new plugin package.
  • KeyboardKit has new ways to inject a dictation engine.
  • DictationEngine defines a standard implementation in the plugin.
  • DictationKeyboardOverlay now enforces the DictationSettings.silenceLimit.
  • DictationMethod has been removed, since dictation now uses a single method.
  • DictationVolumeRecorder and DictationSpeechRecognizer have moved to the plugin.
  • KeyboardAppView can now inject a dictation engine, instead of .keyboardDictation(withEngine:).
  • PluginDictationEngine fixes some audio session warnings by moving to async AVFoundation APIs.
  • StandardDictationService has a new tryToReturnToKeyboardAfterStartingDictation(with:) function.
  • StandardDictationService has a new shouldTryToReturnToKeyboardAfterStartingDictation property.
  • StandardDictationService has been adjusted to apply a new locale if it changes while the session is idle.

🏠 Host Application

The new KeyboardKitHostPlugin contains all host application bundle ID logic, and isolates system API usage to the plugin.

  • KeyboardKitHostPlugin is a new plugin package.
  • KeyboardKit has new ways to inject a host application resolver.

🔣 Layout

This version harmonizes many layouts to keep them consistent across configuration changes.

  • Numeric iPad layouts adjust the bottom right keys to enable swipe down.
  • All layouts with 3 and 4 input rows now have the same total height.
  • KeyboardLayout has new itemFrames, item(at:) and action(at:) functions.

🌐 Localization

This version adds support for new locales, bringing the total number of supported locales to 111.

  • New supported locales:
    • Afrikaans
    • Basque (France)
    • Basque (Spain)
    • Bosnian
    • English (South Africa)
    • Esperanto
    • Galician (Spain)
    • Kalaallisut
    • Kyrgyz
    • Māori
    • Romansh
    • Samoan
    • Turkmen
    • Yiddish
    • Zulu
  • New supported Indigenous North American locales:
    • Apache
    • Blackfoot
    • Chickasaw
    • Chochenyo
    • Choctaw
    • Comanche
    • Kiowa
    • Lushootseed
    • Mvskoke
    • Nez Perce
    • Osage
    • Salish
    • Wixarika
  • New supported Sámi locales:
    • Kildin Sámi
    • Lule Sámi
    • Pite Sámi
    • Skolt Sámi
    • South Sámi
    • Ume Sámi

This version also updates locale information and localized input logic.

  • KeyboardSettings screens now uses LocalizedStringResource.
  • Locale no longer defines a flag and its list items just show text.

📄 Proxy

This version removes some task wrappers around async operations.

  • UITextDocumentProxy has new deleteFullDocumentContext functions.
  • UITextDocumentProxy.moveTextInputCursor functions are now async throws.

⚙️ Settings

KeyboardKit 11 rewrites the settings store to work better with Swift concurrency.

  • KeyboardSettings uses a new thread-safe store resolver.
  • KeyboardSettings now requires a deviceType when created.
  • KeyboardSettings has new resetStore(for:) and resetStore(forAppGroup:) functions.
  • KeyboardSettingsScreen has a new top keyboards section that links to the language settings screen.

🇻🇳 Vietnamese

KeyboardKit 11 drastically improves the Vietnamese input support.

  • Vietnamese.Diacritic has new combiningMark and combiningMarkChars properties.
  • Vietnamese.Diacritic.CombiningMark mirrors the base Keyboard.Diacritic.CombiningMark.
  • Vietnamese.Diacritic.mũ, móc and trăng can now be applied to vowels with tones, e.g. á + a => ấ.
  • Vietnamese.Diacritic.mũ and móc can now replace each other, e.g. ô + w => ơ, just like mũ and trăng.
  • VietnameseInputEngine can now apply tones to full words, e.g. Tuân + s becomes Tuấn and moi + j becomes mọi.

💥 Breaking changes

  • Vietnamese.allDiacriticVariantsFor* and Vietnamese.allDiacriticVowelVariants have been removed.

🐛 Bug Fixes

  • KeyboardAction adjusts the font for currencies like "kr".
  • KeyboardInputViewController now performs autocomplete on locale change.
  • KeyboardLayout has been fixed for Hawaiian, by applying a proper macron.

🚨 Breaking Changes

  • DictationMethod has been removed.
  • DictationSpeechRecognizer has moved to the dictation plugin.
  • `Dictation...
Read more

11.0.0

Choose a tag to compare

@danielsaidi danielsaidi released this 01 Oct 07:51

KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch and MainActor.run code, which makes the library more stable. This work also involved making more types MainActor, while aiming to keep most of the library unchanged. The KeyboardContext proxy logic is thus moved to a new main actor-bound KeyboardControllerContext, to keep the core context versatile.

KeyboardKit 11 almost doubles the number of supported locales, bringing the total to 111. This is made possible by the improved diacritics engines, which now supports combination marks. As part of this, we have also improved the layout engine and harmonized many layouts, to keep them consistent across configuration changes, and fixed a bunch of incorrect swipe down actions on iPad.

KeyboardKit 11 also adds a new plugin architecture, which lets us move sensitive code, like permissions and system API usage, out of the core library. This plugin model is an exciting new part of KeyboardKit, and will let us build more capabilities and integrations outside of the core SDK, and let you decide which plugins you want to use.

Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.

💡 Biggest Changes

The biggest structural changes in KeyboardKit 11 that will most likely affect you, is how controller-related state has been moved from the keyboard context to the new controller context, and how dictation and host application detection now requires plugins to be enabled.

📦 Package

KeyboardKit 11 uses Swift 6.2 and strict concurrency, and defines brand new plugin products.

  • The package now uses Swift 6.2 and strict concurrency.
  • The package defines new KeyboardKit...Plugin products.
  • Many types are now Sendable, and types that need it are now @MainActor.
  • dSYMs are now included in the package, so there's no need for a separate download.

🌱 Essentials

KeyboardKit 11 cleans up large parts of the library and adds new, powerful diacritic support.

  • Keyboard.BackgroundStyle is a new, separate background style type.
  • Keyboard.Diacritic has new Apache, Choctaw, Hawaiian, Hebrew, Navajo, and Samoan variants.
  • Keyboard.Diacritic has new combiningMark replacement support.
  • Keyboard.DiacriticInsertionResult has been renamed to DiacriticReplacement.
  • Keyboard.Diacritic.CombiningMark is a new type with common combining marks.
  • Keyboard.SpacebarMenuTitle can now render an image.
  • Keyboard.SpacebarMenuType has a new layout menu that switches between the current locale's layout types.
  • Keyboard.SpacebarMenuType has a new dockEdge menu that switches the one-handed keyboard dock edge.
  • KeyboardContext has a new localePresentationCase that defaults to capitalized.
  • KeyboardControllerContext is a new context type for controller-specific state.
  • KeyboardInputViewController has a new setPreferredKeyboardCase() function.
  • KeyboardInputViewController's setup function can now inject autocomplete engines.
  • KeyboardInputViewController's setup function can now inject a host application resolver.
  • KeyboardSettings.isUndoManagerEnabled is now true by default.
  • KeyboardState has a new controllerContext property of type KeyboardControllerContext.
  • KeyboardViewDragGestureOverlay is a new view that maps drag gestures to layout items.
  • KeyboardViewDragGestureOverlayStyle is a new style that can be applied with .keyboardViewDragGestureOverlayStyle(_:).

💥 Actions

KeyboardKit 11 doesn't change the action model in any significant way.

  • KeyboardAction has a new isDiacriticAction property.

📱 App

KeyboardKit 11 adds new ways to instruct users how to return to the keyboard.

  • KeyboardAppOpenReasonMessage is a new message struct.
  • KeyboardAppOpenReasonMessageView is a new message view.

💡 Autocomplete

The new KeyboardKitAutocompletePlugin will be used to define additional autocomplete engines in future KeyboardKit versions.

  • KeyboardKitAutocompletePlugin is a new plugin package.
  • AutocompleteContext no longer uses dispatch queues to update itself.
  • AutocompleteContext.isLoading property has been removed.
  • AutocompleteContext has a new controllerThrottleInterval property.
  • AutocompleteEngine is now public and adjusted to align with the plugin.
  • AutocompleteEngineWithDownloadSupport is a new protocol.
  • AutocompleteService moves some logic to the engine protocol.
  • AutocompleteService has a new supportedLocales property.
  • AutocompleteService has a new warmUp() function.
  • AutocompleteService.autocomplete(_:updating:) is now async throws.
  • AutocompleteSettings.isAutoLearnEnabled has been removed.
  • AutocompleteSettingsScreen has been cleaned up and polished.
  • AutocompleteSuggestion has a new deleteBackwardsCount property.
  • AutocompleteSuggestion.isUnknown has been renamed to isCurrent.
  • AutocompleteSuggestionSource is a new enum with known sources.
  • StandardAutocompleteService warms up its engine to avoid launch hangs.
  • StandardAutocompleteService now honors the new delete backwards count.
  • KeyboardInputViewController now uses the new throttle interval to throttle autocomplete operations.

🎤 Dictation

The new KeyboardKitDictationPlugin makes it a lot easier to set up dictation, and isolates permissions to the plugin.

  • KeyboardKitDictationPlugin is a new plugin package.
  • KeyboardKit has new ways to inject a dictation engine.
  • DictationEngine defines a standard implementation in the plugin.
  • DictationKeyboardOverlay now enforces the DictationSettings.silenceLimit.
  • DictationMethod has been removed, since dictation now uses a single method.
  • DictationVolumeRecorder and DictationSpeechRecognizer have moved to the plugin.
  • StandardDictationService has a new shouldTryToReturnToKeyboardAfterStartingDictation property.
  • StandardDictationService has a new tryToReturnToKeyboardAfterStartingDictation(with:) function.

🏠 Host Application

The new KeyboardKitHostPlugin contains all host application bundle ID logic, and isolates system API usage to the plugin.

  • KeyboardKitHostPlugin is a new plugin package.
  • KeyboardKit has new ways to inject a host application resolver.

🔣 Layout

This version harmonizes many layouts to keep them consistent across configuration changes.

  • Numeric iPad layouts adjust the bottom right keys to enable swipe down.
  • All layouts with 3 and 4 input rows now have the same total height.
  • KeyboardLayout has new itemFrames, item(at:) and action(at:) functions.

🌐 Localization

This version adds support for new locales, bringing the total number of supported locales to 111.

  • New supported locales:
    • Afrikaans
    • Basque (France)
    • Basque (Spain)
    • Bosnian
    • English (South Africa)
    • Esperanto
    • Galician (Spain)
    • Kalaallisut
    • Kyrgyz
    • Māori
    • Romansh
    • Samoan
    • Turkmen
    • Yiddish
    • Zulu
  • New supported Indigenous North American locales:
    • Apache
    • Blackfoot
    • Chickasaw
    • Chochenyo
    • Choctaw
    • Comanche
    • Kiowa
    • Lushootseed
    • Mvskoke
    • Nez Perce
    • Osage
    • Salish
    • Wixarika
  • New supported Sámi locales:
    • Kildin Sámi
    • Lule Sámi
    • Pite Sámi
    • Skolt Sámi
    • South Sámi
    • Ume Sámi

This version also updates locale information and localized input logic.

  • KeyboardSettings screens now uses LocalizedStringResource.
  • Locale no longer defines a flag and its list items just show text.

📄 Proxy

This version removes some task wrappers around async operations.

  • UITextDocumentProxy has new deleteFullDocumentContext functions.
  • UITextDocumentProxy.moveTextInputCursor functions are now async throws.

⚙️ Settings

KeyboardKit 11 rewrites the settings store to work better with Swift concurrency.

  • KeyboardSettings uses a new thread-safe store resolver.
  • KeyboardSettings now requires a deviceType when created.
  • KeyboardSettings has new resetStore(for:) and resetStore(forAppGroup:) functions.
  • KeyboardSettingsScreen has a new top keyboards section that links to the language settings screen.

🇻🇳 Vietnamese

KeyboardKit 11 drastically improves the Vietnamese input support.

  • Vietnamese.Diacritic has new combiningMark and combiningMarkChars properties.
  • Vietnamese.Diacritic.CombiningMark mirrors the base Keyboard.Diacritic.CombiningMark.
  • Vietnamese.Diacritic.mũ, móc and trăng can now be applied to vowels with tones, e.g. á + a => ấ.
  • Vietnamese.Diacritic.mũ and móc can now replace each other, e.g. ô + w => ơ, just like mũ and trăng.
  • VietnameseInputEngine can now apply tones to full words, e.g. Tuân + s becomes Tuấn and moi + j becomes mọi.

💥 Breaking changes

  • Vietnamese.allDiacriticVariantsFor* and Vietnamese.allDiacriticVowelVariants have been removed.

🐛 Bug Fixes

  • KeyboardAction adjusts the font for currencies like "kr".
  • KeyboardInputViewController now performs autocomplete on locale change.
  • KeyboardLayout has been fixed for Hawaiian, by applying a proper macron.

🚨 Breaking Changes

  • DictationMethod has been removed.
  • DictationSpeechRecognizer has moved to the dictation plugin.
  • DictationVolumeRecorder has moved to the dictation plugin.
  • GestureButtonScrollState has been removed.
  • KeyboardApp.keyboardSettingsKeyPrefix has been removed.
  • KeyboardAppHomeScreen separates keyboard settings from feature settings.
  • KeyboardAppHomeScreen settingsSection* localization and visibil...
Read more

10.9.7

Choose a tag to compare

@danielsaidi danielsaidi released this 01 Oct 06:41

This version rebuilds 10.9.6 with Xcode 26.

10.9.6

Choose a tag to compare

@danielsaidi danielsaidi released this 29 Sep 12:22

This version fixes a thread hang when enabling a custom input toolbar in iOS 27.

🏠 Host

  • KeyboardHostApplicationPicker now specialized KeyboardSettingsPicker.

🐛 Bug Fixes

  • KeyboardLayout no longer uses a .preview context default parameter, since that now causes a loop.

11.0-b.3

11.0-b.3 Pre-release
Pre-release

Choose a tag to compare

@danielsaidi danielsaidi released this 26 Sep 22:27

Important

KeyboardKit 11.0 Beta 3 is built with Xcode 27. If you're on Xcode 26 or earlier, use KeyboardKit 11.0 Beta 2.

KeyboardKit 11 uses Swift 6.2 and strict concurrency. This made it possible to remove a lot of dispatch and MainActor.run code, which makes the library more stable. This work also involved making more types MainActor, while aiming to keep most of the library unchanged. The KeyboardContext proxy logic is thus moved to a new main actor-bound KeyboardControllerContext, to keep the core context versatile.

KeyboardKit 11 almost doubles the number of supported locales, bringing the total to 111. This is made possible by the improved diacritics engines, which now supports combination marks. As part of this, we have also improved the layout engine and harmonized many layouts, to keep them consistent across configuration changes, and fixed a bunch of incorrect swipe down actions on iPad.

KeyboardKit 11 also adds a new plugin architecture, which lets us move sensitive code, like permissions and system API usage, out of the core library. This plugin model is an exciting new part of KeyboardKit, and will let us build more capabilities and integrations outside of the core SDK, and let you decide which plugins you want to use.

Finally, this version removes deprecated code, ends all experiments, and uses LocalizedStringResource for UI components localization.

📦 Package

KeyboardKit 11 uses Swift 6.2 and strict concurrency, and defines brand new plugin products.

  • The package now uses Swift 6.2 and strict concurrency.
  • The package defines new KeyboardKit...Plugin products.
  • Many types are now Sendable, and types that need it are now @MainActor.
  • dSYMs are now included in the package, so there's no need for a separate download.

🌱 Essentials

KeyboardKit 11 cleans up large parts of the library and adds new, powerful diacritic support.

  • Keyboard.BackgroundStyle is a new, separate background style type.
  • Keyboard.Diacritic has new Apache, Choctaw, Hawaiian, Hebrew, Navajo, and Samoan variants.
  • Keyboard.Diacritic has new combiningMark replacement support.
  • Keyboard.Diacritic.CombiningMark is a new type with common combining marks.
  • KeyboardContext has a new localePresentationCase that defaults to capitalized.
  • KeyboardControllerContext is a new context type for controller-specific state.
  • KeyboardInputViewController has a new setPreferredKeyboardCase() function.
  • KeyboardInputViewController's setup function can now inject autocomplete engines.
  • KeyboardInputViewController's setup function can now inject a host application resolver.
  • KeyboardSettings.isUndoManagerEnabled is now true by default.
  • KeyboardState has a new controllerContext property of type KeyboardControllerContext.

💥 Actions

KeyboardKit 11 doesn't change the action model in any significant way.

  • KeyboardAction has a new isDiacriticAction property.

💡 Autocomplete

The new KeyboardKitAutocompletePlugin will be used to define additional autocomplete engines in future KeyboardKit versions.

  • KeyboardKitAutocompletePlugin is a new plugin package.
  • AutocompleteContext no longer uses dispatch queues to update itself.
  • AutocompleteContext.isLoading property has been removed.
  • AutocompleteContext has a new controllerThrottleInterval property.
  • AutocompleteEngine is now public and adjusted to align with the plugin.
  • AutocompleteEngineWithDownloadSupport is a new protocol.
  • AutocompleteService moves some logic to the engine protocol.
  • AutocompleteService has a new supportedLocales property.
  • AutocompleteService has a new warmUp() function.
  • AutocompleteService.autocomplete(_:updating:) is now async throws.
  • AutocompleteSettings.isAutoLearnEnabled has been removed.
  • AutocompleteSettingsScreen has been cleaned up and polished.
  • AutocompleteSuggestion has a new deleteBackwardsCount property.
  • AutocompleteSuggestion.isUnknown has been renamed to isCurrent.
  • AutocompleteSuggestionSource is a new enum with known sources.
  • StandardAutocompleteService warms up its engine to avoid launch hangs.
  • StandardAutocompleteService now honors the new delete backwards count.
  • KeyboardInputViewController now uses the new throttle interval to throttle autocomplete operations.

🎤 Dictation

The new KeyboardKitDictationPlugin makes it a lot easier to set up dictation, and isolates permissions to the plugin.

  • KeyboardKitDictationPlugin is a new plugin package.
  • KeyboardKit has new ways to inject a dictation engine.
  • DictationEngine defines a standard implementation in the plugin.
  • DictationMethod has been removed, since dictation now uses a single method.
  • DictationVolumeRecorder and DictationSpeechRecognizer have moved to the plugin.

🏠 Host Application

The new KeyboardKitHostPlugin contains all host application bundle ID logic, and isolates system API usage to the plugin.

  • KeyboardKitHostPlugin is a new plugin package.
  • KeyboardKit has new ways to inject a host application resolver.

🔣 Layout

This version harmonizes many layouts to keep them consistent across configuration changes.

  • Numeric iPad layouts adjust the bottom right keys to enable swipe down.
  • All layouts with 3 and 4 input rows now have the same total height.

🌐 Localization

This version adds support for new locales, bringing the total number of supported locales to 111.

  • New supported locales:
    • Afrikaans
    • Basque (France)
    • Basque (Spain)
    • Bosnian
    • English (South Africa)
    • Esperanto
    • Galician (Spain)
    • Kalaallisut
    • Kyrgyz
    • Māori
    • Romansh
    • Samoan
    • Turkmen
    • Yiddish
    • Zulu
  • New supported Indigenous North American locales:
    • Apache
    • Blackfoot
    • Chickasaw
    • Chochenyo
    • Choctaw
    • Comanche
    • Kiowa
    • Lushootseed
    • Mvskoke
    • Nez Perce
    • Osage
    • Salish
    • Wixarika
  • New supported Sámi locales:
    • Kildin Sámi
    • Lule Sámi
    • Pite Sámi
    • Skolt Sámi
    • South Sámi
    • Ume Sámi
  • This version removes the flag property for all locales.
  • Most localization now uses LocalizedStringResource.

⚙️ Settings

KeyboardKit 11 rewrites the settings store to work better with Swift concurrency.

  • KeyboardSettings uses a new thread-safe store resolver.
  • KeyboardSettings now requires a deviceType when created.
  • KeyboardSettings has new resetStore(for:) and resetStore(forAppGroup:) functions.

🐛 Bug Fixes

  • KeyboardAction adjusts the font for currencies like "kr".
  • KeyboardInputViewController now performs autocomplete on locale change.
  • KeyboardLayout has been fixed for Hawaiian, by applying a proper macron.

🚨 Breaking Changes

  • DictationMethod has been removed.
  • DictationSpeechRecognizer has moved to the dictation plugin.
  • DictationVolumeRecorder has moved to the dictation plugin.
  • GestureButtonScrollState has been removed.
  • KeyboardApp.keyboardSettingsKeyPrefix has been removed.
  • KeyboardContext moves proxy logic to KeyboardControllerContext.
  • KeyboardContext moves Liquid Glass logic to ProcessInfo.
  • KeyboardContext.autocapitalizationTypeOverride has been removed.
  • KeyboardExperiment has no active experiments.
  • KeyboardExperimentContext has been removed.
  • KeyboardExperimentSettings has been removed.
  • KeyboardHostApplicationProvider has been removed.
  • KeyboardInputViewController lifecycle functions have been reduced.
  • KeyboardInputViewController now syncs to its contexts, not the other way around.
  • KeyboardInputViewController.originalTextDocumentProxy is now fully internal.
  • KeyboardSettings.store and .storeKeyPrefix are no longer mutable.
  • Locale.flag has been removed.
  • Locale.keyboardKitName has been removed.

11.0-b.2

11.0-b.2 Pre-release
Pre-release

Choose a tag to compare

@danielsaidi danielsaidi released this 21 Sep 08:39

Overview

KeyboardKit 11 bumps uses Swift 6.2 and strict concurrency. This helped us removing a lot of dispatch queue and MainActor.run code, which makes the keyboard engine more stable and thread-safe.

This version moves all proxy logic from the KeyboardContext to a new KeyboardControllerContext, which separates main actor state from the rest. This keeps the keyboard context versatile and easier to manage.

This version adds a new plugin architecture that lets us move sensitive code out of the core library. There are currently three plugins - KeyboardKitAutocompletePlugin, KeyboardKitDictationPlugin and KeyboardKitHostPlugin. See more in each feature section.

The plugin model is an exciting new part of KeyboardKit, and will allow us to add an extended ecosystem of capabilities to the SDK, and let you use the parts that you need.

Finally, this version removes deprecated code, ends all ongoing experiments, and makes localization use LocalizedStringResource.

Documentation

The KeyboardKit 11 beta documentation can be downloaded as a DocC archive zip file further down on this page.

Features

Here are some of the new things, separated into features.

📦 Package

KeyboardKit 11 uses Swift 6.2 and strict concurrency, and defines brand new plugin products.

  • The package now uses Swift 6.2 and strict concurrency.
  • The package defines new KeyboardKit...Plugin products.
  • Many types are now Sendable, and those that need it @MainActor.
  • dSyms are now included in the package - no need for a separate download.

🌱 Essentials

KeyboardKit 11 cleans up large parts of the library, and may remove parts that were previously soft-deprecated.

  • Keyboard.Background and Keyboard.BackgroundStyle are now separated.
  • KeyboardContext has a new localePresentationCase that defaults to capitalized.
  • KeyboardControllerContext is a new context type for controller-specific state.
  • KeyboardInputViewController has a new setPreferredKeyboardCase() function.
  • KeyboardInputViewController's setup function can now inject autocomplete engines.
  • KeyboardInputViewController's setup function can now inject a host application resolver.
  • KeyboardState has a new controllerContext property of type KeyboardControllerContext.

🧩 Extensions

KeyboardKit 11 adds a bunch of new extensions, and cleans up old ones that are no longer used by the library.

  • ProcessInfo has a new isLiquidGlassAvailable extension.

💡 Autocomplete

The new KeyboardKitAutocompletePlugin is currently empty, but will be used to define additional autocomplete engines in future KeyboardKit versions.

  • AutocompleteContext no longer uses dispatch queues to update itself.
  • AutocompleteContext's isLoading has been removed.
  • AutocompleteContext has a new controllerThrottleInterval property.
  • AutocompleteEngine is now public and adjusted to align with the plugin.
  • AutocompleteEngineWithDownloadSupport is a new protocol.
  • AutocompleteService moves some logic to the engine protocol.
  • AutocompleteService has a new supportedLocales property.
  • AutocompleteService has a new warmUp() function.
  • AutocompleteService.autocomplete(_:updating:) is now async throws.
  • AutocompleteSettings' isAutoLearnEnabled has been removed.
  • AutocompleteSettingsScreen has been cleaned up and polished.
  • AutocompleteSuggestion now defines a new .deleteBackwardsCount.
  • AutocompleteSuggestion's .isUnknown is renamed to isCurrent.
  • AutocompleteSuggestionSource is a new enum with known sources.
  • StandardAutocompleteService warms up its engine to avoid a launch hangs.
  • StandardAutocompleteService now honors the new delete backwards count.
  • KeyboardInputViewController will use the new context throttle to throttle autocomplete operations.

🎤 Dictation

The new KeyboardKitDictationPlugin makes it a LOT easier to set up dictation. You don't have to copy any code, since the plugin contains everything you need, and you must only add Info.plist permissions if you use the plugin.

  • is a new plugin package.
  • KeyboardKit has ways to inject a dictation engine.
  • DictationEngine defines a standard implementation in the plugin.
  • DictationMethod is removed, since dictation now uses a single method.
  • DictationVolumeRecorder and DictationSpeechRecognizer are now in the plugin.

🏠 Host Application

The new KeyboardKitHostPlugin contains all host application bundle ID logic, including all sensitive system API usages. This means that the system API usage is not completely opt-in for developers.

  • KeyboardKitHostApplication is a new plugin package.
  • KeyboardKit has ways to inject a host application resolver.

🌐 Localization

KeyboardKit 11 view localization now uses LocalizedStringResource instead of String. This makes it easier to localize these parts, and will let us localize these components in more locales in later versions.

  • All screen localization types now use LocalizedStringResource.

⚙️ Settings

KeyboardKit 11 has rewritten the settings store to work better with Swift concurrency.

  • KeyboardSettings uses a new thread-safe store resolver.
  • KeyboardSettings now requires a deviceType when created.
  • KeyboardSettings has new resetStore(for:) and resetStore(forAppGroup:) functions.

🐛 Big Fixes

  • KeyboardAction adjusts the presentation for multi-char currencies like "kr".
  • KeyboardInputViewController now performs a new autocomplete when the locale changes.

🚨 Breaking Changes

  • All deprecated code has been removed.
  • DictationMethod has been removed.
  • DictationSpeechRecognizer has been removed.
  • DictationVolumeRecorder has been removed.
  • GestureButtonScrollState has been removed.
  • KeyboardApp's .keyboardSettingsKeyPrefix has been removed.
  • KeyboardContext moves proxy logic to controller context.
  • KeyboardContext moves Liquid Glass logic to ProcessInfo.
  • KeyboardContext's .autocapitalizationTypeOverride has been.
  • KeyboardExperiment has no active experiments.
  • KeyboardExperimentContext has been removed.
  • KeyboardExperimentSettings has been removed.
  • KeyboardHostApplicationProvider has been removed.
  • KeyboardInputViewController lifecycle functions have been reduced.
  • KeyboardInputViewController now syncs to its contexts, not the other way.
  • KeyboardSettings.store and .storeKeyPrefix are no longer mutable values.
  • KeyboardInputViewController's .originalTextDocumentProxy is now fully internal.

10.9.5

Choose a tag to compare

@danielsaidi danielsaidi released this 20 Sep 21:17

This version fixes a scroll view blur bug in iOS 27.

11.0-b.1

11.0-b.1 Pre-release
Pre-release

Choose a tag to compare

@danielsaidi danielsaidi released this 11 Sep 12:45

Overview

This version bumps the package to Swift 6.2 and strict concurrency. This helped us removing a lot of dispatch queue and MainActor.run code, which makes the keyboard state and services more stable and safer to use.

This version moves all proxy-based logic from the KeyboardContext to a new KeyboardControllerContext, which separates the keyboard state from the (main actor) controller state. This makes the keyboard context easier to manage.

This version also adds a new plugin architecture that allows us to move sensitive or complex code out of the core library. There are currently two plugins - KeyboardKitDictationPlugin and KeyboardKitHostPlugin. See more below.

The new dictation plugin makes it a LOT easier to set up dictation than before. You don't have to copy code for a speech recognizer since the plugin contains both the standard engine, the recognizer and the volume recorder.

Finally, this version removes deprecated code, ends all ongoing experiments, and makes localization use LocalizedStringResource.

Documentation

The documentation for KeyboardKit 11 beta can be downloaded as a zip file that contains a DocC archive, further down on this page.

Plugins

The host application bundle logic has been extracted to a KeyboardKitHostApplication plugin package, which means that KeyboardKit no longer contains any code that uses Apple system APIs to resolve the host application bundle ID.

The dictation engine, speech recognizer and volume recorder have been moved to a separate KeyboardKitDictation plugin package, which means that the core library no longer requires permissions to be added to Info.plist.

The docs will be updated with information about how to use these plugins. For now, link KeyboardKitHostPlugin to your keyboard extension, KeyboardKitDictationPlugin to your main app, and import them where you need them.

  • import KeyboardKitHostPlugin adds a pluginHostApplicationResolver that can be injected into setupKeyboardKit(...).
  • import KeyboardKitDictationPlugin adds a pluginDictationEngine that can be injected into keyboardDictation(...).

The plugin model is an exciting new part of KeyboardKit, and will allow us to add an extended ecosystem of capabilities to the SDK, and let you use the parts that you need.

Features

Here are some of the new things, separated into features.

📦 Package

  • The package now uses Swift 6.2 and strict concurrency.
  • The package defines a new KeyboardKitHostApplication plugin.
  • The package defines a new KeyboardKitDictation plugin.
  • Many types are now Sendable, and those that need it @MainActor.
  • dSyms are now included in the package - no need for a separate download.

🌱 Essentials

  • Keyboard.Background and Keyboard.BackgroundStyle are now separated.
  • KeyboardControllerContext is a new context type for controller-specific state.
  • KeyboardInputViewController has a new setPreferredKeyboardCase() function.
  • KeyboardState has a new controllerContext property of type KeyboardControllerContext.

🧩 Extensions

  • ProcessInfo has a new isLiquidGlassAvailable extension.

💡 Autocomplete

  • AutocompleteContext no longer uses dispatch queues to update itself.
  • AutocompleteService has a new warmUp() function.
  • AutocompleteService.autocomplete(_:updating:) is now async throws.
  • AutocompleteSuggestion now defines a new .deleteBackwardsCount.
  • AutocompleteSuggestion.isUnknown has been renamed to isCurrent.
  • AutocompleteSuggestionSource is a new enum with known sources.
  • AutocompleteSuggestionType.unknown has been renamed to current.
  • StandardAutocompleteService warms up its engine to avoid a launch hangs.
  • StandardAutocompleteService now honors the new delete backwards count.

🎤 Dictation

  • KeyboardKitDictation is a new plugin package.
  • KeyboardKit has ways to inject a plugin dictation engine.
  • DictationEngine no longer has a standard engine in the library.
  • DictationMethod is removed since dictation is performed in a single way.
  • DictationVolumeRecorder and DictationSpeechRecognizer are now in the plugin.

🏠 Host Application

  • KeyboardKitHostApplication is a new plugin package.
  • KeyboardKit has ways to inject a plugin host application resolver.

🌐 Localization

  • All screen localization types now use LocalizedStringResource.

⚙️ Settings

  • KeyboardSettings uses a new thread-safe store resolver.
  • KeyboardSettings now requires a deviceType when created.
  • KeyboardSettings has new resetStore(for:) and resetStore(forAppGroup:) functions.

🚨 Breaking Changes

  • All deprecated code has been removed.
  • DictationMethod has been removed.
  • DictationSpeechRecognizer has been removed.
  • DictationVolumeRecorder has been removed.
  • GestureButtonScrollState has been removed.
  • KeyboardApp.keyboardSettingsKeyPrefix has been removed.
  • KeyboardContext moves logic to KeyboardControllerContext.
  • KeyboardContext.autocapitalizationTypeOverride has been removed.
  • KeyboardExperiment has no active experiments.
  • KeyboardExperimentContext has been removed.
  • KeyboardExperimentSettings has been removed.
  • KeyboardHostApplicationProvider has been removed.
  • KeyboardInputViewController lifecycle functions have been reduced.
  • KeyboardInputViewController now syncs to its contexts, not the other way.
  • KeyboardSettings.store and .storeKeyPrefix are no longer mutable values.
  • KeyboardInputViewController.originalTextDocumentProxy is now fully internal.