在iOS 8共享扩展中访问共享钥匙串返回nil

时间:2014-11-28 14:31:10

标签: ios swift frameworks ios8 keychain

问题:

我有一个iOS 8应用程序,其中包含用于钥匙串访问和共享扩展的框架。

enter image description here

主机应用程序和共享扩展程序都链接了钥匙串访问框架,它们共享一个钥匙串。

一切都在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类添加到主机应用程序的目标中。但我仍然无法访问发布版本中的钥匙串。

1 个答案:

答案 0 :(得分:-1)

我想我发现了一个临时修复。正如对this answer的评论中所建议的那样,我将Swift编译器的优化设置为钥匙串访问目标中的None[-Onone],现在似乎可以正常工作。