Быстрые брелки и профили обеспечения

Мы создали приложение в Swift, которое использует связку ключей. Приложение отлично работает при запуске на устройстве или в симуляторе, но не может получить доступ к цепочке для ключей при инициализации через Testflight, если только оно не настроено для нового устройства, на котором никогда ранее не устанавливалось приложение через Xcode 6.1.

Ниже приводится выдержка из кода цепочки для ключей:

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

После того, как приложение было уже установлено на устройстве через Xcode 6.1, я заметил, чтоserviceIdentifier"-"com.ourdomain"было неверно и не соответствовало идентификатору пакета приложения, как требуется при инициализации.

Я тогда поменялserviceIdentifier"значение, соответствующее идентификатору пакета -"com.ourdomain.appname«Однако приложение не будет работать на устройстве при инициализации через Testflight. Я уверен, что это потому, что на устройстве уже установлена ​​цепочка для ключей для идентификатора пакета с неверным идентификатором, но я не могу понять, как обойти это» либо удалить цепочку для ключей при удалении приложения, либо получить профиль обеспечения для использования существующей цепочки для ключей (с неверным идентификатором)

Любая помощь будет принята с благодарностью. заранее спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос