KeyboardKit tries to honor semantic versioning:
- Deprecations can happen at any time.
- Deprecations should only be removed in
major
updates. - Breaking changes should not occur in
minor
andpatch
updates. - Breaking changes can occur in
minor
andpatch
updates, if needed.
These release notes only cover the current major version.
KeyboardKit 8.9 currently has a lot of deprecations, since the structure is being changed and types renamed to make the upcoming 9.0 cleaner.
KeyboardKit 9 is planned to be released shortly after the public release of iOS 18 and all corresponding OS versions. It will also bump the deployment target to iOS 15.
This version adjusts the access scope for Pro callout and layout services.
CalloutService.ProService
and all localized services are now properly open to inheritance.KeyboardLayoutService.ProService
and all localized services are now properly open to inheritance.
This version adds more KeyboardKit Pro shorthands, to make it even easier to initialize Pro services.
CalloutService
can resolve pro services with.localized(...)
. e.g..localized(.Albanian())
KeyboardLayoutService
can resolve pro services with.localized(...)
. e.g..localized(.Albanian())
This version fixes a few bugs.
The keyboard button gestures bug fix results in one less observable state.
Keyboard.Services
.tryRegisterLocalizedLayoutService
now expects the correct argument type.- The
.keyboardButtonGestures
modifier now correctly ignores secondary actions for cancelled gestures.
CalloutContext.ActionContext
endDragGesture()
has been replaced byhandleSelectedAction()
.
This version adds a new Keyboard.NumberPad
, next character prediction-based tap area sizes, and a KeyboardThemeContext
that let you persist themes. It also adds service shorthands, so that you can type .standard(...)
instead of KeyboardAction.StandardHandler(...)
.
This version also continues to rename types to make things more consistent. This means that are now many deprecations, which may be confusing, but it's all in service for a clean 9.0 transition.
KeyboardKit and KeyboardKit Pro are now built with Xcode 16, using the Swift 6 compiler.
This version lets you use a KeyboardApp
to set up your keyboard extension, and separates setting up the keyboard from setting up the keyboard view.
You can now call setup(for:)
(or setupPro(for:completion:)
for KeyboardKit Pro) in viewDidLoad()
, to set up App Group syncing, dictation, register your KeyboardKit Pro license key, etc., then use setupKeyboardView(_:)
in viewWillSetupKeyboardView()
.
This change means that you can set up KeyboardKit and KeyboardKit Pro earlier, and that setting up the view is identical for both SDKs. As a bonus, we can add more information to the KeyboardApp
over time, to let the setup function do more than it does today.
The two experimental modes for the next keyboard button have been reported to work well, and are now enabled by default:
Keyboard.NextKeyboardButtonControllerMode.current
now uses.experimentalNilTarget
Keyboard.NextKeyboardButtonProxyMode.current
now uses.experimental
If you experiment any problems with these new experimental modes, you can set each to .classic
to revert back. Make sure to report any problems, since these experimental modes are planned to replace the classic modes in KeyboardKit 9.0.
AutocompleteContext
has newnextCharacterPrediction(for:)
functions.DictationContext
can now be set up for aKeyboardApp
.Image
has a newkeyboardTheme
image value.Keyboard.NumberPad
is a new keyboard component.Keyboard.State
has a newthemeContext
property.Keyboard.Services
has a newtryRegisterLocalizedCalloutService
function.Keyboard.Services
has a newtryRegisterLocalizedLayoutService
function.KeyboardApp
has newdeepLinks
andkeyboardBundleId
properties.KeyboardCalloutService
has a newtryRegisterLocalizedService
function.KeyboardController
has a newsetup(for:)
to setup the keyboad for aKeyboardApp
.KeyboardInputController
can now be set up for aKeyboardApp
.KeyboardLayoutService
has a newtryRegisterLocalizedService
function.KeyboardSettings
can now be set up for aKeyboardApp
.KeyboardView
now applies next character probabilities to its items.KeyboardThemeContext
is a new context type for theme-related state.View+KeyboardButton
now supports applying extended tap areas to more probable keys.
KeyboardApp.HomeScreen
can now opt-in to link to the themes screen.KeyboardApp.ThemeScreen
is a new screen that can be used as a theme picker.
Color
andImage
extensions have been moved to theStyling
namespace.KeyboardAction.StandardHandler
improves auto-ignore to behave better.KeyboardApp
marks the old initializer as@_disfavoredOverload
.KeyboardContext
no longer syncs keyboard type for the same value.KeyboardContext
now starts withKeyboardType.alphabetic(.auto)
.KeyboardInputViewController.host
now handles the host bundle ID within the main app.KeyboardView
will show aKeyboard.NumberPad
if the.keyboardStyle
is.numberPad
.
Autocomplete.DisabledService
can be resolved with.disabled(...)
.Callouts.DisabledService
can be resolved with.disabled
.Callouts.StandardService
can be resolved with.standard(...)
.Dictation.DisabledService
can be resolved with.disabled
.Dictation.DisabledKeyboardService
can be resolved with.disabled(...)
.Feedback.DisabledService
can be resolved with.disabled
.Feedback.StandardService
can be resolved with.standard
.Gestures.SpaceDragGestureHandler
can be resolved with.spaceDrag
.KeyboardAction.StandardHandler
can be resolved with.standard(...)
.KeyboardLayout.DisabledService
can be resolved with.disabled
.KeyboardLayout.StandardService
can be resolved with.standard(...)
.KeyboardStyle.StandardService
can be resolved with.standard(...)
.
Autocomplete.LocalService
can be resolved with.local(...)
.Autocomplete.RemoteService
can be resolved with.remote(...)
.CalloutService
can be resolved with.localized(for: ...)
.Dictation.ProService
can be resolved with.pro(...)
.Dictation.ProKeyboardService
can be resolved with.proInKeyboard(...)
and.proInApp(...)
.KeyboardLayoutService
can be resolved with.localized(for: ...)
.KeyboardStyleService.ThemeBased
can be resolved with.themeBased(...)
.
- The documentation has been adjusted for Xcode 16.
- This protect against an undefined key error when instantiating a KeyboardInputViewController in an app.
KeyboardController
setup(with:)
has been renamed tosetupKeyboardView(_:)
.KeyboardController
viewWillSetupKeyboard()
has been renamed toviewWillSetupKeyboardView()
.KeyboardStyleProvider
and its related types are renamed toKeyboardStyleService
.
This version builds KeyboardKit Pro with Xcode 16 and Swift 6, to make the EmojiKeyboard scrolling work in iOS 18.
This version makes Keyboard.Services
sync service changes to the action handler, if possible.
This version re-adds the old way of opening URLs, but makes it work with iOS 18. This means that url actions are once again rendered as full-gesture buttons.
This version makes the dictation service use an OpenURLAction
to return to the previous app, since a keyboard action handler can't resolve a proper controller within the main app.
This version also adds support to the standard action handler and autocomplete context, for auto-ignoring words that have an autocorrection when pressing backspace. This will improve the typing experience a great deal.
The Keyboard.NextKeyboardButton
has two new experimental modes, that will hopefully remove the need to pass in a controller or use the shared one, and also keep the switcher working when typing within the keyboard.
Keyboard.NextKeyboardButtonControllerMode
is a temporary type that lets us test if we can create a next keyboard button without having to pass in a controller.
Set .current
to any of these values to try them out:
.classic
is the current mode that requires us to pass in a controller or use the shared one..experimental
is a new test mode that makes the button create an internal controller instead..experimentalNilTarget
is a new test mode that makes the button usenil
as the action target.
NextKeyboardButtonProxyMode
is a temporary type that lets us test if we can unregister an active textInputProxy
to let the user switch keyboard while typing in a text field within the keyboard.
Set .current
to any of these values to try them out:
.classic
doesn't reset the proxy and therefore doesn't let you switch keyboard while editing..experimental
is a new test mode that temporarily disables the proxy, which makes the switcher work.
Make sure to test these experimental features and report any findings in the KeyboardKit issue tracker.
AutocompleteContext
has a newisAutoIgnoreEnabled
property.KeyboardAction.StandardHandler
has many more functions for more granular control.KeyboardAction.StandardHandler
can now autocomplete ignore words when pressing backspace.UrlOpener
is a new protocol with a new default way to open a URL that also works in iOS 18.
KeyboardAction.url
will once again render as full gesture views.KeyboardContext.textInputProxy
is now a regularUITextDocumentProxy
.KeyboardInputViewController.textInputProxy
is now a regularUITextDocumentProxy
.
Dictation+ProKeyboardService
now logs when the App Group configuration seems wrong.Dictation+ProKeyboardService
now lets you provide aOpenURLAction
in the main app.KeyboardHostApplicationProvider
has a newhostApplicationBundleIdIsKnown
property.View+Dictation
now lets provide aOpenURLAction
to use to return to the previous app.
Dictation.ProKeyboardService
now corrently returns to any known host app.Dictation.ProKeyboardService
has now sets the dictation locale more reliably.Dictation.ProKeyboardService
has now handle background thread state updates better.
TextInputProxy
is no longer needed and has been deprecated.URL.keyboardSettings
has been renamed toURL.systemSettings
.
This version fixes things that break in Xcode 16 and iOS 18.
First of all, it makes multi-gesture buttons work in scroll views, when building from Xcode 16 and running on iOS 18. This is required for the KeyboardKit Pro emoji keyboard to work.
Second, this version makes .url
keyboard actions render as SwiftUI Link
s, since iOS 18 can no longer open URLs using the selector-based approach.
GestureButton
is a new inline dependency.Image
has a new.keyboardUrl
extension.
GestureButton
is used for all buttons instead of the deprecated one.KeyboardAction.url
will by default use the new.keyboardUrl
image.KeyboardAction.url
will by default render as a plainSwiftUI
Link
.
Dictation.DisabledKeyboardService
now resets its context on the main queue, which silences a background thread warning.
Gestures.GestureButton
and some related types have been deprecated.
- This patch fixes a
KeyboardAppView
bug that caused the locale to be strictly set to the first locale in the license, which did reset any manual changes.
This version fixes a keyboard button gesture bug.
Gestures.GestureButton
will now automatically cancel its pressed state if it hasn't received a second gesture event within 3 seconds.
This version fixes a few inconsistencies and bugs.
Autocomplete.ToolbarStyle
adjusts the minimum height from50
to48
to align closer with the native keyboards, while still leaving room for the standard callouts.
Autocomplete.LocalService
now correctly regards lexicon suggestions as pure complementary, since they (as they should) ignore the current casing, and therefore can mess up capitalization when typing.
This version continues to rename types to make things more consistent in the 9.0 release. This means that are currently many deprecated names (which may be confusing), but it's all in service for a clean 9.0.
This version also adds a new KeyboardApp
type that can be used to define all information for your app. This makes it easy to keep all app-specific information in one place, set up the main app target, etc.
This version also adds a new KeyboardAppView
view that can automatically set up main app to use App Group synced settings, register your KeyboardKit Pro license (if any), etc. This removes a lot of manual work.
This version deprecates the recently added settings types, and replaces them with adding persistency to the various context properties instead. This avoids having to keep the contexts in sync with the settings.
This version adds support for Emoji 15.1, which adds a bunch of new emojis, and also adds memory optimized emoji keyboard styles, which make the emoji keyboard consume a LOT less memory, by rendering lower resolution grid items.
This version also tweaks the emoji keyboard configuration for all device types, to make the emoji keyboard look a lot closer to the native emoji keyboard on all device types, including 13" iPads, in both portrait and landscape.
KeyboardKit Pro adds new settings screens, like KeyboardApp.SettingsScreen
and KeyboardApp.LocaleScreen
, which makes it a lot easier than before to add keyboard settings to the main app target, as well as to the keyboard.
This version has one breaking change. Due to how settings are now handled, the KeyboardSettings.store
no longer accept optional values. You can only replace this store with another valid store, and have a new isStoreSynced
property to see if you've successfully set up an app group-synced store.
AutocompleteContext
has new settings that replaceAutocompleteSettings
.Autocomplete.Suggestion
has a newtype
property which replaces the bools.Autocomplete.Suggestion
has a newsource
property to indicate its source.Bundle
has anisExtension
to help you check if code runs in an extension.DictationContext
has new setting values that replaceDictationSettings
.FeedbackContext
has new settings that replace theFeedbackSettings
type.FeedbackService
is a new service type that can trigger audio and haptic feedback.Image
has many new utility functions to make it easier to resolve keyboard icons.Keyboard.BottomRow
is no longer a Pro feature, but is available in the core library.Keyboard.Services
has a newfrequentEmojiProvider
and removes the static instance.Keyboard.StorageValue
is a new type that is used to persist codable types in storage.KeyboardAction.StandardHandler
uses an emoji provider instead of an injected handler.KeyboardAction.StandardHandler
has new functions to trigger audio and haptic feedback.KeyboardApp
is a new type that can be used to setup information for your keyboard app.KeyboardAppView
is a new view that can be used to setup your main keyboard app target.KeyboardContext
has a computedreturnKeyType
property, which can also be overridden.KeyboardContext
has new settings that replace theKeyboardSettings
settings properties.KeyboardContext
has a newreturnKeyTypeOverride
that can override which return key to use.KeyboardContext
has a newaddedLocales
settings that can be used to "activate" certain locales.KeyboardContext
now persists thekeyboardLocaleIdentifier
and restores the locale on next launch.KeyboardContext
now has even moreKeyboardLocale
-based versions of someLocale
-based functions.KeyboardLocale
has newListItem
&ListDragHandle
views to simplify building locale-based lists.KeyboardLocale.ContextMenu
now supports providing custom locales instead of using the context ones.KeyboardLocaleInfo
has newmatches(query:in:)
functionality to match locales on free-text queries.KeyboardSettings
has a newsetup
function for App Group-syncing and a newisAppGroupSynced
property.
EmojiCategory
has improved support for persistency.EmojiKeyboard
now renders better on 13" iPad devices.EmojiKeyboard
now displays a dismiss button on iPad devices.EmojiKeyboard
now adds an extra row if an input toolbar is used.EmojiKeyboardStyle
has memory.optimized
emoji keyboard styles.EmojiKeyboardStyle
now uses the new.optimized
styles by default.EmojiKeyboardStyle
has been adjusted to conform to new capabilities.EmojiVersion
supports Emoji 15.1 and adds new emojis to the keyboard.
AutocompleteContext
now stores many properties.Feedback.HapticConfiguration.disabled
now triggers.longPressOnSpace
.FeedbackContext
has changed the way it calculates its feedback configs.Keyboard.Services
layoutService
will now refresh the keyboard when set.KeyboardLayout.Configuration
uses a marginally taller input toolbar height.KeyboardInputViewController
now checks if self is nil when setting up a view.KeyboardView
now renders better on 13" iPad devices, due to more size tolerance.SystemKeyboard
will by default show a numeric input toolbar on large iPad devices.
Autocomplete.LocalService
now applies a source to its suggestions.Autocomplete.LocalService
now is now less aggressive with autocorrect.Autocomplete.LocalService
now lets you override next character prediction.Autocomplete.RemoteService
can now also perform next character prediction.KeyboardApp.HomeScreen
can now be configured to display a keyboard section.KeyboardApp.HomeScreen
has several new visibility and style configurations.KeyboardApp.SettingsScreen
is a new screen view that can manage various settings.
Autocomplete.LocalProvider
is now a typealias.Autocomplete.RemoteProvider
is now a typealias.CGSize.isScreenSize
now uses 50 points tolerance.View+KeyboardButton
explicitly applies an interactable background color.
-
Most service types are renamed to
*Service
for a more consistent naming. -
All
*Settings
types are deprecated since settings have moved to contexts. -
SystemKeyboard
has been renamed to the shorterKeyboardView
. -
SystemKeyboardBottomRow
has been renamed toKeyboard.BottomRow
. -
SystemKeyboardButtonPreview
has been renamed toKeyboard.ButtonPreview
. -
EmojiProvider
has been deprecated and is no more used by KeyboardKit. -
Feedback.HapticConfiguration.minimal
has been replaced by.disabled
. -
Gestures.KeyboardGesture
has been moved & renamed toKeyboard.Gesture.
-
Keyboard.SettingsLink
has been deprecated, since aLink
works as well. -
Keyboard.State
'sdictationConfig
is now defined within thedictationContext
. -
KeyboardAppearanceViewModifier
has been deprecated, since it didn't behave well. -
KeyboardSettings
settings properties have been deprecated and moved to the context.
This patch defers some heavy memory allocations that is unintentionally caused by the emoji keyboard, by only loading the keyboard when it's requested.
While the emoji keyboard may still cause memory pressure in keyboard extensions that load other heavy components into memory, it will not affect these keyboards on load.
The memory issues are described in a GitHub issue, and seems to be caused by SwiftUI. You can reproduce it by just adding the emoji keyboard to the extension and scroll through the categories.
This memory issue is a top priority, that must be fixed in the upcoming 8.8.
Callouts.DisabledActionProvider
is a new, disabled action provider.KeyboardLayout.DisabledProvider
is a new, disabled layout provider.
- Hebrew now uses a newline arrow instead of text.
SystemKeyboard
only loads the emoji keyboard when the keyboard type is.emojis
.
Keyboard.Services
now properly applies an inverse offset for RTL locales.
This version improves the overall autocomplete behavior.
The local autocomplete service will now return proper unknown statuses and suggest any lexicon matches as autocorrections. The standard action handler will automatically ask the autocomplete provider to learn any applied unknown suggestions, if isAutoLearnEnabled
is true
.
This way to learn unknown suggestions will hopefully solve many frustrations involved with autocomplete, where the provider will behave better over time. Please provide feedback if these adjustments don't behave as expected.
The local autocomplete service can also perform next character prediction, by providing it with the typed text and a list of suggestions. This will be merged with the autocomplete operation in version 9.0.
The autocomplete context also has new ways of registering your own custom autocorrections for any locale, in case you find the default behavior to be lacking in some areas.
Furthermore, this version adds new persistent settings types, adds a KeyboardLocaleInfo
protocol to make KeyboardLocale
and Locale
share many properties, and makes it possible to define which text to use when ending the current sentence.
AutocompleteService
and all implementations have been renamed to use the newService
name.Autocomplete.LocalService
no longer caps suggestions by default. That responsibility is moved to the context.Autocomplete.ToolbarItem
no longer adds quotations around unknown suggestions. That responsibility is moved toAutocompleteService
.KeyboardInputViewController
now checks more things before performing autocomplete, for instance the keyboard contextprefersAutocomplete
.KeyboardStyleProvider
andKeyboard.ButtonStyle
now supports nativeFont
s. This may cause some breaking changes that should be easy to fix.
AutocompleteSettings
is a new observable settings type.DictationSettings
is a new observable settings type.FeedbackSettings
is a new observable settings type.Keyboard.Settings
is a new settings wrapper.
Autocomplete.Suggestion
has new functions.Autocomplete.TextReplacementDictionary
is new type.AutocompleteContext
has a newautocorrectDictionary
value.AutocompleteContext
has a newisAutoLearnEnabled
property.AutocompleteContext
has a newsuggestionDisplayCount
property.AutocompleteContext
has a newsuggestionsFromService
property.AutocompleteService
has a newnextCharacterPredictions
function.AutocompleteService
has newignoreWords(_:)
and suggestion functions.KeyboardBehavior
and its implementations have a newendSentenceText
property.KeyboardAction.StandardProvider
can now automatically learn unknown suggestions.KeyboardContext
has a newsyncKeyboardType(with:)
to sync type with the proxy.KeyboardController
has a newendSentence(withText:)
function to end sentences.KeyboardInputViewController
has a newsettings
property for setting instances.KeyboardInputViewController
has a newviewWillSetupInitialKeyboardType
method.KeyboardLocaleInfo
is a new protocol that is shared by KeyboardLocale and Locale.KeyboardSettings
has new ways to register a custom store and settings key prefix.KeyboardStyleProvioder
has new ways to register a custom store and settings key prefix.UserDefaults
has a new.keyboardSettings
value that can be used to persist data.
Autocomplete.Toolbar
no longer needs an injected locale.Autocomplete.ToolbarItem
no longer needs an injected locale.Autocomplete.ToolbarItem
no longer adds quotations to unknown suggestions.KeyboardContex
prefersAutocomplete
is now computed and no longer synced.KeyboardInputViewController
now checksKeyboardContext.prefersAutocomplete
.KeyboardLayout.iPhoneProvider
now handles more keyboard types in a better way.KeyboardSettings
have been converted from a namespace to being a part ofKeyboard
.KeyboardStyle.StandardProvider
now sets a smaller font size for the.text
action type.
Autocomplete.LocalService
no longer takes amaxCount
parameter.Autocomplete.LocalService
will now return lexicon matches as autocorrections.Autocomplete.LocalService
will now return proper unknown state for suggestions.Dictation.ProKeyboardService
uses an action handler to open app and navigate back.Emoji.KeyboardMenu
will now trigger haptic feedback when tapping an emoji category.KeyboardHostApplication
now implementsIdentifiable
and has a newname
property.KeyboardHostApplication
now defines even more applications and has aurl
property.KeyboardHostApplicationProvider
is a new protocol that is implemented by some types.
KeyboardAction.text
now properly renders its texts.KeyboardInputViewController
now sets the initial keyboard type when the native type is ready.KeyboardLayout.iPhoneProvider
no longer inserts two . keys for email keyboards with a go key.UITextDocumentProxy
now proceeds inserting a word replacement even if there's no current word.
Keyboard.ReturnKeyType
prefersAutocomplete
has been deprecated, since the keyboard type should determine this.
This version adds support for 5 new locales, support for diacritics, and makes it easier to identify the host application. It also improves many of the localized system keyboards that are provided by Pro.
This version also changes the default autocomplete behavior, by making KeyboardInputViewController
only use the pre-cursor part of the current word for autocomplete, which is how the native keyboard behaves.
This version also makes KeyboardKit Pro no longer overwrite custom services that are set before registering a license. This means that you can now apply custom services at any time, without it being overwritten.
This version also reduces load times and memory usage in KeyboardKit Pro, by lazily resolving localized callout action providers and layout providers, and makes all supported locales use the iPad Pro layout.
Keyboard.Accent
is a new typealias for diacritics.Keyboard.Diacritic
is a new type that lets you model diacritics.KeyboardAction.accent
is a new typealias for the.diacritic
action.KeyboardAction.diacritic
is a new action that lets you insert diacritics.KeyboardController
has a newinsertDiacritic(_:)
function.KeyboardLayout
and itsItem
has much new functionality.KeyboardLocale
has new locale-based initializers and matching functions.UITextDocumentProxy
has a newinsertDiacritic(_:)
function.
KeyboardInputViewController
autocompleteText
now uses the pre-cursor part of the current word, instead of the full word.KeyboardInputViewController
hostBundleId
has been renamed tohostApplicationBundleId
.
- French (Canada) - fr_CA
- Norwegian (Nynorsk) - nn
- Spanish (Latin America) - es_419
- Spanish (Mexico) - es_MX
- Welsh - cy
-
Callouts.StandardActionProvider
now allocates license services lazily, on demand. -
Keyboard.ToggleToolbar
can now use an external toggle binding. -
Keyboard.ToggleToolbar
no longer relies on a standardAnyView
. -
Keyboard.ToggleToolbarToggle
is a new, customizable toolbar toggle. -
KeyboardContext
has a newhostApplication
property. -
KeyboardHostApplication
is a new enum with known applications. -
KeyboardInputViewController
has a newhostApplication
property. -
KeyboardInputViewController
setupPro
no longer creates a new callout provider. -
KeyboardInputViewController
setupPro
no longer creates a new layout provider. -
KeyboardLayout
has a newLatinLayoutType
enum. -
KeyboardLayout.ProProvider.Czech
now uses proper diacritic keys on iPhone & iPad. -
KeyboardLayout.StandardProvider
now allocates license services lazily, on demand. -
KeyboardLocale.georgian
no longer uses regular font weight in alphabetic keyboard. -
KeyboardLocale.norwegian
has adjusted callout actions. -
These locales now use iPad Pro layout:
- Arabic
- Belarusian
- Bulgarian
- Catalan
- Cherokee
- Hebrew
- Kazakh
- Kurdish Sorani
- Kurdish Sorani - Arabic
- Kurdish Sorani - PC
- Persian
-
These locales have improved iPad Pro layouts:
- French (Switzerland)
- Greek
- Inari Sami
- Macedonian
- Mongolian
-
These locales have improved iPhone layouts:
- Arabic
KeyboardAction.tab
now uses an LTR/RTL supporting icon.KeyboardContext
now matcheskeyboardLocale
on language code as well, to work around system bug.
This version makes it easier to create a themed style provider, and adds a new .numberPad
keyboard type.
Keyboard.KeyboardType
has a new.numberPad
type.KeyboardStyleProvider.themed
has new convenience apis.
KeyboardContext
will now get its initial keyboard type set to the document text proxy's keyboard type.
This version adds a licenseError
parameter to setupPro
.
As such, the setupProError
in KeyboardInputViewController
is deprecated and no longer used.
This version adds a new SystemKeyboardBottomRow
component, adds some new actions and fixes a bug.
KeyboardAction
has a new.text
action to insert long text.KeyboardLayout
has a new.bottomRowSystemItemWidth
property.SystemKeyboardComponent
is a new protocol that defines shared typealiases.
KeyboardAction.url
is now a system key.
SystemKeyboardBottomRow
is a new Pro component.
SystemKeyboard
no longer shows the emoji key for insufficient KeyboardKit Pro licenses.
This version adjusts the autocomplete behavior for empty text and fixes a gesture bug.
KeyboardInputViewController
no longer hard resets the autocomplete context when the text is empty.
KeyboardGesture
has a new.end
gesture, which is used to fix a bug that could cause space drag to never end.
- KeyboardKit Pro has new ways to allow more flexible feature and tier validation.
This version moves many types into their related namespaces, to make the SDK surface smaller and easier to overview. Since this involves many renamings, the Deprecations
section below only lists deprecated types.
The library has deprecation types to help you migrate to the new type names, so you should not run into any breaking changes when migrating from earlier versions to this one.
The KeyboardState
namespace has been renamed to KeyboardStatus
, since it was often confused with Keyboard.KeyboardState
. Keyboard.KeyboardState
& Keyboard.KeyboardServices
have also been renamed to the shorter Keyboard.State
and Keyboard.Services
, since it reads better in code.
This version also makes it easier register custom audio and haptic feedback, in a way that now requires less or no customizations in the action handler. Just register any custom feedback for any gesture on any action, and it will be triggered by the standard action handler.
This version also makes the action and input callout bubbles look more native.
Finally, KeyboardKit Pro makes more locales use the new iPad Pro layout. It also provides a brand new KeyboardApp.HomeScreen
that can be used as an app home screen, and a new KeyboardStatus.Section
that can show all relevant statuses for a keyboard app.
- Many types are moved into their related namespaces.
- The
EmojiKeyboard
sub-components are now throwing as well. - The
KeyboardStatus.Label
now uses its style to change icons. - Renamed types use
@available
deprecations to help adjust your code.
Feedback.Audio
has a newcustomUrl
that can play URL-based audio.Feedback.AudioConfiguration
has new ways to register custom feedback.Feedback.HapticConfiguration
has new ways to register custom feedback.FeedbackContext
has new ways to register custom audio/haptic feedback.KeyboardLayout
has a newcopy()
function that creates a mutable copy.KeyboardLayout
has new functions for using and tweaking the bottom row.KeyboardLayout
has a newinputToolbarLayout()
value builder function.KeyboardLayout
has a new functions for getting the total layout height.SystemKeyboard
's service-based initializer now allows a layout override.View
has a newkeyboardInputToolbarDisplayMode
modifier for input toolbars.
Callouts
now use curves that look a lot more native.Keyboard.Button
no longer has a minimum scale factor.KeyboardApp
is a new namespace for app-related types.KeyboardApp.HomeScreen
is a new app home screen view template.KeyboardLayout.Configuration
now defines number toolbar height.KeyboardFeedback
is a new namespace for feedback-related types.KeyboardSettings
is a new namespace for settings-related types.KeyboardStatus.Label
now uses filled icon variants, by default.KeyboardStyle.StandardProvider
now applies a light weight to backspace.KeyboardStyle.StandardProvider
now applies more adaptive content insets.SystemKeyboard
has been optimized in how it renders the system keyboard.
KeyboardApp.HomeScreen
is a new app-specific home screen template.KeyboardStatus
has a newSection
view that can display keyboard statuses.KeyboardTextField
andKeyboardTextView
can now trigger a customonSubmit
function.SystemKeyboard
now has anaddNumberToolbar
parameter to add a number toolbar in KeyboardKit Pro.- The iPad Pro layout has been tweaked to look more native, and is now used by all these locales as well:
Catalan
,Czech
,Danish
,Faroese
,Finnish
,Georgian
,German
,German (Austria)
,German (Switzerland)
,Greek
,Hawaiian
,Icelandic
,Inari Sámi
,Macedonian
,Maltese
,Mongolian
,Northern Sámi
,Norwegian
,Russian
,Serbian
,Slovak
,Turkish
,Ukrainian
.
Callouts.ButtonArea
has been deprecated.Callouts.Curve
has been deprecated.Emoji.Grid
has been moved toEmojiKit
.KeyboardStyleProvider.buttonContentBottomMargin
is no longer used.
This version bumps to Swift 5.9 and adds support for visionOS.
This version renames some views and refactors view styling to be injected with view modifiers instead of with the initializer.
This version also convers many emoji features to open-source variants, and no longer requires a license to use these features.
Views that require complex style resolving still use the style provider concept.
-
Most views are now designed to be styled with view modifiers.
-
.keyboardButtonStyle
only injects style with the environment. -
Emoji
types are no longer throwing. If you use them, removetry
. -
Emoji
keyboard views no longer apply the init style. Use the view modifier instead.
Autocomplete.ToolbarStyle
has support for more styling.Autocomplete.ToolbarItemStyle
has support for more styling.DeviceType
defines a new.vision
device to support visionOS.Keyboard.Background
implementsView
and can be used as a plain view.Keyboard.Toolbar
is a new view that applies a min height to its content.Keyboard.ToolbarStyle
is a new style that can be applied with a view modifier.StandardKeyboardBehavior
modifies some functions to beopen
to modifications.
AutocompleteToolbar
has been renamed toAutocomplete.Toolbar
.InputSet.standardNumeric
has been renamed toInputSet.numeric
.InputSet.standardSymbolic
has been renamed toInputSet.symbolic
.KeyboardButton.Button
and all related views have been moved toKeyboard
.KeyboardStyle
styles have all been renamed, e.g.Autocomplete.ToolbarStyle
.NextKeyboardButton
has been moved and renamed toKeyboard.NextKeyboardButton
.
.keyboardButtonStyle
has been renamed to.keyboardButton
..withEnvironment(fromState:)
has been renamed to.keyboardState(_:)
..withEnvironment(fromController:)
has been renamed to.keyboardState(from:)
.
-
Many
Emoji
functions and types are moved to the base library. -
Dictation.BarVisualizer
now applies more things with its style. -
Dictation.BarVisualizer
now applies style with the environment.
- Some themes have been adjusted to apply correct autocomplete toolbar styles.
Emoji
renames a lof of types & categories, and many things non-throwing.Emoji.Picker
has been deprecated in favor of the EmojiKit open-source view.LazyHGrid
/LazyVGrid
emoji initializers are replaced by the newEmoji.Grid
.KeyboardButton
has been deprecated and all views have been moved toKeyboard
.KeyboardStyle.AutocompleteToolbarItemBackground
is replaced byAutocomplete.ToolbarItem
.Autocomplete.ToolbarItem
nested views are replaced by just usingAutocomplete.ToolbarItem
.
This version optimizes the binary size of the KeyboardKit Pro framework.
- The framework size is now almost half in size compared to the 8.0 version.
- The
Color
extension changes in 8.3.1 are now implemented in Pro as well.
This version renames all colors to have more obvious naming.
Color
extensions now usekeyboard
as prefix instead ofstandard
.
This version adds support for iPad Pro layouts to KeyboardKit Pro, for selected locales.
The documentation has been thoroughly rewritten to be more consistent and to include more images and code samples.
DeviceType
has a new boolean properties.Image
has many more keyboard image extensions.KeyboardAction
has a newcapsLock
action.Keyboard.Case
has a newisCapsLocked
property.Keyboard.KeyboardType
has a newisAlphabeticCapsLocked
property.Keyboard.ReturnKeyType
has a newnativeType
property oniOS
.KeyboardLayout.ItemRow
has newhasKeyboardSwitcher
andsuggestedInputWidth
function.KeyboardLayout.ItemRows
has newhasKeyboardSwitcher
andinputWidth
function.KeyboardStyleProvider
has a newbuttonContentInsets
function.
iPadProKeyboardLayoutProvider
is a new layout provider for iPad Pro layouts.ProKeyboardLayoutProvider.spanish
now supports QWERTY, QWERTZ and AZERTY.
- The new
iPadProKeyboardLayoutProvider
is (so far) used by the following locales:
.english
.albanian
.croatian
.dutch
.dutchBelgium
.estonian
.filipino
.french
.french_belgium
.french_switzerland
.hungarian
.indonesian
.irish
.italian
.latvian
.lithuanian
.malay
.polish
.portuguese
.portuguese_brazil
.romanian
.serbian_latin
.spanish
.slovenian
.swahili
.swedish
.uzbek
KKL10n
has a newcapsLock
key, which is currently only localized in English.
InputSet.azerty
now displays correctly on iPad.
Image.keyboardLeft
has been renamed to.keyboardArrowLeft
.Image.keyboardRight
has been renamed to.keyboardArrowRight
.
SystemKeyboard
now only shows an emoji button if the license key unlocks the emoji keyboard.
This version adjusts localization and adds support for Inari Sámi and Northern Sámi.
SubmitLabel+CaseIterable
makes the type implementCaseIterable
.
KeyboardLocale.northernSami
is a new supported locale.KeyboardLocale.inariSami
is a new supported locale.
KeyboardInputViewController
now unregisters itself as shared controller in deinit.KKL10n
no longer has a.searchEmoji
key.
PreviousAppNavigator
has been deprecated..keyboardDictation
modifiers now support injecting a custom service.
KeyboardUrlOpener
has been deprecated.KKL10n.emergencyCall
has been deprecated.KKL10n.keyboardTypeAlphabetic
has been renamed to.switcherAlphabetic
.KKL10n.keyboardTypeNumeric
has been renamed to.switcherNumeric
.KKL10n.keyboardTypeSymbolic
has been renamed to.switcherSymbolic
.KKL10n.ok
has been deprecated.
This version fixes a configuration bug in KeyboardKit Pro, that caused autocorrect to not disable.
This version improves autocomplete and localized provider capabilities.
This version removes the temporary migration types that were added in 8.0. To upgrade to this or any later version, first update to 8.0 and follow the migration guides. This will remove any breaking changes when upgrading to this version.
Autocomplete
has a newAutocorrectionDisabledToContextModifer
modifier.AutocompleteContext
has a newisAutocorrectDisabled
property.LocaleDictionary
has new getters and setters.StandardCalloutActionProvider
has a newregisterLocalizedProvider
function.StandardKeyboardLayoutProvider
has a newregisterLocalizedProvider
function.View
has a newautocorrectionDisabled(with:)
modifier.
SystemKeyboard
now automatically honors any.autocorrectionDisabled()
that is applied above it.
LocalAutocompleteProvider
maxCount
is nowpublic
and mutable.LocalAutocompleteProvider
removes autocorrect suggestions if the context has autocorrect disabled.RemoteAutocompleteProvider
autocompleteSuggestions
is nowopen
.RemoteAutocompleteProvider
properties are nowpublic
and mutable.RemoteAutocompleteProvider
removes autocorrect suggestions if the context has autocorrect disabled.
KeyboardLocale.kurdish_sorani_pc
now displays its localized name properly in iOS 17.
AutocompleteContext
isEnabled
is renamed toisAutocompleteEnabled
.
This patch removes previous app navigation from KeyboardKit Pro after sudden App Store review rejections.
KeyboardInputViewController
no longer shows license validation error alerts by default.KeyboardInputViewController
now lets you define whether or not to show a license validation error alert.PreviousAppNavigator
default navigator is removed, since it started causing occasional review rejections.
This patch improves the performance of the KeyboardKit Pro license validation.
This patch reverts the dictation navigation change that was added to 8.0.7
.
This patch improves system keyboard toolbars and the ToggleToolbar in KeyboardKit Pro.
The demo app has been improved to persist the typed text and to show more pro features, like the full document reader and a theme picker.
Collection<KeyboardTheme>
has a new, staticallPredefined
property.KeyboardTheme.ShelfView
is a new view that creates scrolling shelves.KeyboardTheme.ShelfViewItem
is a new view that can be used in a theme shelf view.
KeyboardTheme.Collection
is nowIdentifiable
.SystemKeyboard
now applies a minimum height to custom toolbars, to avoid confusion where they disappear when no height is applied.SystemKeyboardButtonPreview
now disables hit testing for the button view.
Gestures.GestureButton
now has a public initializer.Gestures.ScrollViewGestureButton
now has a public initializer.SystemKeyboardButtonPreview
now uses the passed in style provider, if any.ToggleToolbar
now uses the same default.slideUp
animation for all initializers.ToggleToolbar
now applies a content shape to the default toggle to improve tap area.
ToggleToolbar
deprecates thetoggleView
initializer in favor for the shortertoggle
one.
This patch fixes an iOS 17 dictation navigation bug and syncs the controller's host bundle ID with the keyboard context.
KeyboardContext
has a newhostApplicationBundleId
property.
SystemKeyboardButtonPreview
has been simplified and made greedy.SystemKeyboardPreview
can now be used as a header/footer without useing any modifiers.
PreviousAppNavigator
has been configured to work even in iOS 17.StandardKeyboardDictationService
can once again navigate back when dictation finishes.
InputSet.Turkish
has been slightly adjusted.SystemKeyboardButtonPreview
now renders themes correctly.PreviousAppNavigator
now renders themes correctly.
SystemKeyboardPreview
header/footer modifiers are removed since they're no longer needed. See the docs.
This patch makes the BaseKeyboardLayoutProvider
input set properties mutable.
This patch makes the LocalAutocompleteProvider
callout function open
instead of public
.
This patch improves the text routing views and fixes a big in the text field.
KeyboardTextView
makes it easier to define leading and trailing views for the native text field.
KeyboardTextView
applies padding to the native text field's left and right side views.
KeyboardTextView
auto-reset in 8.0.2. This has been fixed.
This patch tweaks some migration guides before removing them in 8.1.
This patch moves emoji features from Emojis
(which was introduced in 8.0) to Emoji
after developer feedback that Emojis
was a strange prefix.
This patch makes some Pro views throwing instead of rendering empty content, since this was confusing. If you run into problems with this, just prefix your call with try?
.
- KeyboardKit Pro's text routing views no longer crashes in iOS 17 when full access is disabled.
EmojiCategory
initializers are now throwing.Emoji
skin tones are now throwing.Emoji.Version
functionality is now throwing.Emojis
is deprecated since all functionality is moved intoEmoji
.
Welcome to KeyboardKit 8.0 - a massive update to the KeyboardKit SDK!
KeyboardKit 8.0 is all about cleaning up the library to make it better structured and easier to use. It removes previously deprecated code, moves types into namespaces, and removes low-value utilities, including types solely used for DocC exposure.
Central types like SystemKeyboard
are easier to use. Passing state and services instead of a controller reduces the risk for memory leaks. It also no longer needs a width, but will take up as much space as it needs.
These updates has helped enabling new features, like fading the keyboard buttons while moving the cursor with space and other quality of life improvements and fixes. Accessibility has been drastically improved and the emoji keyboard redesigned.
Most emoji features are now Pro features, including the emoji keyboard. The SystemKeyboard
automatically removes the emoji key if no emoji keyboard is available.
The documentation has been extensively updated to provide more information and code examples. Please report any inconsistencies found, as many changes have been made.
I hope that you will love this major update to KeyboardKit!
If you're a KeyboardKit 7 user, the best way to migrate to KeyboardKit 8 is to first upgrade to the last available 7.9 version. This version contains deprecations that helps you prepare for some of the changes in KeyboardKit 8.
As you then upgrade to KeyboardKit 8, the 8.0 release has many TEMPORARY deprecations to assist migration from KeyboardKit 7. These temporary deprecations will be removed in 8.1.
You may run into some breaking changes, since there are some type changes that can't be handled by these deprecations. I have tried to keep these to a minimum, but see the breaking changes section below if you run into any problems.
Here's a list of some things that may be important to know
KeyboardInputViewController
has moved state properties into astate
property.KeyboardInputViewController
has moved service properties into aservices
property.StandardKeyboardActionHandler
no longer remembers tapped emojis. This is done with the pro handler.SystemKeyboard
provides MUCH easier customization, but requires explicit view builders.SystemKeyboard
now hides theemoji
keyboard key ifemojiKeyboard
is anEmptyView
.SystemKeyboard
no longer has an emoji keyboard by deafult, since it's now a Pro feature.SystemKeyboard
no longer auto-hides the toolbar. You can do this in thetoolbar
builder.
InputSetBasedKeyboardLayoutProvider
is a new provider.KeyboardAction
now has astandardAccessibilityLabel
.KeyboardAction.emoji
can now be created with a string.KeyboardActionHandler
now handles autocomplete suggestions.KeyboardButton
now hasedgeInsets
and anisPressed
binding.KeyboardContext
has proxy properties that mirror the controller.KeyboardInputViewController
has a newsetupProError
property.KeyboardLayout.Item
has a newwidth(forRowWidth:inputWidth:)
function.KeyboardLocale
has new initializer that supports fuzzy name initialization.KeyboardLocale
has new, convenient collection extensions to get locales.KeyboardStyle.Background
now supports specifying images in more ways.KeyboardStyle.Background
now supports specifying the image content mode.KeyboardStyle.Button
now supports background color AND background style.KeyboardStyle.EmojiKeyboard
has a lot more configuration parameters now.SpaceDragGestureHandler
properties are now mutable to allow customizations.SystemKeyboard
has new view builders to make it MUCH easier to customize it.SystemKeyboard
now fades out the buttons when a space cursor drag is active.StandardKeyboardActionHandler
can now be created on all supported platforms.StandardKeyboardActionHandler
has a newemojiRegistration
property.StandardKeyboardActionHandler
has a newtryRegisterEmoji(after:on:)
.StandardKeyboardActionHandler
has a newtryPerformAutocomplete(after:on:)
.StandardKeyboardStyleProvider
now adjusts styles when a space drag is active.View.keyboardButton
supports custom insets and applies a menu tonextLocale
.View.keyboardButton
applies accessibility labels for actions that define them.View.keyboardButton
is a new extension that applies both a style and gestures.View.keyboardCalloutContainer
is a new extension that will apply both callouts.View.keyboardLayoutItemSize
is a new extension that applies a layout item size.
AutocompleteProvider
is now async.EmojiKeyboard
uses the standard context style as default.Gesture.KeyboardButtonGestures
no longer blocks space releases.InputSet
has been converted to a struct. All subsets are removed.KeyboardAction
no longer defines a default.nextKeyboard
action.KeyboardController
has fewer functions, since it's not used as much.KeyboardInputViewController
is no longer used to insert suggestions.SystemKeyboard
no longer needs you to provide it with an explicit width.SystemKeyboard
now guides you to use the controller-based setup function.KeyboardInputViewController
textDidChange
performs operations after a delay.
-
Many emoji types have become Pro features.
-
Many routing types have become Pro features.
-
The pro setup error view has been redesigned.
-
The pro setup error view now overlays your view.
-
EmojiKeyboard
has a new state/services initializer. -
EmojiKeyboard
has menu icons that look more native. -
Emojis.Categories
filters out all unavailable emojis. -
Emojis.Version
has more ways to handle emoji versions. -
ExternalKeyboardContext
class is now a Pro feature. -
FeedbackToggle
parameter is renamed to configuration. -
FullDocumentContextReader
has been removed (use proxy). -
KeyboardTextField
&KeyboardTextView
are now Pro features. -
LocalAutocompleteProvider
autocorrectsi
toI
in English. -
ProCalloutActionProvider
is a new Pro callout action provider. -
RemoteAutocompleteProvider
is now available to all license tiers. -
SystemKeyboardPreview
replaces all other system keyboard previews. -
SystemKeyboardButtonPreview
is a new system keyboard button preview. -
KeyboardInputViewController
has a license config action for both setups.
Emojis.Version
fixes an iOS availability bug for Unicode v15.FeedbackConfiguration
used an incorrect disabled audio config by default.KeyboardAction.backspace
didn't properly trigger autocapitalization.SystemKeyboard
now uses images for.space
from the style provider.textDidChange
performs autocomplete after an async delay, to let the proxy update.textDidChange
applies autocapitalization after an async delay, to let the proxy update.
-
All deprecated code has been removed.
-
DocC exposing types have been removed.
-
Many emoji types have been moved to Pro.
-
Many routing types have been moved to Pro.
-
English input sets have been moved to Pro.
-
Migration deprecations are not listed here.
-
AudioFeedback.Engine
is no longer open to inheritance. -
Autocomplete.ToolbarItemSubtitle
init takes a suggestion. -
CalloutContext.ActionContext
no longer uses an action handler. -
CasingAnalyzer
has been removed (useString
extensions). -
DisabledCalloutActionProvider
has been removed. -
EmojiKeyboardItem
has been removed. -
EmojiProvider
has been removed. -
EnglishCalloutActionProvider
is now a Pro feature. -
EnglishKeyboardLayoutProvider
has been removed. -
ExternalKeyboardContext
is now a Pro feature. -
FeatureToggle
has been removed. -
HapticFeedback.Engine
is no longer open to inheritance. -
KeyboardAction.emojiCategory
has been removed. -
KeyboardCharacterProvider
has been removed (useString
extensions). -
KeyboardColor
has been made internal. -
KeyboardColorReader
has been removed (useColor
extensions). -
KeyboardContext
no longer has a controller-based init (usesync(with:)
). -
KeyboardContext
textDocumentProxy
is read-only, butoriginalTextDocumentProxy
can be set. -
KeyboardHostingController
has been made internal. -
KeyboardSettingsUrlProvider
has been removed (useURL.keyboardSettings
). -
KeyboardStyle.EmojiKeyboard
has different parameters for the new menu design. -
KeyboardTextContext
was not used and has been removed to avoid complexity. -
Routing
text input components are now Pro features. -
KeyboardTextField
was not used and has been removed to avoid complexity. -
LocaleDirectionAnalyzer
has been removed (useLocale
extensions). -
LocaleNameProvider
has been removed (useLocale
extensions). -
NextKeyboardController
has been made internal. -
QuotationAnalyzer
has been removed (useString
extensions). -
SentenceAnalyzer
has been removed (useString
extensions). -
StandardCalloutActionProvider.standardProvider
has been removed. -
StaticKeyboardLayoutProvider
has been removed. -
SystemKeyboard
now requires explicit view builders. -
SystemKeyboardItem
can no longer be initialized outside the library. -
ToggleToolbar
is now a Pro feature. -
View.keyboardButtonStyle(...)
no longer has anisPressed
parameter. -
WordAnalyzer
has been removed (useString
extensions).