Llavero rápido y perfiles de aprovisionamiento

Hemos creado una aplicación en Swift que usa llavero. La aplicación funciona bien cuando se ejecuta en un dispositivo o en el simulador, pero no puede acceder al llavero cuando se aprovisiona a través de Testflight a menos que se aprovisione en un nuevo dispositivo que nunca haya instalado previamente la aplicación a través de Xcode 6.1.

Lo siguiente es un extracto del código del llavero:

    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 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)
    }

    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)

        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
    }  
  }

Después de que la aplicación ya estaba instalada en el dispositivo a través de Xcode 6.1, noté que el "serviceIdentifier"-"com.ourdomain"era incorrecto y no coincidía con el identificador de paquete de la aplicación como se requiere con el aprovisionamiento.

Luego cambié el "serviceIdentifier"valor para que coincida con el identificador del paquete -"com.ourdomain.appname"Sin embargo, la aplicación simplemente no funcionará en el dispositivo cuando se aprovisione a través de Testflight. Estoy seguro de que esto se debe a que el dispositivo ya tiene el llavero para la identificación del paquete instalado con el identificador incorrecto, pero no puedo entender cómo solucionar esto para eliminar el llavero cuando se elimina la aplicación u obtener el perfil de aprovisionamiento para usar el llavero existente (con el identificador incorrecto)

Cualquier ayuda sería muy apreciada. Gracias por adelantado

Respuestas a la pregunta(3)

Su respuesta a la pregunta