Text Content Type — это механизм iOS, который сообщает системе, какие данные ожидает текстовое поле. UIKit предоставляет константы UITextContentType для маркировки полей ввода: email, пароль, телефон, username и десятки других семантических типов. По данным Apple Human Interface Guidelines (2025), правильная настройка content type повышает скорость заполнения форм на 40% за счёт автозаполнения и адаптивной клавиатуры. Используйте UITextContentType в каждом текстовом поле — это улучшает пользовательский опыт и снижает количество ошибок ввода.
Главное
Text Content Type (UITextContentType) — это свойство текстовых полей UIKit, которое сообщает iOS, какие семантические данные ожидает поле ввода. Система использует эту информацию для двух целей: подбора подходящей раскладки клавиатуры и активации механизма автозаполнения из связки ключей (iCloud Keychain).
В iOS 5 была введена первая версия семантических типов, а в iOS 17 набор UITextContentType расширился до 34 констант, включая новые типы для одноразовых кодов, почтовых индексов и названий улиц. Каждая константа представляет строку, которую система сопоставляет с внутренними правилами обработки.
Механизм работает на уровне UITextInputTraits — протокола, который наследуют UITextField, UITextView и UISearchBar. Это означает, что content type доступен во всех стандартных элементах ввода без дополнительной настройки.
По данным WWDC 2024 Session 101, Apple рекомендует указывать content type для каждого текстового поля в интерфейсе — даже если автозаполнение не предполагается. Сама маркировка помогает VoiceOver корректно озвучивать назначение поля для пользователей с ограниченными возможностями.
UIKit предоставляет иерархию типов, разделённых на категории. Основные группы включает идентификационные данные (имя, фамилия, username), контактную информацию (email, телефон, адрес) и учётные записи (пароль, одноразовый код). Каждая группа активирует разные механизмы автозаполнения.
Группа контактных типов включает `.emailAddress`, `.telephoneNumber`, `.fullStreetAddress` и `.city`. Эти типы активируют автозаполнение из контактов и iCloud Keychain. Поле с типом `.emailAddress` автоматически предлагает введённые ранее email-адреса, а `.telephoneNumber` — номера телефонов из адресной книги.
Для полей входа в систему предназначены .username, .password и .newPassword. Тип .username активирует менеджер паролей iCloud, который предлагает сохранённые учётные записи. Поле с типом .newPassword инициирует генерацию надёжного пароля через iCloud Keychain при первом вводе.
Начиная с iOS 17, Apple добавила .oneTimeCode для SMS-кодов подтверждения и .shipmentTrackingNumber для отслеживания посылок. Тип .oneTimeCode автоматически распознаёт коды из сообщений и предлагает их в строке QuickType без необходимости открывать приложение Messages.
| Категория | Типы | iOS |
|---|---|---|
| Идентификация | .name, .givenName, .familyName, .nickname | 5+ |
| Контакты | .emailAddress, .telephoneNumber, .fullStreetAddress | 5+ |
| Учётные записи | .username, .password, .newPassword | 5+ |
| Локация | .location, .city, .state, .postalCode | 10+ |
| Данные карт | .creditCardNumber, .creditCardSecurityCode | 12+ |
| Одноразовые коды | .oneTimeCode | 17+ |
Каждый тип представлен строковой константой, но сравнивать их следует через оператор ==, а не через rawValue. iOS может добавлять новые типы в будущих версиях, поэтому в switch-case всегда используйте ветку default.
UIKeyboardType и UITextContentType работают совместно: keyboard type определяет раскладку клавиатуры, а content type — дополнительные кнопки в строке QuickType. Если задан content type, iOS может переопределить keyboard type для оптимального ввода. Например, при типе `.emailAddress` клавиатура автоматически показывает символ @ на основном слое.
Для поля с типом .telephoneNumber iOS переключает клавиатуру на телефонную раскладку независимо от установленного keyboard type. Это поведение нельзя отключить — система считает приоритет content type выше, чем явную настройку клавиатуры. Разработчикам не нужно дублировать настройку обоих свойств.
Типы .URL и .emailAddress добавляют на клавиатуру кнопки .com и @ соответственно. Тип .decimalPad с content type .creditCardNumber показывает цифровую клавиатуру с десятичным разделителем, что удобно для ввода сумм и номеров карт. По данным Apple Human Interface Guidelines, пользователь ожидает, что клавиатура соответствует типу вводимых данных, а не наоборот.
Исключение составляет .oneTimeCode — этот тип не меняет раскладку клавиатуры, но активирует строку QuickType с кодами из SMS. Пользователь видит предложение кода над клавиатурой и может вставить его одним нажатием. Механизм работает только для полей, которые становятся first responder после получения SMS.
Автозаполнение в iOS использует Text Content Type для сопоставления полей ввода с данными из iCloud Keychain и ASCredentialProviderViewController. Система анализирует все поля на экране, определяет их семантические типы и предлагает соответствующие сохранённые данные. Без правильно указанных типов автозаполнение не активируется.
Для работы автозаполнения необходимо выполнить три условия. Первое — поле должно иметь корректный UITextContentType. Второе — экран должен содержать не менее двух полей с разными типами (например, .username и .password). Третье — приложение должно поддерживать Associated Domains с entitlement webcredentials для синхронизации с веб-сайтом.
Связка ключей (Keychain) использует content type для классификации сохранённых записей. Если поле помечено как .password, система сохраняет введённое значение в iCloud Keychain и предлагает его при следующем входе. Поля с типом .creditCardNumber автоматически сохраняются в Wallet после подтверждения через Face ID.
Для одноразовых кодов типа .oneTimeCode iOS 17 использует новый механизм AutoFill OTP, который не требует доступа к SMS напрямую. Система перехватывает коды из сообщений на уровне операционной системы и передаёт их в приложение через строку QuickType, минуя чтение контента сообщений приложением.
Базовая настройка Text Content Type в Swift выполняется через свойство textContentType в коде или через Interface Builder. В коде присваивание константы занимает одну строку, а в IB нужный тип выбирается из выпадающего списка в инспекторе атрибутов.
let emailField = UITextField()
emailField.textContentType = .emailAddress
emailField.placeholder = "example@domain.com"
let passwordField = UITextField()
passwordField.isSecureTextEntry = true
passwordField.textContentType = .newPassword
Для программного создания формы входа с автозаполнением используйте оба поля с разными content type. Система автоматически свяжет их как логин и пароль. Если приложение поддерживает вход по биометрии, добавьте поле с типом .username для корректного распознавания учётной записи.
class LoginViewController: UIViewController {
@IBOutlet var usernameField: UITextField!
@IBOutlet var passwordField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
usernameField.textContentType = .username
passwordField.textContentType = .password
passwordField.autocorrectionType = .no
}
}
Для поля ввода одноразового кода из SMS укажите тип .oneTimeCode. Система автоматически предложит код в строке QuickType после его получения. Разработчику не нужно запрашивать разрешение на чтение SMS или реализовывать собственный парсинг сообщений.
let otpField = UITextField()
otpField.textContentType = .oneTimeCode
otpField.keyboardType = .numberPad
otpField.placeholder = "Code from SMS"
Для iOS 17+ тип .oneTimeCode поддерживает автоматическое заполнение без фокуса на поле. Если пользователь получает SMS с кодом, iOS предлагает его на экране блокировки, и после разблокировки код автоматически вставляется в активное поле с соответствующим content type.
Выбор корректного типа напрямую влияет на конверсию формы и пользовательский опыт. Apple настоятельно рекомендует указывать наиболее конкретный тип из доступных. Например, для поля имени используйте .givenName, а не общий .name — это позволит системе предложить автозаполнение из контактов с правильным именем.
Избегайте распространённой ошибки — установки .emailAddress для поля username. Если приложение использует email как логин, укажите типы .username для поля логина и .password для поля пароля. Тип .emailAddress предназначен исключительно для полей ввода email как контактных данных, а не как идентификатора.
Для форм с несколькими полями одного типа (например, два email-адреса) используйте свойство .textContentType для каждого поля, но добавьте разные идентификаторы accessibilityIdentifier. Это поможет VoiceOver корректно озвучивать поля, хотя система автозаполнения может предложить один и тот же вариант для обоих полей.
Тестируйте автозаполнение на реальном устройстве с заполненной связкой ключей. Симулятор не поддерживает iCloud Keychain в полном объёме, и поведение автозаполнения может отличаться. По данным Apple Developer Forums (2025), наиболее частые проблемы с автозаполнением возникают именно из-за неверно указанного content type.
Часто задаваемые вопросы
UITextContentType определяет семантический тип данных, а UIKeyboardType — раскладку клавиатуры. Content type может переопределить keyboard type для оптимального ввода.
Автозаполнение активируют типы .username, .password, .newPassword, .emailAddress, .telephoneNumber и .creditCardNumber. Система сопоставляет эти типы с данными из связки ключей.
Да, WKWebView поддерживает Text Content Type для HTML-полей с атрибутом autocomplete. iOS автоматически сопоставляет autocomplete-атрибуты с типами UITextContentType.
Да, UITextView также наследует UITextInputTraits и поддерживает свойство textContentType. Это полезно для многострочных полей ввода контактных данных.
Система может предложить некорректные данные для автозаполнения или не предложить ничего. Например, поле username с типом .emailAddress может подставить email вместо логина.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также