[ios] iOS 11에서 암호 자동 채우기 액세서리보기 옵션을 비활성화 하시겠습니까?

지금은 iOS 11이 제공하는 새로운 옵션, 즉 앱에서 암호를 제안하는 것을 옵트 아웃하고 싶습니다. iOS 11에서 앱을 실행하면 키보드 상단에 자동 채우기 옵션이 표시되고 사용자 이름과 비밀번호 텍스트 필드가 표시되지 않습니다.

제 질문은 키보드의 키가 전혀 표시되지 않고 전반적인 동작이 iOS 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 12isSecureTextEntry속성뿐만 아니라 속성 별로도 암호 textFields를 인식하는 것으로 textContentType보이므로 textContentType을 아무것도 설정하지 않고 secureEntry 기능을 제거하고 앱에서 보안 결함을 유발하지 않는 한이 액세서리보기를 사라지게하는 것은 실제로 불가능합니다. 그런 다음 iOS 12가 textField를 암호 textField로 인식하고이 성가신 액세서리보기를 표시하지 못하게합니다.

제 경우에는 액세서리로 인해 탭했을 때 앱이 응답하지 않는 버그가 발생했습니다 (앱 검토 프로세스에서 앱이 거부되었습니다). 그래서이 기능을 제거해야했습니다. 이 보안 기능을 포기하고 싶지 않았기 때문에 스스로 해결해야했습니다.

아이디어는 secureEntry 기능을 제거하고 수동으로 추가하는 것입니다. 작동했습니다.

여기에 이미지 설명 입력


다음과 같이 할 수 있습니다.

스위프트 4 웨이 :

먼저 여기에 대답 한대로 textContentType아무것도 설정 하지 않습니다.

if #available(iOS 10.0, *) {
    passwordText.textContentType = UITextContentType("")
    emailText.textContentType = UITextContentType("")
}

그보다 나중에 textField 실제 콘텐츠를 포함 할 String 변수를 선언합니다.

var passwordValue = ""

textField 내용이 변경 될 때마다 호출되는 passwordTextField에 대상을 추가합니다.

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하려면 textField 를 .no로 설정 합니다.

passwordText.autocorrectionType = .no

그게 다야 passwordValue 로그인을 수행 데 사용하십시오.

누군가를 도울 수 있기를 바랍니다.

최신 정보

붙여 넣은 값도 포착하고 전에 추가하는 것을 잊었습니다.


답변

사용자 이름이나 비밀번호가 아닌 콘텐츠 유형을 지정하여 기능을 비활성화 할 수 있습니다. 예를 들어 사용자가 이메일 주소를 입력해야하는 경우 다음을 사용할 수 있습니다.

usernameTextField?.textContentType = .emailAddress


답변

다음과 같이 UITextContentType에 대한 확장을 추가 할 수 있습니다.

extension UITextContentType {
    public static let unspecified = UITextContentType("unspecified")
}

그 후에 사용할 수 있습니다

if #available(iOS 10.0, *) {
    passwordField.textContentType = .unspecified
}


답변

ios11의 매우 간단한 접근 방식이 저에게 효과적이었습니다. iboutlet이 usernametextfield 및 passwordtextfield라고 가정합니다. 두 outlest를 보유하는 viewcontroller의 viewDidLoad () 함수에서 다음 코드를 사용하십시오.

usernametextfield.textContentType = UITextContentType("")
passwordtextfield.textContentType = UITextContentType("")

그 후에는 텍스트 필드를 탭할 때 자동 완성 액세서리 옵션이 표시되지 않습니다.


답변

@Gal Shahar 답변에 대한 응답.

iOS 12 는 비밀번호 텍스트 필드를 isSecureTextEntry속성 별로 인식 하지 않고textContentType .

자동 완성 제안을 우회하는 방법.

  1. isSecureTextEntry 속성을 false로 설정 합니다.

self.passwordTextField.secureTextEntry = NO;

  1. 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;
}

참고 : -UITextField 대리자 메서드를 사용 하지 마십시오.shouldBeginEditing 여전히 자동 채우기 제안이 표시됩니다. UITextField 대리자 메서드를 사용 하지 마십시오textFieldDidChange . 첫 번째 문자가 표시된 후에 발생하므로 첫 번째 문자를 자동 삭제합니다. 그리고 ‘secureTextEntry’는 필드를 비 웁니다.


답변

목표 -C

if (@available(iOS 10, *)){
    self.tfEmail.textContentType = @"";
    self.tfPassword.textContentType = @"";
}

이것은 나를 위해 일했습니다.