使用Swift向iOS钥匙串添加项目和查询

使用Swift向iOS钥匙串添加项目和查询,第1张

概述我无法将所有可用于添加数据的Objective C代码示例转换为从iOS钥匙串查询数据到 Swift.我试图做一个字符串(访问令牌)的基本存储并读回来.我已经看了Stack Overflow上的其他一些问题,但我不能完全相信它.我试图从各种来源拼凑一个解决方案. 编辑1:我尝试了一个更基本的设置,因为我以为我的self.defaultKeychainQuery可能已经搞砸了.我已将以下代码更新为最 我无法将所有可用于添加数据的Objective C代码示例转换为从iOS钥匙串查询数据到 Swift.我试图做一个字符串(访问令牌)的基本存储并读回来.我已经看了Stack Overflow上的其他一些问题,但我不能完全相信它.我试图从各种来源拼凑一个解决方案.

编辑1:我尝试了一个更基本的设置,因为我以为我的self.defaultKeychainquery可能已经搞砸了.我已将以下代码更新为最新版本.

编辑2:得到它的工作.我没有正确地将数据值添加到保存查询.我需要将字符串转换为NSData.我已将以下代码更新为最新的工作版本.

编辑3:由于Xerxes在下面指出,因为字典的一些问题,此代码不适用于高于Beta 1的Xcode版本.如果你知道这是一个修复,请让我知道.

更新:我把它变成了keychain library written in Swift called Locksmith.

保存

class func save(service: Nsstring,data: Nsstring) {  var dataFromString: NSData = data.dataUsingEnCoding(NSUTF8StringEnCoding,allowLossyConversion: false)  // Instantiate a new default keychain query  var keychainquery: NSMutableDictionary = NSMutableDictionary(objects: [kSecclassGenericPassword,service,userAccount,dataFromString],forKeys: [kSecclass,kSecAttrService,kSecAttrAccount,kSecValueData])  // Delete any existing items  SecItemDelete(keychainquery as CFDictionaryRef)  // Add the new keychain item  var status: Osstatus = SecItemAdd(keychainquery as CFDictionaryRef,nil)  // Check that it worked ok  println("Saving status code is: \(status)")}

加载

class func load(service: Nsstring) -> AnyObject? {    // Instantiate a new default keychain query    // Tell the query to return a result    // limit our results to one item    var keychainquery: NSMutableDictionary = NSMutableDictionary(objects: [kSecclassGenericPassword,kcfBooleanTrue,kSecMatchlimitOne],kSecReturnData,kSecMatchlimit])    // I'm not too sure what's happening here...    var dataTypeRef :Unmanaged<AnyObject>?    // Search for the keychain items    let status: Osstatus = SecItemcopyMatching(keychainquery,&dataTypeRef)    println("Loading status code is: \(status)")    // I'm not too sure what's happening here...    let opaque = dataTypeRef?.toOpaque()    if let op = opaque? {      let retrIEvedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue()      println("RetrIEved the following data from the keychain: \(retrIEvedData)")      var str = Nsstring(data: retrIEvedData,enCoding: NSUTF8StringEnCoding)      println("The decoded string is \(str)")    } else {      println("nothing was retrIEved from the keychain.")    }    return nil  }

用法(查看控制器)

KeychainService.savetoken("sometoken")KeychainService.loadToken()

使用这些方便的方法

class func savetoken(token: Nsstring) {    self.save("service",data: token)  }class func loadToken() {    var token = self.load("service")    if let t = token {      println("The token is: \(t)")    }  }

这导致控制台中的输出:

Saving status code is: 0Loading status code is: 0RetrIEved the following data from the keychain: <736f6d65 746f6b65 6e>The decoded string is sometoken

非常感谢你的帮助.我不太确定一旦获得了它,或者如果它有任何数据给上面的代码,该如何处理dataTypeRef.

为了使其正常工作,您将需要检索钥匙串常量的保留值并存储,首先如下所示:
let kSecclassValue = kSecclass.takeRetainedValue() as Nsstringlet kSecAttrAccountValue = kSecAttrAccount.takeRetainedValue() as Nsstringlet kSecValueDataValue = kSecValueData.takeRetainedValue() as Nsstringlet kSecclassGenericPasswordValue = kSecclassGenericPassword.takeRetainedValue() as Nsstringlet kSecAttrServiceValue = kSecAttrService.takeRetainedValue() as Nsstringlet kSecMatchlimitValue = kSecMatchlimit.takeRetainedValue() as Nsstringlet kSecReturnDataValue = kSecReturnData.takeRetainedValue() as Nsstringlet kSecMatchlimitOneValue = kSecMatchlimitOne.takeRetainedValue() as Nsstring

然后,您可以引用NSMutableDictionary中的值,如下所示:

var keychainquery: NSMutableDictionary = NSMutableDictionary(objects: [kSecclassGenericPasswordValue,kSecMatchlimitOneValue],forKeys: [kSecclassValue,kSecAttrServiceValue,kSecAttrAccountValue,kSecReturnDataValue,kSecMatchlimitValue])

我写了一篇关于它的博文:
http://rshelby.com/2014/08/using-swift-to-save-and-query-ios-keychain-in-xcode-beta-4/

希望这可以帮助!

rshelby

总结

以上是内存溢出为你收集整理的使用Swift向iOS钥匙串添加项目和查询全部内容,希望文章能够帮你解决使用Swift向iOS钥匙串添加项目和查询所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1038886.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存