SecItemCopyMatching возвращает errSecItemNotFound

Взаимодействие с REST API и сохранение токена API в связке ключей iOS. Но код связки ключей выдает nil ошибку.

KeychainAccess.swift:

public class func passwordForAccount(account: String, service: String = "keyChainDefaultService") -> String? {
    let queryAttributes = NSDictionary(objects: [secClassGenericPassword(), service, account, true], forKeys: [secClass(), secAttrService(), secAttrAccount(), secReturnData()])

    var retrievedData: NSData?
    var extractedData: AnyObject?
    let status = SecItemCopyMatching(queryAttributes, &extractedData)

    if (status == errSecSuccess) {
        retrievedData = extractedData as? NSData
    }
    let password = NSString(data: retrievedData!, encoding: NSUTF8StringEncoding)

    return (password as! String)
}

В приведенном выше коде retrievedData равно нулю. Если я сделаю print(status), я получу -25300. Эта функция вызывается из контроллера представления:

// check if API token has expired
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let userTokenExpiryDate : String? = KeychainAccess.passwordForAccount("Auth_Token_Expiry", service: "KeyChainService")
let dateFromString : NSDate? = dateFormatter.dateFromString(userTokenExpiryDate!)
let now = NSDate()

Я не уверен, где я ошибаюсь. Есть указатели?


person DemCodeLines    schedule 13.10.2015    source источник
comment
Ну, вы действительно сохранили пароль, прежде чем пытаться его прочитать?   -  person Sulthan    schedule 13.10.2015
comment
Да, информация, которую он пытается прочитать, сохраняется / обновляется, когда пользователь входит в систему. Я смог войти в систему нормально (это означает, что токены были сохранены), но как только я нажимаю новый контроллер представления (после входа в систему), он выдает нулевая ошибка.   -  person DemCodeLines    schedule 13.10.2015
comment
возможность войти в систему и сохранить токены - это две разные вещи. Судя по указанной вами ошибке, ничего не было спасено. Может account или service разные при обслуживании? Например. разные строчные / прописные буквы?   -  person Sulthan    schedule 13.10.2015
comment
pastebin.com/mDr44kUW ‹- это код, который запускается при входе в систему. Я надеюсь, что он работает успешно, и токены сохраняются в связке ключей. Но если это не сохраняется, тогда я понимаю, в чем проблема.   -  person DemCodeLines    schedule 13.10.2015


Ответы (1)


    var extractedData : AnyObject?;
    let status = withUnsafeMutablePointer(&extractedData) {
        SecItemCopyMatching(queryAttributes, UnsafeMutablePointer($0))
    }

Попробуйте сделать это так, вот как я должен был заставить его работать

person Knight0fDragon    schedule 13.10.2015