以下是钥匙串代码的摘录:
import UIKit import Security let serviceIDentifIEr = "com.ourdomain" let kSecclassValue = kSecclass as Nsstring let kSecAttrAccountValue = kSecAttrAccount as Nsstring let kSecValueDataValue = kSecValueData as Nsstring let kSecclassGenericPasswordValue = kSecclassGenericPassword as Nsstring let kSecAttrServiceValue = kSecAttrService as Nsstring let kSecMatchlimitValue = kSecMatchlimit as Nsstring let kSecReturnDataValue = kSecReturnData as Nsstring let kSecMatchlimitOneValue = kSecMatchlimitOne as Nsstringclass KeychainManager { class func setString(value: Nsstring,forKey: String) { self.save(serviceIDentifIEr,key: forKey,data: value) } class func stringForKey(key: String) -> Nsstring? { var token = self.load(serviceIDentifIEr,key: key) return token } class func removeItemForKey(key: String) { self.save(serviceIDentifIEr,key: key,data: "") } class func save(service: Nsstring,key: String,data: Nsstring) { var dataFromString: NSData = data.dataUsingEnCoding(NSUTF8StringEnCoding,allowLossyConversion: false)! // Instantiate a new default keychain query var keychainquery: NSMutableDictionary = NSMutableDictionary(objects: [kSecclassGenericPasswordValue,service,key,dataFromString],forKeys: [kSecclassValue,kSecAttrServiceValue,kSecAttrAccountValue,kSecValueDataValue]) // Delete any existing items SecItemDelete(keychainquery as CFDictionaryRef) if data == "" { return } // Add the new keychain item var status: Osstatus = SecItemAdd(keychainquery as CFDictionaryRef,nil) } class func load(service: Nsstring,key: String) -> Nsstring? { // Instantiate a new default keychain query // Tell the query to return a result // limit our results to one item var keychainquery: NSMutableDictionary = NSMutableDictionary(objects: [kSecclassGenericPasswordValue,kcfBooleanTrue,kSecMatchlimitOneValue],kSecReturnDataValue,kSecMatchlimitValue]) var dataTypeRef :Unmanaged<AnyObject>? // Search for the keychain items let status: Osstatus = SecItemcopyMatching(keychainquery,&dataTypeRef) let opaque = dataTypeRef?.toOpaque() var contentsOfKeychain: Nsstring? if let op = opaque? { let retrIEvedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue() // Convert the data retrIEved from the keychain into a string contentsOfKeychain = Nsstring(data: retrIEvedData,enCoding: NSUTF8StringEnCoding) } else { return nil } return contentsOfKeychain } }
在应用程序已经通过Xcode 6.1安装在设备上之后,我注意到“serviceIDentifIEr” – “com.ourdomain”不正确,并且与配置所需的应用程序包标识符不匹配.
然后我更改了“serviceIDentifIEr”值以匹配包标识符 – “com.ourdomain.appname”,但是当通过Testflight进行配置时,应用程序将无法在设备上运行.我很肯定这是因为设备已经安装了带有错误标识符的软件包ID的钥匙串,但是我无法理解如何解决这个问题,以便在移除应用程序时移除钥匙串或者使用配置文件来使用现有的钥匙串(标识符不正确)
任何帮助将不胜感激.提前致谢
解决方法 使用withUnsafeMutablePointer函数和UnsafeMutablePointer结构来检索数据,如下所示:var result: AnyObject?var status = withUnsafeMutablePointer(&result) { SecItemcopyMatching(keychainquery,UnsafeMutablePointer()) }if status == errSecSuccess { if let data = result as NSData? { if let string = Nsstring(data: data,enCoding: NSUTF8StringEnCoding) { // ... } }}
它与发布(最快优化)构建一起工作正常.
总结以上是内存溢出为你收集整理的ios – Swift钥匙串和配置文件全部内容,希望文章能够帮你解决ios – Swift钥匙串和配置文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)