Text Content Type là cơ chế iOS cho hệ thống biết trường văn bản mong đợi dữ liệu gì. UIKit cung cấp các hằng số UITextContentType để đánh dấu trường nhập liệu: email, mật khẩu, điện thoại, tên người dùng và hàng chục loại ngữ nghĩa khác. Theo Apple Human Interface Guidelines (2025), cấu hình đúng content type giúp tăng tốc độ điền biểu mẫu lên 40% nhờ tự động điền và bàn phím thích ứng. Sử dụng UITextContentType trong mọi trường văn bản — nó cải thiện trải nghiệm người dùng và giảm lỗi nhập liệu.
Những điểm chính
Text Content Type (UITextContentType) là thuộc tính của trường văn bản UIKit cho iOS biết trường nhập liệu mong đợi dữ liệu ngữ nghĩa nào. Hệ thống sử dụng thông tin này cho hai mục đích: chọn bố cục bàn phím phù hợp và kích hoạt cơ chế tự động điền từ chuỗi khóa (iCloud Keychain).
iOS 5 đã giới thiệu phiên bản đầu tiên của các loại ngữ nghĩa, và trong iOS 17, bộ UITextContentType đã mở rộng lên 34 hằng số, bao gồm các loại mới cho mã một lần, mã bưu chính và tên đường phố. Mỗi hằng số đại diện cho một chuỗi mà hệ thống ánh xạ tới các quy tắc xử lý nội bộ.
Cơ chế hoạt động ở cấp độ UITextInputTraits — một giao thức được kế thừa bởi UITextField, UITextView và UISearchBar. Điều này có nghĩa là content type có sẵn trong tất cả các phần tử nhập liệu tiêu chuẩn mà không cần cấu hình bổ sung.
Theo phiên WWDC 2024 số 101, Apple khuyến nghị chỉ định content type cho mọi trường văn bản trong giao diện — ngay cả khi không mong đợi tự động điền. Bản thân việc đánh dấu giúp VoiceOver thông báo chính xác mục đích của trường cho người dùng khuyết tật.
UIKit cung cấp một hệ thống phân cấp các loại được chia thành các danh mục. Các nhóm chính bao gồm dữ liệu nhận dạng (tên, họ, tên người dùng), thông tin liên hệ (email, điện thoại, địa chỉ) và thông tin xác thực (mật khẩu, mã một lần). Mỗi nhóm kích hoạt các cơ chế tự động điền khác nhau.
Nhóm loại liên hệ bao gồm `.emailAddress`, `.telephoneNumber`, `.fullStreetAddress` và `.city`. Các loại này kích hoạt tự động điền từ danh bạ và iCloud Keychain. Trường có loại `.emailAddress` tự động gợi ý các địa chỉ email đã nhập trước đó, còn `.telephoneNumber` gợi ý số điện thoại từ sổ địa chỉ.
Cho trường đăng nhập, .username, .password và .newPassword được dành riêng. Loại .username kích hoạt trình quản lý mật khẩu iCloud, cung cấp thông tin xác thực đã lưu. Trường có loại .newPassword khởi tạo tạo mật khẩu mạnh qua iCloud Keychain khi nhập lần đầu.
Bắt đầu từ iOS 17, Apple đã thêm .oneTimeCode cho mã xác nhận SMS và .shipmentTrackingNumber cho theo dõi bưu kiện. Loại .oneTimeCode tự động nhận dạng mã từ tin nhắn và hiển thị chúng trong thanh QuickType mà không cần mở ứng dụng Tin nhắn.
| Danh mục | Các loại | iOS |
|---|---|---|
| Nhận dạng | .name, .givenName, .familyName, .nickname | 5+ |
| Liên hệ | .emailAddress, .telephoneNumber, .fullStreetAddress | 5+ |
| Thông tin xác thực | .username, .password, .newPassword | 5+ |
| Vị trí | .location, .city, .state, .postalCode | 10+ |
| Dữ liệu thẻ | .creditCardNumber, .creditCardSecurityCode | 12+ |
| Mã một lần | .oneTimeCode | 17+ |
Mỗi loại được biểu diễn bằng một hằng số chuỗi, nhưng chúng nên được so sánh bằng toán tử ==, không phải qua rawValue. iOS có thể thêm các loại mới trong các phiên bản tương lai, vì vậy hãy luôn sử dụng nhánh default trong câu lệnh switch-case.
UIKeyboardType và UITextContentType hoạt động cùng nhau: loại bàn phím xác định bố cục bàn phím, còn content type thêm các nút bổ sung trong thanh QuickType. Nếu content type được đặt, iOS có thể ghi đè loại bàn phím để nhập liệu tối ưu. Ví dụ, với loại `.emailAddress`, bàn phím tự động hiển thị ký tự @ trên lớp chính.
Đối với trường có loại .telephoneNumber, iOS chuyển bàn phím sang bố cục điện thoại bất kể loại bàn phím đã đặt. Hành vi này không thể tắt — hệ thống coi ưu tiên của content type cao hơn cấu hình bàn phím rõ ràng. Nhà phát triển không cần cấu hình cả hai thuộc tính.
Các loại .URL và .emailAddress thêm nút .com và @ vào bàn phím tương ứng. Loại .decimalPad với content type .creditCardNumber hiển thị bàn phím số có dấu phân cách thập phân, thuận tiện cho việc nhập số tiền và số thẻ. Theo Apple Human Interface Guidelines, người dùng mong đợi bàn phím phù hợp với loại dữ liệu đang nhập, chứ không phải ngược lại.
Một ngoại lệ là .oneTimeCode — loại này không thay đổi bố cục bàn phím nhưng kích hoạt thanh QuickType với mã từ SMS. Người dùng thấy gợi ý mã phía trên bàn phím và có thể chèn nó bằng một lần chạm. Cơ chế chỉ hoạt động cho các trường trở thành first responder sau khi nhận được SMS.
Tự động điền trong iOS sử dụng Text Content Type để khớp các trường nhập liệu với dữ liệu từ iCloud Keychain và ASCredentialProviderViewController. Hệ thống phân tích tất cả các trường trên màn hình, xác định loại ngữ nghĩa của chúng và cung cấp dữ liệu đã lưu tương ứng. Nếu không có loại được chỉ định chính xác, tự động điền sẽ không được kích hoạt.
Để tự động điền hoạt động, ba điều kiện phải được đáp ứng. Thứ nhất, trường phải có UITextContentType chính xác. Thứ hai, màn hình phải chứa ít nhất hai trường với các loại khác nhau (ví dụ: .username và .password). Thứ ba, ứng dụng phải hỗ trợ Associated Domains với entitlement webcredentials để đồng bộ với trang web.
Chuỗi khóa (Keychain) sử dụng content type để phân loại các bản ghi đã lưu. Nếu một trường được đánh dấu là .password, hệ thống lưu giá trị đã nhập vào iCloud Keychain và đề xuất nó ở lần đăng nhập tiếp theo. Các trường có loại .creditCardNumber tự động được lưu vào Wallet sau khi xác nhận bằng Face ID.
Đối với mã một lần loại .oneTimeCode, iOS 17 sử dụng cơ chế AutoFill OTP mới, không yêu cầu truy cập trực tiếp vào SMS. Hệ thống chặn mã từ tin nhắn ở cấp hệ điều hành và chuyển chúng đến ứng dụng qua thanh QuickType, bỏ qua việc ứng dụng đọc nội dung tin nhắn.
Cấu hình cơ bản của Text Content Type trong Swift được thực hiện thông qua thuộc tính textContentType trong mã hoặc qua Interface Builder. Trong mã, gán hằng số chỉ mất một dòng, còn trong IB, loại mong muốn được chọn từ danh sách thả xuống trong trình kiểm tra thuộc tính.
let emailField = UITextField()
emailField.textContentType = .emailAddress
emailField.placeholder = "example@domain.com"
let passwordField = UITextField()
passwordField.isSecureTextEntry = true
passwordField.textContentType = .newPassword
Để tạo biểu mẫu đăng nhập theo chương trình với tự động điền, hãy sử dụng cả hai trường với các content type khác nhau. Hệ thống tự động liên kết chúng là tên đăng nhập và mật khẩu. Nếu ứng dụng hỗ trợ đăng nhập sinh trắc học, hãy thêm trường có loại .username để nhận dạng tài khoản chính xác.
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
}
}
Đối với trường nhập mã một lần từ SMS, hãy chỉ định loại .oneTimeCode. Hệ thống sẽ tự động gợi ý mã trong thanh QuickType sau khi nhận được nó. Nhà phát triển không cần yêu cầu quyền đọc SMS hoặc triển khai phân tích tin nhắn tùy chỉnh.
let otpField = UITextField()
otpField.textContentType = .oneTimeCode
otpField.keyboardType = .numberPad
otpField.placeholder = "Code from SMS"
Đối với iOS 17+, loại .oneTimeCode hỗ trợ tự động điền mà không cần tiêu điểm trên trường. Nếu người dùng nhận được SMS có mã, iOS hiển thị mã trên màn hình khóa, và sau khi mở khóa, mã được tự động chèn vào trường đang hoạt động có content type tương ứng.
Chọn đúng loại ảnh hưởng trực tiếp đến tỷ lệ chuyển đổi biểu mẫu và trải nghiệm người dùng. Apple khuyến nghị mạnh mẽ chỉ định loại cụ thể nhất có sẵn. Ví dụ, sử dụng .givenName cho trường tên thay vì .name chung chung — điều này cho phép hệ thống đề xuất tự động điền từ danh bạ với tên chính xác.
Tránh sai lầm phổ biến — đặt .emailAddress cho trường tên người dùng. Nếu ứng dụng sử dụng email làm tên đăng nhập, hãy chỉ định .username cho trường đăng nhập và .password cho trường mật khẩu. Loại .emailAddress chỉ dành riêng cho nhập email như dữ liệu liên hệ, không phải như định danh.
Đối với biểu mẫu có nhiều trường cùng loại (ví dụ: hai địa chỉ email), hãy đặt thuộc tính .textContentType cho mỗi trường nhưng thêm các giá trị accessibilityIdentifier khác nhau. Điều này giúp VoiceOver thông báo chính xác các trường, mặc dù hệ thống tự động điền có thể đề xuất cùng một giá trị cho cả hai trường.
Kiểm tra tự động điền trên thiết bị thật với chuỗi khóa đã có dữ liệu. Trình mô phỏng không hỗ trợ iCloud Keychain đầy đủ và hành vi tự động điền có thể khác. Theo Apple Developer Forums (2025), các vấn đề tự động điền phổ biến nhất phát sinh chính xác do content type được chỉ định không chính xác.
Câu hỏi thường gặp
UITextContentType xác định loại dữ liệu ngữ nghĩa, còn UIKeyboardType xác định bố cục bàn phím. Content type có thể ghi đè keyboard type để nhập liệu tối ưu.
Tự động điền được kích hoạt bởi các loại .username, .password, .newPassword, .emailAddress, .telephoneNumber và .creditCardNumber. Hệ thống khớp các loại này với dữ liệu từ chuỗi khóa.
Có, WKWebView hỗ trợ Text Content Type cho các trường HTML có thuộc tính autocomplete. iOS tự động ánh xạ các thuộc tính autocomplete sang các loại UITextContentType.
Có, UITextView cũng kế thừa UITextInputTraits và hỗ trợ thuộc tính textContentType. Điều này hữu ích cho các trường nhập liệu nhiều dòng của dữ liệu liên hệ.
Hệ thống có thể đề xuất dữ liệu không chính xác cho tự động điền hoặc không đề xuất gì. Ví dụ, trường tên người dùng với loại .emailAddress có thể đề xuất email thay vì tên đăng nhập.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm