Swift-Schlüsselbund und Bereitstellungsprofile

Wir haben in Swift eine App erstellt, die den Schlüsselbund verwendet. Die App funktioniert einwandfrei, wenn sie auf einem Gerät oder im Simulator ausgeführt wird, kann jedoch nicht auf den Schlüsselbund zugreifen, wenn sie über Testflight bereitgestellt wird, es sei denn, sie wird auf einem neuen Gerät bereitgestellt, auf dem die App zuvor noch nie über Xcode 6.1 installiert wurde.

Folgender Code ist ein Auszug aus dem Schlüsselbund:

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

Nachdem die App bereits über Xcode 6.1 auf dem Gerät installiert wurde, ist mir aufgefallen, dass das " serviceIdentifier "-" com.ourdomain "war falsch und stimmte nicht mit der Bundle-ID der App überein, die für die Bereitstellung erforderlich war.

Ich habe dann das " serviceIdentifier "Wert, der mit der Bundle-ID übereinstimmt -" com.ourdomain.appname "Allerdings funktioniert die App bei der Bereitstellung über Testflight nicht auf dem Gerät. Ich bin sicher, dass auf dem Gerät bereits der Schlüsselbund für die Bundle-ID mit der falschen Kennung installiert ist, aber ich kann nicht ergründen, wie ich mich fortbewegen soll Dies, um entweder den Schlüsselbund zu entfernen, wenn die App entfernt wird, oder um das Bereitstellungsprofil zu veranlassen, den vorhandenen Schlüsselbund (mit der falschen Kennung) zu verwenden.

Jede Hilfe wäre sehr dankbar. Danke im Vorau

Antworten auf die Frage(3)

Ihre Antwort auf die Frage