iOS 11 비밀번호 자동 채우기 액세서리 보기 옵션 사용 안 함?
현재로서는 iOS 11이 제공하는 새로운 옵션, 즉 앱에서 암호를 제안하는 옵션에서 제외하고 싶습니다.iOS 11에서 앱을 실행하면 키보드 상단에 자동 채우기 옵션이 표시되고 사용자 이름과 암호 텍스트 필드가 표시되지 않습니다.
그렇다면, 제 질문은 어떻게 하면 키보드의 키가 전혀 표시되지 않고 전체적인 동작이 preiOS 11과 동일하도록 새로운 비밀번호 자동 채우기 기능을 모두 비활성화할 수 있을까요?
iOS 11 & 12 & 13 - Swift 4.2 & 5 (업데이트):
if #available(iOS 12, *) {
// iOS 12 & 13: Not the best solution, but it works.
passwordTextField.textContentType = .oneTimeCode
} else {
// iOS 11: Disables the autofill accessory view.
// For more information see the explanation below.
emailTextField.textContentType = .init(rawValue: "")
passwordTextField.textContentType = .init(rawValue: "")
}
iOS 11 설명:
설정을 모두 완료했는지 확인합니다.UITextField
이런 물건들.
를 들어 를들어들, 를어예예가 ,UITextField
해야 하는 할당을 다른 를 입력해야 .UITextContentType("")
그들 두 사람에게textContentType
않으면 작동하지 표시됩니다.그렇지 않으면 작동하지 않고 autoFill 액세서리 보기가 계속 표시됩니다.
iOS 12는 또한 비밀번호 textFields를 인식하는 것 같습니다.isSecureTextEntry
뿐만 아니라 재산textContentType
이 하는 은 textContent성, , 라를게지, 다둘textContent설, 정하textContent속을 둘 다 설정하지 않으면 .기능을 앱에 ). 이보기를 하지 못합니다.nothing은 secureEntry입니다. 그러면 iOS 12가 textField를 암호 textField로 인식하고 이 성가신 액세서리 보기를 표시하지 못합니다.
저의 경우, 액세서리가 버그를 발생시켜 탭할 때 앱이 응답하지 않게 되었습니다(앱 검토 과정에서 앱이 거부되기도 했습니다).그래서 이 기능을 제거해야 했습니다.저는 이 보안 기능을 포기하고 싶지 않았기 때문에 스스로 해결해야 했습니다.
이 방법은 secureEntry 기능을 제거하고 직접 추가하는 것입니다.효과가 있었습니다.
다음과 같이 수행할 수:
빠른 4방향:
먼저, 여기에 대답한 것처럼, 설정textContentType
무로:
if #available(iOS 10.0, *) {
passwordText.textContentType = UITextContentType("")
emailText.textContentType = UITextContentType("")
}
나중에 textField 실제 내용을 포함할 String 변수를 선언합니다.
var passwordValue = ""
textField 내용이 변경될 때마다 호출될 암호 TextField에 대상을 추가합니다.
passwordText.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
이제 마법을 사용하여 텍스트 대체를 처리할 기능을 선언합니다.
@objc func textFieldDidChange(_ textField: UITextField) {
if textField.text!.count > 1 {
// User did copy & paste
if passwordValue.count == 0 { // Pasted into an empty textField
passwordValue = String(textField.text!)
} else { // Pasted to a non empty textField
passwordValue += textField.text!.substring(from: passwordValue.count)
}
} else {
// User did input by keypad
if textField.text!.count > passwordValue.count { // Added chars
passwordValue += String(textField.text!.last!)
} else if textField.text!.count < passwordValue.count { // Removed chars
passwordValue = String(passwordValue.dropLast())
}
}
self.passwordText.text = String(repeating: "•", count: self.passwordText.text!.count)
}
설정autocorrectionType
.no
텍스트를 하려면: 예측텍를제는방법하거트:
passwordText.autocorrectionType = .no
바로 그거야, 사용.passwordValue
로그인을 수행합니다.
누군가에게 도움이 되길 바랍니다.
갱신하다
붙여넣은 값도 캡처하고 이전에 추가하는 것을 잊었습니다.
사용자 이름이나 암호가 아닌 내용 유형을 지정하여 이 기능을 사용하지 않도록 설정할 수 있습니다.예를 들어, 사용자가 이메일 주소를 입력해야 하는 경우,
usernameTextField?.textContentType = .emailAddress
@Gal Shahar Answer에 대한 응답.
iOS 12는 암호 텍스트 필드를 인식합니다.isSecureTextEntry
뿐만 아니라 재산textContentType
소유물.
자동 채우기 제안을 무시하는 방법.
- 트
isSecureTextEntry
속성
self.passwordTextField.secureTextEntry = NO;
- 하고 UITextField Delegate를 합니다.
isSecureTextEntry
소유물.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField == self.passwordTextField && !self.passwordTextField.secureTextEntry) {
self.passwordTextField.secureTextEntry = YES;
}
return YES;
}
참고: - 사용 안 함shouldBeginEditing
UITextField 대리자 메서드가 자동 채우기 제안을 계속 표시합니다.사용 안 함textFieldDidChange
UITextField 위임 메서드는 첫 번째 문자를 첫 번째 문자가 표시된 후에 발생합니다로 자동 삭제합니다.그리고 'secureTextEntry'는 필드를 비웁니다.
UITextContent에 대한 확장을 추가할 수 있습니다.다음과 같이 입력합니다.
extension UITextContentType {
public static let unspecified = UITextContentType("unspecified")
}
그 후에, 당신은 그것을 사용할 수 있습니다.
if #available(iOS 10.0, *) {
passwordField.textContentType = .unspecified
}
IOS11의 매우 간단한 접근 방식이 저에게 효과가 있었습니다.iboutlet이 사용자 이름 텍스트 필드 및 암호 텍스트 필드라고 가정합니다.둘 다 가장 바깥쪽을 유지하는 뷰 컨트롤러의 ViewDidLoad() 함수는 다음 코드를 사용합니다.
usernametextfield.textContentType = UITextContentType("")
passwordtextfield.textContentType = UITextContentType("")
이 후 텍스트 필드를 누르면 자동 채우기 액세서리 옵션이 표시되지 않습니다.
목표-C
if (@available(iOS 10, *)){
self.tfEmail.textContentType = @"";
self.tfPassword.textContentType = @"";
}
이것은 저에게 효과가 있었습니다.
에는 설정이 textContentType = .oneTimeCode
암호 필드가 부분적으로만 작동합니다.를 사용하는 를 사용하는 할 때 작동하지 않았습니다.OS 15가 있는 기기에서는 문제가 없었지만 iOS 15가 있는 시뮬레이터에서는 특히 필드를 전환할 때 제대로 작동하지 않았습니다.또한 isSecureTextEntry의 값을 전환하는 필드에 암호를 표시/숨기기 위한 버튼이 있었다고 말할 가치가 있습니다. 설정한 textContentType = .oneTimeCode
화면의 모든 필드(암호 필드뿐만 아니라 내가 가지고 있던 다른 이름 및 이메일 필드)에서 시뮬레이터에서도 제대로 작동하기 시작했습니다.따라서 .oneTimeCode 솔루션이 사용자에게 적합하지 않은 경우 암호 필드뿐만 아니라 화면의 모든 필드에서도 설정해 볼 수 있습니다.
자동 채우기는 사용자에 대해 기본적으로 활성화되어 있습니다. iOS는 모든 암호를 키 체인에 저장하고 앱의 키보드에서 사용할 수 있도록 합니다.UITextView
그리고.UITextField
과 비밀번호가 아닌 콘텐츠 하여 사용하지 할 수 , 정보가 에는 빈 항목을 지정하는 것이 . 그러나 내용 유형 정보가 키 체인에 이미 저장되어 있으면 빠른 표시줄에 표시됩니다. 따라서 빈 내용을 할당하는 것이 좋습니다.UITextContentType
입력하면 퀵바가 표시되지 않습니다.
예:
if #available(iOS 10.0, *) {
self.textField.textContentType = UITextContentType("")
} else {
// Fallback on earlier versions
}
이는 ios 12 및 10에 적용되었습니다.
if (@available(iOS 10, *)) {
passwordTextField.textContentType = UITextContentTypeStreetAddressLine2;
}
if (@available(iOS 12, *)) {
passwordTextField.textContentType = UITextContentTypeOneTimeCode;
}
이 주제에서 일어나고 있는 미친 직원들.나는 iOS에서 나에게 비밀번호를 제안하지 않고 만들었지만, 이메일에 대해서만 자동 입력을 해주었습니다.누군가가 그렇게 필요로 한다면요.이 다른 후에textContentType
제가 원하는 대로 만들었습니다.
- iOS 자동 채우기가 포함된 이메일 텍스트 필드가 무언가를 제안합니다.
- iOS 시스템이 없는 암호 텍스트 필드에서 새 암호를 제안하지만 전자 메일 텍스트 필드에서 선택하면 암호로 입력합니다.
- 보안 입력 텍스트가 있는 암호 텍스트 필드입니다.
그리고 이 코드로 작동했습니다.당신이 가지고 있는 것은 중요하지 않습니다.email
또는username
당신이 필요로 하는 것을 제안할 것입니다.그래서 저는 액세서리 자동 채우기 보기를 비활성화하고 키보드의 도구 모음에 자동 채우기만 남겨두었습니다.
self.passwordField.isSecureTextEntry = true
if #available(iOS 11.0, *) {
self.emailField.textContentType = .username
self.emailField.keyboardType = .emailAddress
}
if #available(iOS 12.0, *) {
self.passwordField.textContentType = .password
self.passwordField.keyboardType = .default
}
목표 C, iOS 15:
textField.textContentType = UITextContentTypeOneTimeCode;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
시뮬레이터에서는 여전히 제안을 표시할 수 있지만 장치에서는 그렇지 않습니다.
더미를 할당하여 사용자 이름/암호 조합 탐지를 "해제"할 수 있습니다.textContentType
암호 텍스트 필드로 이동합니다.
passwordFormField.textContentType = UITextContentType("dummy")
이렇게 하면 암호 필드와 암호 필드 앞에 있는 전자 메일 필드 모두에 대한 키 기호가 해제되며, 이러한 방식으로 미리 정의된 값 중 하나를 사용하지 않고 키보드 보조프로그램 보기에 관련 없는 제안이 표시되지 않습니다.
여기서는 부속 보기를 제거할 수 있다는 결론을 내리는 다양한 답변을 시도할 수 있습니다.하지만 이것은 약간의 벌레를 남깁니다.
암호 필드에 대해서만 사용자 지정 키보드를 구현할 수 있습니다.또한 텍스트 필드에 대한 제안을 비활성화하려고 시도합니다. 그것은 또한 숨깁니다.accessoryView
.
편집: 동일한 질문에 대한 Apple 포럼에서 여전히 답변이 없습니다.또한 저는 공식 문서에서 이와 관련된 내용을 찾을 수 없었습니다.
네, iOS 14에서 문제 없이 다음과 같이 작업하고 있음을 확인할 수 있습니다.
// once this property is declared, textField.keyboardType does
// not seem to have any effect in showing the autofill
textField.textContentType = UITextContentType.oneTimeCode
textField.keyboardType = UIKeyboardType.emailAddress
iOS 12에서는 벰의 답변이 작동하지 않고, Gal Shahar의 답변은 일부 에지 사례(예를 들어 사용자가 한 번에 여러 문자를 삭제하는 경우)를 설명하지 않는 것으로 알고 있습니다.IBAction을 사용하여 이 문제를 해결했기 때문에 iOS 버전을 확인할 필요가 없습니다.저는 단지 초보자이기 때문에 이것이 "최고의" 대답이나 가장 효율적인 대답은 아닐 수도 있지만, 저에게는 가장 타당했습니다.
먼저 스토리보드에서 "보안 텍스트 항목"의 선택을 취소하거나 "거짓"/으로 설정합니다.암호 UItextField의 코드를 통해 "아니오"를 입력합니다.그러면 iOS에서 자동 채우기를 시도하지 못하게 됩니다.
그런 다음 암호 UITextField를 IBAction에 연결합니다.내 전화는 다음과 같습니다.
- 편집이 시작되었습니다.
- 편집이 변경되었습니다.
- 편집이 종료되었습니다.
내가 작성한 IBAction 함수는 사용자의 시작 암호와 암호 UITextField에 입력된 암호 간의 차이를 확인하고 다음 정보를 기반으로 새 암호를 만듭니다.
class Login: UIViewController {
var password = ""
override func viewDidLoad() { super.viewDidLoad() }
@IBAction func editPasswordField(_ sender: UITextField) {
var input = Array(sender.text ?? "")
var oldPassword = Array(password)
var newPassword = Array("")
//if character(s) are simply deleted from "passwordField" (not replaced or added to), "cursorPosition" is used to determine which corresponding character(s) need to also be removed from "oldPassword"
//this is indicated by "input" comprising of only "•" (bullets) and being shorter in length than "oldPassword"
var onlyBullets = true
for char in input { if char != "•" { onlyBullets = false } }
if onlyBullets && input.count < oldPassword.count {
if let selectedRange = sender.selectedTextRange {
let cursorPosition = sender.offset(from: sender.beginningOfDocument, to: selectedRange.start)
let prefix = String(oldPassword.prefix(cursorPosition))
let suffix = String(oldPassword.suffix(input.count - cursorPosition))
input = Array(prefix + suffix)
} else { input = Array("") }
}
//if no changes were made via input, input would comprise solely of a number of bullets equal to the length of "oldPassword"
//therefore, the number of changes made to "oldPassword" via "input" can be measured with "bulletDifference" by calculating the number of characters in "input" that are NOT bullets
var bulletDifference = oldPassword.count
for char in input { if char == "•" { bulletDifference -= 1 } }
//the only way "bulletDifference" can be less than 0 is if a user copy-pasted a bullet into "input", which cannot be allowed because it breaks this function
//if a user pastes bullet(s) into "input", "input" is deleted
//an edge case not accounted for is pasting a mix of characters and bullets (i.e. "ex•mple") when "oldPassword.count" exceeds the number of bullets in the mixed input, but this does not cause crashes and therefore is not worth preventing
if bulletDifference < 0 {
bulletDifference = oldPassword.count
input = Array("")
}
//"bulletDifference" is used to remove every character from "oldPassword" that corresponds with a character in "input" that has been changed
//a changed character in "input" is indicated by the fact that it is not a bullet
//once "bulletDifference" equals the number of bullets deleted, this loop ends
var bulletsDeleted = 0
for i in 0..<input.count {
if bulletsDeleted == bulletDifference { break }
if input[i] != "•" {
oldPassword.remove(at: i - bulletsDeleted)
bulletsDeleted += 1
}
}
//what remains of "oldPassword" is used to substitute bullets in "input" for appropriate characters to create "newPassword"
//for example, if "oldPassword" is "AcbDE" and "input" is "•bc••", then "oldPassword" will get truncated to "ADE" and "newPassword" will equal "A" + "bc" + "DE", or "AbcDE"
var i = 0
for char in input {
if char == "•" {
newPassword.append(oldPassword[i])
i += 1
} else { newPassword.append(char) }
}
password = String(newPassword)
//"passwordField.text" is then converted into a string of bullets equal to the length of the new password to ensure password security in the UI
sender.text = String(repeating: "•", count: password.count)
}
}
건설적인 비판에 감사드립니다!
스크린샷을 첨부했습니다.스토리보드에서 사용자 이름으로 내용 유형을 변경하거나 프로그래밍 방식으로 할 수 있습니다.UI 텍스트 필드에 대한 확장을 만들 수 있습니다.
func diableAutofill() {
self.autocorrectionType = .no
if #available(iOS 11.0, *) {
self.textContentType = .username
} else {
self.textContentType = .init("")
}
}
텍스트 필드 내용 유형 변경
오브제 C
if (@available(iOS 12.0, *)) {
self.curresntPasswordTxField.textContentType = UITextContentTypeOneTimeCode;
} else {
// Fallback on earlier versions
}
스위프트
self.curresntPasswordTxField.textContentType = .oneTimeCode
self.passwordTextField.autocorrectionType = NO;
작동하지 않는 것 같습니다. 열쇠고리는 여전히 거기에 있습니다.
self.passwordTextField.textContentType = UITextContentTypeName;
위의 코드는 작동하지만 사용자가 애플 ID 계정을 설정하면, 애플 ID의 이름이 키보드에 표시됩니다. 그러면 자동 수정을 설정하여 비활성화할 수 없습니다.아니오로 입력하십시오. Apple이 이 자동 채우기 기능을 아직도 개선하고 있는지 확실하지 않습니다. 지금은 상당히 버그가 많습니다.
이것은 저에게 효과가 있었습니다.
참고: 암호, 암호 확인(해당되는 경우) 및 전자 메일 텍스트 필드에 이 코드를 입력합니다.이메일 텍스트 필드에 입력하지 않고 두 개의 비밀번호 필드에 계속 표시됩니다.
if #available(iOS 12, *) {
// iOS 12: Not the best solution, but it works.
cell.textField.textContentType = .oneTimeCode
} else {
// iOS 11: Disables the autofill accessory view.
cell.textField.textContentType = .init(rawValue: "")
}
모든 를 UITextField로 합니다.UITextContentType("")
또는.oneTimeCode
깨끗한 솔루션이 아닙니다.비활성화 "/비활성화 "isSecureTextEntry
여전히 동일한 문제를 제공합니다.
@갈 샤하르의 대답은 좋지만 여전히 완벽하지 않습니다.마스킹된 문자는 애플의 보안 입력 텍스트에 사용된 마스킹된 문자와 다릅니다.유니코드 문자 'BLACK CIRCLE'(U+25CF) https://www.fileformat.info/info/unicode/char/25cf/index.htm 을 사용해야 합니다.
또한 커서 이동을 처리하지 않습니다.중간에 텍스트를 삽입할 때 커서 위치가 텍스트 끝으로 변경됩니다.텍스트를 선택하고 바꿀 때 잘못된 값을 제공합니다.
사용자 정의 isSecureEntry를 사용하기로 결정한 경우자동 채우기 암호를 피하기 위한 텍스트로, 다음 코드가 있습니다.
스위프트 5 (단순 버전)
@IBOutlet weak var passwordTextField: UITextField!
var maskedPasswordChar: String = "●"
var passwordText: String = ""
var isSecureTextEntry: Bool = true {
didSet {
let selectedTextRange = passwordTextField.selectedTextRange
passwordTextField.text = isSecureTextEntry ? String(repeating: maskedPasswordChar, count: passwordText.count) : passwordText
passwordTextField.selectedTextRange = selectedTextRange
}
}
//this is UITextFieldDelegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == passwordTextField {
//update password string
if let swiftRange = Range(range, in: passwordText) {
passwordText = passwordText.replacingCharacters(in: swiftRange, with: string)
} else {
passwordText = string
}
//replace textField text with masked password char
textField.text = isSecureTextEntry ? String(repeating: maskedPasswordChar, count: passwordText.count) : passwordText
//handle cursor movement
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: range.location + string.utf16.count) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
return false
}
return true
}
Swift 5(마지막 캐릭터 애니메이션을 보호하는 완전한 버전)
private struct Constants {
static let SecuringLastCharPasswordDelay = 1.5
}
@IBOutlet weak var passwordTextField: UITextField!
private var secureTextAnimationQueue: [String] = []
var maskedPasswordChar: String = "●"
var passwordText: String = ""
var isSecureTextEntry: Bool = true {
didSet {
secureTextAnimationQueue.removeAll()
let selectedTextRange = passwordTextField.selectedTextRange
passwordTextField.text = isSecureTextEntry ? String(repeating: maskedPasswordChar, count: passwordText.count) : passwordText
passwordTextField.selectedTextRange = selectedTextRange
}
}
//this is UITextFieldDelegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == passwordTextField {
//update password string
if let swiftRange = Range(range, in: passwordText) {
passwordText = passwordText.replacingCharacters(in: swiftRange, with: string)
} else {
passwordText = string
}
//replace textField text with masked password char
updateTextFieldString(textField, shouldChangeCharactersIn: range, replacementString: string)
//handle cursor movement
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: range.location + string.utf16.count) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
return false
}
return true
}
private func updateTextFieldString(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) {
if isSecureTextEntry {
if string.count == .one, let text = textField.text {
let maskedText = String(repeating: maskedPasswordChar, count: text.count)
var newMaskedText = String()
if let swiftRange = Range(range, in: maskedText) {
newMaskedText = maskedText.replacingCharacters(in: swiftRange, with: string)
} else {
newMaskedText = text + maskedText
}
textField.text = newMaskedText
secureTextAnimationQueue.append(string)
asyncWorker.asyncAfter(deadline: .now() + Constants.SecuringLastCharPasswordDelay) { [weak self] in
self?.securingLastPasswordChar()
}
} else {
secureTextAnimationQueue.removeAll()
textField.text = String(repeating: maskedPasswordChar, count: passwordText.count)
}
} else {
textField.text = passwordText
}
}
private func securingLastPasswordChar() {
guard secureTextAnimationQueue.count > .zero, isSecureTextEntry else { return }
secureTextAnimationQueue.removeFirst()
if secureTextAnimationQueue.count == .zero {
let selectedTextRange = passwordTextField.selectedTextRange
passwordTextField.text = String(repeating: maskedPasswordChar, count: passwordText.count)
passwordTextField.selectedTextRange = selectedTextRange
}
}
Apple 덕분에, isSecureTextEntry가 YES로 설정되었을 때 네이티브 메소드를 사용할 수 없었습니다.Gal Shahar의 방법은 암호 자동 채우기 액세서리 보기 옵션을 비활성화하는 유일한 솔루션입니다.하지만 사용하기가 더 쉽습니다.
목적어 c
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
재빠른
textField(_:shouldChangeCharactersIn:replacementString:)
위임하다그리고 이렇게 간단한 코드를 사용합니다.나중에 textField 실제 콘텐츠를 포함할 String 변수를 선언합니다. 내 것은 pswd입니다.
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
//Thanks iOS13!!!
if(!_pswd)
{
_pswd = @"";
}
_pswd = [_pswd stringByReplacingCharactersInRange:range withString:string];
if (!buttonShowPassword.selected)
{
textField.text = [@"" stringByPaddingToLength:_pswd.length withString: @"•" startingAtIndex:0];
}
else
{
textField.text = _pswd;
}
return NO;
}
스위프트용UI는 다음과 같습니다.
SecureField("Password", text: "some text").disableAutocorrection(true)
필드의 으로 "를 들어 "oneTimeCode"는 "oneTimeCode"입니다.passwordTextField.textContentType = .oneTimeCode
언급URL : https://stackoverflow.com/questions/45452170/ios-11-disable-password-autofill-accessory-view-option
'bestsource' 카테고리의 다른 글
중지 설정 간격 (0) | 2023.08.02 |
---|---|
아이폰이 연결되지 않았습니다.iPhone이 연결되면 Xcode가 계속됩니다. (0) | 2023.08.02 |
Powershell의 날짜 가져오기:변수에서 어제를 22시에 얻는 방법은? (0) | 2023.08.02 |
트위터 부트스트랩에서 모달 클로징 이벤트를 처리하는 방법은? (0) | 2023.08.02 |
웹 드라이버가 파이썬에서 에이잭스 요청을 기다립니다. (0) | 2023.08.02 |