首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密钥链+ adhoc分布

密钥链+ adhoc分布
EN

Stack Overflow用户
提问于 2014-10-16 09:39:03
回答 2查看 1.1K关注 0票数 4

首先,我们正在开发一个使用Swift/Xcode 6.1GM 2进行开发的iOS应用程序。

在分发应用程序时,我们遇到了一些令人困惑的密钥链访问问题,并且在查找原因方面也有问题。所有的配置文件都与我们的应用程序的包名相匹配。我们使用TestFlight进行分发,尽管我不认为这是问题所在。

我们只是设法让它在iOS 7设备上工作,而这些设备之前并没有安装应用程序。没有一个iOS 8设备是临时工作的。我们在开始时得到的错误是25300 (errSecItemNotFound),而现在在重置配置文件之后,我们得到了一个普通的0(无论是在加载时保存数据,还是无法检索数据)。当从Xcode部署dev生成时,一切都很完美。

我已经分离了我们使用的密钥链包装器的代码:

代码语言:javascript
复制
import UIKit
import Security

let serviceIdentifier = "com.Test.KeychainTest"

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 NSString

class 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)
    var alertView = UIAlertView();
    alertView.addButtonWithTitle("Ok");
    alertView.title = "Status";
    alertView.message = "Saving \(status)";
    alertView.show();
}

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, service, key, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])

    var dataTypeRef :Unmanaged<AnyObject>?

    // Search for the keychain items
    let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
    var alertView = UIAlertView();
    alertView.addButtonWithTitle("Ok");
    alertView.title = "Status";
    alertView.message = "Loading \(status)";
    alertView.show();

    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
}


}
  1. 有什么我们可能错过的吗?
  2. 解决此问题的最佳方法是什么?在日志/ iPhone配置实用程序中,我们不会从密钥链中获得任何错误。目前,我只是在代码中添加了一些简单的警报,以了解操作的状态。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-20 14:24:12

供应配置文件和密钥链代码中的所有内容似乎都很好。问题是Swift编译器中的设置..。将“发布”的优化级别从“最快的”更改为“无”,这似乎解决了问题

票数 2
EN

Stack Overflow用户

发布于 2014-10-17 23:13:25

确保您还为kSecAttrAccessible指定了值。还可以为kSecAttrAccessControl指定值,即在iOS8中添加

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26401080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档