我有一个iOS 8应用程序,其中包含用于钥匙串访问和共享扩展的框架。
主机应用程序和共享扩展程序都链接了钥匙串访问框架,它们共享一个钥匙串。
一切都在Debug配置中有效。但是当我使用Release配置时,当我尝试从钥匙串接收密码时,值dataTypeRef
始终为nil
。
我已经尝试添加应用程序组但没有运气。
有谁知道为什么它不适用于发布版本?感谢
在钥匙串访问框架中,我为密钥链添加了一个密码,如下所示:
public class func setPassword(password: String, account: String, service: String = "kDDHDefaultService") {
var secret: NSData = password.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
let objects: Array = [secClassGenericPassword(), service, account, secret]
let keys: Array = [secClass(), secAttrService(), secAttrAccount(), secValueData()]
let query = NSDictionary(objects: objects, forKeys: keys)
SecItemDelete(query as CFDictionaryRef)
let status = SecItemAdd(query as CFDictionaryRef, nil)
}
要接收密码,请执行以下操作:
public class func passwordForAccount(account: String, service: String = "kDDHDefaultService") -> String? {
let keys: [AnyObject] = [secClass(), secAttrService(), secAttrAccount(), secReturnData()]
let objects: [AnyObject] = [secClassGenericPassword(), service, account, true]
println("keys \(keys), objects \(objects)")
let queryAttributes = NSDictionary(objects: objects, forKeys: keys)
var dataTypeRef : Unmanaged<AnyObject>?
let status = SecItemCopyMatching(queryAttributes, &dataTypeRef);
if status == errSecItemNotFound {
println("not Found")
return nil
}
if dataTypeRef == nil { // dataTypeRef is always nil in Release builds
println("dataTypeRef == nil")
return nil
}
let retrievedDataRef : CFDataRef = dataTypeRef!.takeRetainedValue() as CFDataRef
let retrievedData : NSData = retrievedDataRef
let password = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
return password as? String
}
注意:这与共享扩展程序无关,它甚至不适用于主机应用程序。
更新:对于测试,我已将KeychainAccess类添加到主机应用程序的目标中。但我仍然无法访问发布版本中的钥匙串。
答案 0 :(得分:-1)
我想我发现了一个临时修复。正如对this answer的评论中所建议的那样,我将Swift编译器的优化设置为钥匙串访问目标中的None[-Onone]
,现在似乎可以正常工作。