2016-08-01 31 views
2

Wir retireve jede Passwörter durch die Funktion gespeichert:SecRequestSharedWebCredential Anmeldeinformationen enthält "Passwörter nicht gespeichert"?

SecRequestSharedWebCredential(NULL, NULL, ^(CFArrayRef credentials, CFErrorRef error) { 
    if (!error && CFArrayGetCount(credentials)) { 
     CFDictionaryRef credential = CFArrayGetValueAtIndex(credentials, 0); 
     if (credential > 0) { 
      CFDictionaryRef credential = CFArrayGetValueAtIndex(credentials, 0); 
      NSString *username = CFDictionaryGetValue(credential, kSecAttrAccount); 
      NSString *password = CFDictionaryGetValue(credential, kSecSharedPassword); 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       //Updates the UI here. 
      }); 
     } 
    } 
}); 

Das Problem ist, dass auf IOS 9.3.3 iPhone 6 A1524 wir die Aufforderung mit einem Eintrag erhalten namens ‚Passwörter nicht gespeichert.‘ Es gibt keine Fehlermeldung, die darauf hinweist, dass keine Passwörter gefunden wurden. Da das Array> 0 ist, wird das Formular mit dem Eintrag vervollständigt.

Warum ist das der Fall? Wir dachten, das prmopt erscheint nicht, wenn unter Ihren berechtigten Domains keine Passwörter gespeichert sind.

Irgendwelche Vorschläge?

Vielen Dank.

Antwort

1

Ich überprüfe dafür in viewDidLoad() für meine Auth View-Controller. Der Code ist ein bisschen anders als oben, aus mehreren anderen SO-Antworten.

Swift 3:

SecRequestSharedWebCredential(Configuration.webBaseFQDN as CFString, nil, { (credentials, error) in 

    if let error = error { 
     print("ERROR: credentials") 
     print(error) 
    } 

    guard let credentials = credentials, CFArrayGetCount(credentials) > 0 else { 
     // Did not find a shared web credential. 
     return 
    } 

    guard CFArrayGetCount(credentials) == 1 else { 
     // There should be exactly one credential. 
     return 
    } 

    let unsafeCredential = CFArrayGetValueAtIndex(credentials, 0) 
    let credential = unsafeBitCast(unsafeCredential, to: CFDictionary.self) 

    let unsafeEmail = CFDictionaryGetValue(credential, Unmanaged.passUnretained(kSecAttrAccount).toOpaque()) 
    let email = unsafeBitCast(unsafeEmail, to: CFString.self) as String 

    let unsafePassword = CFDictionaryGetValue(credential, Unmanaged.passUnretained(kSecSharedPassword).toOpaque()) 
    let password = unsafeBitCast(unsafePassword, to: CFString.self) as String 

    if self.isValidEmail(email) && self.isValidPassword(password) { 
     self.usedSharedWebCredentials = true 
     self.doSignIn(email: email, password: password) 
    } 
}) 

Die zusätzliche Prüfung am Ende für isValidEmail(_:) und isValidPassword(_:) behandelt den Fall, in dem SecRequeestSharedWebCredential() kehrt im ersten Berechtigungsnachweis "Passwörter nicht gespeichert" (E-Mail).

Hoffentlich kann jemand erklären, warum das passiert, aber wenn nicht, dann gibt es zumindest eine Möglichkeit, dieses Szenario einzufangen.

Ich möchte auch hinzufügen, dass ich dies bis iOS 10.2.1

gesehen habe