शुरू करने के लिए, कुछ विवरण: हम वर्तमान में स्विफ्ट/एक्सकोड 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
}
}
- कुछ ऐसा है जिसे हम याद किया हो सकता है है:
मैं कीचेन आवरण है कि हम का उपयोग के लिए कोड अलग है?
- इस समस्या का निवारण करने का सबसे अच्छा तरीका क्या है? हमें लॉग/आईफोन कॉन्फ़िगरेशन उपयोगिता में कीचेन से कोई त्रुटि नहीं मिल रही है। फिलहाल मैंने ऑपरेशन की स्थिति क्या है, यह जानने के लिए कोड में कुछ सरल अलर्ट लगाए हैं।
को देखते हुए कैसे धीमी गति से स्विफ्ट अनुकूलन के बिना है हल करने के लिए लगता है , यह एक भयानक समाधान है। शायद एक फ़ाइल के लिए ऑप्टिमाइज़ेशन बंद करना बेहतर होगा। –
@jshier क्या आप समझा सकते हैं कि इसे एक फ़ाइल के लिए कैसे किया जाए? – Turowicz
अपने लक्ष्यों में "बिल्ड चरण" -> "संकलन स्रोत", "कंपाइलर ध्वज" कॉलम पर डबल क्लिक करें और -ऑनोन सेटिंग जोड़ें। आपकी टिप्पणी के लिए –