2014-10-16 7 views
5

शुरू करने के लिए, कुछ विवरण: हम वर्तमान में स्विफ्ट/एक्सकोड 6.1 जीएम 2 का उपयोग विकास के लिए आईओएस एप्लीकेशन विकसित कर रहे हैं।कीचेन + एडहोक वितरण

हमें एप्लिकेशन विज्ञापन वितरित करते समय कीचैन पहुंच के साथ कुछ भ्रमित समस्याएं आ रही हैं और कारणों को ट्रैक करने के साथ समस्याएं हैं। सभी प्रावधान प्रोफाइल हमारे ऐप के बंडल नाम से मेल खाते हैं। हम वितरण के लिए टेस्टफलाइट का उपयोग करते हैं हालांकि मुझे नहीं लगता कि यह समस्या है।

हमने केवल आईओएस 7 उपकरणों पर काम करने में कामयाब रहे हैं जिनके पास ऐप इंस्टॉल नहीं हुआ था। एक आईओएस 8 डिवाइस ने विज्ञापन नहीं किया। शुरुआत में हमें जो त्रुटियां मिल रही थीं वे 25300 (errSecItemNotFound) थीं और अब प्रोविजनिंग प्रोफाइल रीसेट करने के बाद हमें एक सादा 0 मिल रहा है (दोनों लोडिंग पर बचत पर और अभी भी कोई डेटा पुनर्प्राप्त नहीं किया जा सकता है)। एक्सकोड से देव बनाता है जब सब कुछ पूरी तरह से काम करता है।

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. इस समस्या का निवारण करने का सबसे अच्छा तरीका क्या है? हमें लॉग/आईफोन कॉन्फ़िगरेशन उपयोगिता में कीचेन से कोई त्रुटि नहीं मिल रही है। फिलहाल मैंने ऑपरेशन की स्थिति क्या है, यह जानने के लिए कोड में कुछ सरल अलर्ट लगाए हैं।

उत्तर

3

प्रावधान प्रोफ़ाइल और कीचेन कोड में सब कुछ ठीक प्रतीत होता है। समस्या स्विफ्ट संकलक में एक सेटिंग है ... "सबसे तेज" "कोई नहीं" के लिए से के लिए "रिलीज़" अनुकूलन स्तर बदलें और इस समस्या

enter image description here

+0

को देखते हुए कैसे धीमी गति से स्विफ्ट अनुकूलन के बिना है हल करने के लिए लगता है , यह एक भयानक समाधान है। शायद एक फ़ाइल के लिए ऑप्टिमाइज़ेशन बंद करना बेहतर होगा। –

+0

@jshier क्या आप समझा सकते हैं कि इसे एक फ़ाइल के लिए कैसे किया जाए? – Turowicz

+0

अपने लक्ष्यों में "बिल्ड चरण" -> "संकलन स्रोत", "कंपाइलर ध्वज" कॉलम पर डबल क्लिक करें और -ऑनोन सेटिंग जोड़ें। आपकी टिप्पणी के लिए –

1

सुनिश्चित करें कि आप kSecAttrAccessible के लिए भी मान निर्दिष्ट करते हैं। शायद kSecAttrAccessControl के लिए मान भी निर्दिष्ट करें, जो added in iOS8 था।

संबंधित मुद्दे