iOS 11禁用密码自动填充附件查看选项?

zum*_*zum 72 ios swift ios11

截至目前,我想选择退出iOS 11提供的新选项,即在应用程序中建议密码.当我在iOS 11上运行应用程序时,我在键盘顶部获得了自动填充选项,我的用户名和密码文本字段甚至都没有出现.

所以,我的问题是,如何一起禁用新密码自动填充功能,以便键盘上的键完全不显示,整体行为与iOS 11之前的相同?

在此输入图像描述

Bar*_*mre 63

iOS 11和12 - Swift 4.2(更新):

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: "")
}
Run Code Online (Sandbox Code Playgroud)

iOS 11说明:

确保UITextField像这样设置所有对象.

例如,如果您有一个UITextField用户必须输入其电子邮件地址的对象,另一个用户必须输入密码的对象必须分配UITextContentType("")给他们的两个textContentType属性.否则它将无法工作,仍会显示自动填充附件视图.

  • 不适用于iOS 12 ...任何解决方案? (3认同)

Gal*_*har 9

iOS 12似乎也通过isSecureTextEntry属性而不仅仅通过textContentType属性来识别密码textFields ,因此除非你将textContentType设置为空,并删除secureEntry功能(并在你的应用程序中导致安全漏洞),否则不可能使这个附件视图消失然后阻止iOS 12将textField识别为密码textField并显示这个烦人的配件视图.

在我的情况下,配件导致了一个错误,当我点击时我的应用程序没有响应(这也使我的应用程序在应用程序审核过程中被拒绝).所以我不得不删除此功能.我不想放弃这个安全功能所以我必须自己解决问题.

我们的想法是删除secureEntry功能,但手动添加它.它确实有效:

在此输入图像描述


它可以这样做:

Swift 4路:

首先,在这里回答,设置textContentType为空:

if #available(iOS 10.0, *) {
    passwordText.textContentType = UITextContentType("")
    emailText.textContentType = UITextContentType("")
}
Run Code Online (Sandbox Code Playgroud)

然后,声明一个String变量,该变量稍后将包含我们的textField真实内容:

var passwordValue = ""

将目标添加到passwordTextField,每次textField内容更改时都会调用该目标:

passwordText.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
Run Code Online (Sandbox Code Playgroud)

现在,这将是魔术,声明将处理文本替换的函数:

@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)
}
Run Code Online (Sandbox Code Playgroud)

最后,将textField设置autocorrectionType.noto以删除预测文本:

passwordText.autocorrectionType = .no
Run Code Online (Sandbox Code Playgroud)

就是这样,用于passwordValue执行登录.

希望它能帮助别人.

UPDATE

它也捕获粘贴的值,忘了之前添加它.

  • 极好的!不错的黑客伙伴!遗憾的是,iOS 让我们破解而不是提供更简洁的方法来做最基本的事情。这应该是公认的答案。 (2认同)

ash*_*ish 9

回应@Gal Shahar 的回答。

iOS 12isSecureTextEntry属性识别密码文本字段,而不仅仅是按textContentType属性。

绕过自动填充建议的方法。

  1. isSecureTextEntry 属性设置为 false。

self.passwordTextField.secureTextEntry = NO;

  1. 添加 UITextField 委托方法并启用该isSecureTextEntry 属性。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField == self.passwordTextField && !self.passwordTextField.secureTextEntry) {
        self.passwordTextField.secureTextEntry = YES;
    }

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

注: -执行使用shouldBeginEditing的UITextField委托方法它仍然会显示自动填充建议。千万不要使用textFieldDidChange的UITextField委托方法它会自动删除第一charachter为显示第一charachter后,它会发生。'secureTextEntry' 将清空该字段。


geb*_*bel 8

可以通过指定既不是用户名也不是密码的内容类型来禁用该功能.例如,如果用户应输入电子邮件地址,则可以使用

usernameTextField?.textContentType = .emailAddress
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,我在密码字段上方有一个电子邮件地址字段,电子邮件地址字段提供自动完成功能。 (2认同)

Mik*_*nov 8

您可以像这样为UITextContentType添加扩展名

extension UITextContentType {
    public static let unspecified = UITextContentType("unspecified")
}
Run Code Online (Sandbox Code Playgroud)

之后,你可以使用它

if #available(iOS 10.0, *) {
    passwordField.textContentType = .unspecified
}
Run Code Online (Sandbox Code Playgroud)


Amm*_*mad 6

ios11中一个非常简单的方法为我工作.假设您的iboutlet是usernametextfield和passwordtextfield.在viewcontroller的viewDidLoad()函数中,保存两者都使用以下代码

usernametextfield.textContentType = UITextContentType("")
passwordtextfield.textContentType = UITextContentType("")
Run Code Online (Sandbox Code Playgroud)

在此之后,当您点击文本字段时,您将看不到自动填充附件选项.


小智 5

Objective-C的

if (@available(iOS 10, *)){
    self.tfEmail.textContentType = @"";
    self.tfPassword.textContentType = @"";
}
Run Code Online (Sandbox Code Playgroud)

这对我有用.


小智 2

您可以在此处尝试不同的答案,得出的结论是可能会删除附件视图。但这留下了一些错误。

您可以尝试实现一个自定义键盘,仅用于密码字段。还尝试禁用文本字段的建议,我认为这也会隐藏accessoryView.

编辑:苹果论坛上仍然没有关于同一问题的答案。UITextField另外我在官方文档中找不到与此相关的任何内容。