2014-10-16 27 views
5

Başlamak için, bazı ayrıntılar: geliştirme için şu anda Swift/Xcode 6.1 GM 2'yi kullanan bir iOS uygulaması geliştiriyoruz.Anahtarlık + adhoc dağıtımı

Ad hoc uygulamalarını dağıtırken anahtarlık erişimi ile ilgili bazı kafa karıştırıcı sorunlar yaşıyoruz ve nedenini takip etme ile ilgili sorunlarımız var. Tüm temel hazırlık profilleri, uygulamanızın paket adını eşleştiriyor. Problemi düşünmese de, TestFlight'ı dağıtım için kullanıyoruz.

Yalnızca uygulamayı daha önce yüklememiş olan iOS 7 cihazlarda çalışmaya başlamayı başardık. Tek bir iOS 8 cihazı ad hoc değildi. Başlangıçta aldığımız hatalar 25300 (errSecItemNotFound) idi ve şimdi provizyon profillerini sıfırladıktan sonra düz 0 alıyoruz (hem yükleme sırasında hem de hala hiçbir veri alınamıyor). Xcode'dan dev dosyaları oluştururken her şey mükemmel çalışır. biz kaçırmış olabilir şey

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. var mı:

    Ben Kullandığımız anahtarlık sarmalayıcı için kod ayırdı?

  2. Bu sorunu gidermenin en iyi yolu nedir? Günlükler/iPhone yapılandırma yardımcı programında anahtar zincirden herhangi bir hata almıyoruz. Şu anda operasyonun durumunun ne olduğunu bulmak için sadece bazı basit uyarılar koydum.

cevap

3

Temel hazırlık profilindeki ve anahtarlık kodundaki her şey iyi görünüyor. Sorun "Yok" ile "En hızlı" dan "Release" için optimizasyon düzeyini değiştirme ... Swift derleyicisi ayardır ve bu

enter image description here

+0

Swift optimizasyonu olmadan ne kadar yavaş Verilen sorunu çözmek gibi görünüyor Bu korkunç bir çözümdür. Belki de tek bir dosya için optimizasyonu kapatmak daha iyi olurdu. –

+0

@jshier Tek bir dosya için nasıl yapılacağını açıklayabilir misiniz? – Turowicz

+0

Hedefleriniz "Yapı Aşamaları" -> "Kaynak Derleme" kısmında, "Derleyici Bayrakları" sütununa çift tıklayın ve -Onone ayarını ekleyin. –

1

kSecAttrAccessible için de değer belirttiğinizden emin olun. Belki de added in iOS8 olan kSecAttrAccessControl için değer belirtin.

İlgili konular