这就是我保存它的方式:
func SaveNumberOfImagesTaken() { let key = "IMAGE_TAKEN" var taken = 10 let data = NSKeyedArchiver.archivedDataWithRootObject(taken) let query : [String:AnyObject] = [ kSecclass as String : kSecclassGenericPassword,kSecAttrAccount as String : key,kSecValueData as String : data ] let status : Osstatus = SecItemAdd(query as CFDictionaryRef,nil) }
这是我尝试检索它的方式:
func CheckIfKeyChainValueExitss() -> AnyObject? { var key = "IMAGE_TAKEN" let query : [String:AnyObject] = [ kSecclass as String : kSecclassGenericPassword,kSecReturnData as String : kcfBooleanTrue,kSecMatchlimit as String : kSecMatchlimitOne ] var dataTypeRef :Unmanaged<AnyObject>? let status: Osstatus = SecItemcopyMatching(query,&dataTypeRef) if let op = dataTypeRef?.toOpaque() { let data = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue() if let string: AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? AnyObject? { if key == "IMAGE_TAKEN" { return string as! String! } else if string == nil { return nil } } } return nil}
我收到以下错误:
Could not cast value of type ‘__NSCFNumber’ to ‘Nsstring’
我试过玩变量但没有成功.
解决方法 我更新了Eric的Swift 3版本:class KeyChain { class func save(key: String,data: Data) -> Osstatus { let query = [ kSecclass as String : kSecclassGenericPassword as String,kSecValueData as String : data ] as [String : Any] SecItemDelete(query as CFDictionary) return SecItemAdd(query as CFDictionary,nil) } class func load(key: String) -> Data? { let query = [ kSecclass as String : kSecclassGenericPassword,kSecMatchlimit as String : kSecMatchlimitOne ] as [String : Any] var dataTypeRef: AnyObject? = nil let status: Osstatus = SecItemcopyMatching(query as CFDictionary,&dataTypeRef) if status == noErr { return dataTypeRef as! Data? } else { return nil } } class func createUniqueID() -> String { let uuID: CFUUID = CFUUIDCreate(nil) let cfStr: CFString = CFUUIDCreateString(nil,uuID) let swiftString: String = cfStr as String return swiftString }}extension Data { init<T>(from value: T) { var value = value self.init(buffer: UnsafeBufferPointer(start: &value,count: 1)) } func to<T>(type: T.Type) -> T { return self.withUnsafeBytes {let int: Int = 555 let data = Data(from: int) let status = KeyChain.save(key: "MyNumber",data: data) print("status: ",status) if let receivedData = KeyChain.load(key: "MyNumber") { let result = receivedData.to(type: Int.self) print("result: ",result) }.pointee } }}
用法示例:
总结以上是内存溢出为你收集整理的ios – 通过KeyChain保存并检索值全部内容,希望文章能够帮你解决ios – 通过KeyChain保存并检索值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)