退出 UIViewController 时禁用“保存密码”操作表?

Mik*_*r67 5 keychain uiviewcontroller ios

我的应用程序有一个“创建帐户”视图控制器(如下所示),提示用户输入用户名和密码。每当我转到另一个视图控制器时,都会弹出一个操作表,提示将密码保存在钥匙串中。

如果用户成功创建新帐户,这是一个漂亮的小免费赠品。但是,如果用户点击导航栏中的取消(后退)按钮,如果他们选择使用 Facebook 登录而不是创建帐户的选项,或任何其他离开此视图控制器的方式,我都会收到相同的弹出窗口(见图以下)。

我怎样才能让这个弹出窗口只在用户成功创建新帐户时显示?

编辑:根据请求,这里是与导致“保存密码”操作表出现的 segue 相关的代码。

来自CreateAccountViewController.swift

class CreateAccountViewController : UIViewController
{
  // ... bunch of irrelevant code deleted ...

  // bound to "Connect with Facebook" button (see image below)
  @IBAction func switchToFacebook(_ sender : UIButton)
  {
    performSegue(.SwitchToFacebookLogin, sender: sender)
  }
  // ... bunch of irrelevant code deleted ...
}

extension CreateAccountViewController : GameServerAlertObserver
{
  // callback based on response from GameCenter after 
  //  submitting a "create new user" request
  func handleConnectionResponse(_ response:GameServerResponse )
  {
    switch response
    {
    // ... other response cases removed ...
    case .UserCreated:
      self.removeSpinner()
      performSegue(.CreateAccountToStartup, sender: self)

    default:
      response.displayAlert(over: self, observer: self)
      self.removeSpinner()
    }
  }

  // Functions defined in the GameServerAlertObserver protocol
  //   to handle user response to "User Exists Popup" (figure below)    
  func ok()
  {
    // user chose to enter new  password... clear the existing username field
    usernameTextField.text = ""
  }

  func cancel()
  {
    // segue back to the startup view controller
    performSegue(.CreateAccountToStartup, sender: self)
  }

  func goToLogin()
  {
    // segue to the login view controller
    performSegue(.SwitchToAccountLogin, sender:self)
  }
}
Run Code Online (Sandbox Code Playgroud)

来自UIViewController_Segues

enum SegueIdentifier : String
{
  case LoserBoard             = "loserBoard"
  case CreateAccount          = "createAccount"
  case AccountLogin           = "accountLogin"
  case FacebookLogin          = "facebookLogin"
  case SwitchToFacebookLogin  = "switchToFacebookLogin"
  case SwitchToAccountLogin   = "switchToAccountLogin"
  case CreateAccountToStartup = "createAccountToStartup"
  case AccountLoginToStartup  = "accountLoginToStartup"
  case FacebookLoginToStartup = "facebookLoginToStartup"
  case UnwindToStartup        = "unwindToStartup"
}

extension UIViewController
{ 
  func performSegue(_ target:SegueIdentifier, sender:Any?)
  {
    performSegue(withIdentifier: target.rawValue, sender: sender)
  }
}
Run Code Online (Sandbox Code Playgroud)

来自GameServerAlert.swift

protocol GameServerAlertObserver
{
  func ok()
  func cancel()
  func goToLogin()
}

extension GameServerResponse
{
  func displayAlert(over controller:UIViewController, observer:GameServerAlertObserver? = nil)
  {
    var title   : String
    var message : String
    var actions : [UIAlertAction]

    switch self
    {
    // ... deleted cases/default which don't lead to segue ...

    case .UserAlreadyExists:
      title = "User already exists"
      message = "\nIf this is you, please use the login page to reconnect.\n\nIf this is not you, you will need to select a different username."
      actions = [
        UIAlertAction(title: "Go to Login page",   style: .default, handler: { _ in observer?.goToLogin() } ),
        UIAlertAction(title: "Enter new username", style: .default, handler: { _ in observer?.ok() } ),
        UIAlertAction(title: "Cancel",             style: .cancel,  handler: { _ in observer?.cancel() } )
      ]
    }

    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    actions.forEach { (action) in alert.addAction(action) }
    controller.present(alert,animated:true)
  }
}
Run Code Online (Sandbox Code Playgroud)

模拟器中的例子:

创建帐户- (用户在此处输入新帐户的用户名和密码。)

在此处输入图片说明

Facebook登入

如果用户决定使用 Facebook 登录而不是创建用户帐户,他们将被带到这个视图(我还没有充实)。请注意,“保存密码”操作表已弹出。

在此处输入图片说明

用户存在弹出窗口

如果用户尝试使用已存在的用户名创建帐户,他们将看到此弹出窗口。如果他们选择Cancel,他们将返回到启动屏幕(见下文)。如果他们选择Enter new username,他们将保留在同一个屏幕上并清除用户名。如果他们选择Login,他们将被带到登录屏幕。

在此处输入图片说明

启动画面

如果用户选择上面的取消,他们将被带回这里。再次注意,“保存密码”操作表已弹出。

在此处输入图片说明

小智 2

抱歉,我的回答很简短,我通常不会在此网站上发帖。这是创建用户屏幕关闭时设备上发生的密码自动填充。

苹果文档:https://developer.apple.com/documentation/security/password_autofill

这是一个很好地满足所有要求的网站的链接:https://developerinsider.co/ios12-password-autofill-automatic-strong-password-and-security-code-autofill/

  • 在第二个链接的大约 3/4 处,我找到了显示自动保存弹出窗口所需的条件。看起来如果我在关闭登录视图之前清除密码字段,弹出窗口将不符合标准,并且不会显示自动保存弹出窗口。我现在要赞成这个答案。稍后,我将看看是否可以从 git 恢复旧版本并进行测试。如果它成功了,我会将其标记为答案。谢谢。 (3认同)