【问题标题】:Keychain + adhoc distribution钥匙串 + 即席分发
【发布时间】:2014-10-16 09:39:03
【问题描述】:

首先,一些细节:我们正在开发一个 iOS 应用程序,目前使用 Swift/Xcode 6.1 GM 2 进行开发。

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

我们只设法让它在之前没有安装该应用程序的 iOS 7 设备上运行。没有一台 iOS 8 设备是临时工作的。我们一开始遇到的错误是 25300 (errSecItemNotFound),现在在重置配置文件后我们得到一个普通的 0(在加载时保存并且仍然无法检索数据)。从 Xcode 部署开发版本时一切正常。

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

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 配置实用程序中的钥匙串中得到任何错误。目前我只是在代码中添加了一些简单的警报,以了解操作的状态。

【问题讨论】:

    标签: xcode swift ios8 keychain


    【解决方案1】:

    配置文件和钥匙串代码中的一切似乎都很好。问题是 Swift 编译器中的一个设置...将“发布”的优化级别从“最快”更改为“无”,这似乎解决了问题

    【讨论】:

    • 鉴于没有优化的 Swift 有多慢,这是一个可怕的解决方案。也许关闭单个文件的优化会更好。
    • @jshier 你能解释一下如何为单个文件执行此操作吗?
    • 在您的目标“构建阶段”->“编译源”中,双击“编译器标志”列并添加 -Onone 设置。
    • @jshier 感谢您的评论。我们会试一试,看看它的表现如何:)
    【解决方案2】:

    确保您还为kSecAttrAccessible 指定了值。也可以指定kSecAttrAccessControl 的值,即added in iOS8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多