ichoud

2014-06-18 8 views
9

में कीचेन डेटा स्टोर नहीं कर रहा है मैं स्थानीय डिवाइस पर डेटा स्टोर करने के लिए कीचेन का उपयोग कर रहा हूं लेकिन iCloud के माध्यम से एकाधिक उपकरणों पर उपयोग के लिए इसे अनुकूलित करने का निर्णय लिया है। मैंने iCloud एंटाइटेलमेंट सक्षम किया है और सदस्य केंद्र के भीतर आवश्यक कॉन्फ़िगरेशन बनाया है। हालांकि, डेटा संग्रहित होने पर यह प्रकट नहीं होता है कि यह क्लाउड में संग्रहीत किया जा रहा है। मैं सिम्युलेटर और मेरे आईफोन डिवाइस के बीच परीक्षण कर रहा हूं। सिम्युलेटर मेरे खाते का उपयोग कर लॉग इन है। प्रत्येक डिवाइस डेटा को सहेजना जारी रखता है लेकिन अन्य डिवाइस परिणाम नहीं देखता है।ichoud

मैंने केवल बाहरी सेटअप के लिए केएसईएएटीएआरआर सिंक्रनाइज़ेबल और केसीएफबोलियन ट्राउ को जोड़ा जो मुझे समझ में आया कि कुंजीचैन क्लाउड का उपयोग करने के लिए आवश्यक था।

यहां कोड कुंजीचेन डेटा को संग्रहीत करने और याद करने के लिए उपयोग किया जाता है।

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service 
{ 
    return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
      (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass, 
      service, (__bridge id)kSecAttrService, 
      service, (__bridge id)kSecAttrAccount, 
      (__bridge id)kCFBooleanTrue, (__bridge id)kSecAttrSynchronizable, 
      (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible, 
      nil]; 
} 

+ (void)save:(NSString *)service data:(id)data 
{ 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    CFTypeRef result = NULL; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keychainQuery, &result); 

    if (status == errSecSuccess) NSLog(@"Succcessfully Stored Value"); 
    else NSLog(@"Failed to store value with code: %ld",(long)status); 
} 

+ (id)load:(NSString *)service { 
    id ret = nil; 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
    CFDataRef keyData = NULL; 
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
     @try { 
      ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
     } 
     @catch (NSException *e) { 
      NSLog(@"Unarchive of %@ failed: %@", service, e); 
     } 
     @finally {} 
    } 
    if (keyData) CFRelease(keyData); 
    return ret; 
} 

+ (void)delete:(NSString *)service { 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
} 
+0

एक फॉलो-अप का थोड़ा सा। मैं फोन पर ऐप का उपयोग करते समय अपने मैक पर कीचेन देख रहा था। मैं keychain डेटा लिखा जा रहा था इसलिए यह काम करता प्रतीत होता है। हालांकि, मैं इस धारणा के तहत था कि सिम्युलेटर को भी काम करना चाहिए और सिम में डीबग के तहत "ट्रिगर आईक्लाउड सिंक" विकल्प है। ऐप्पल का दस्तावेज यह भी इंगित करता है कि सिम्युलेटर का उपयोग किया जा सकता है। हालांकि, ऐसा लगता है कि यह मुख्य कुंजी श्रृंखला से बातचीत नहीं करता है, भले ही मेरा खाता सिम्युलेटर पर दर्ज किया गया हो। – C6Silver

+0

जब आप कहते हैं कि "iCloud एंटाइटेलमेंट" सक्षम है, तो क्या आपका मतलब है कि आपने सेटिंग ऐप में "iCloud" के अंतर्गत कीचेन कार्यक्षमता चालू कर दी है? या क्या वहां कुछ फ्लिप है जिसे आपको पीएलआईस्ट में चालू करना है? –

+0

लक्ष्य सेटिंग्स में "क्षमताओं" के तहत सक्षम। सदस्य केंद्र में ऐप आईडी में "iCloud" जोड़ा गया (यह वह योग्यता है जिसे वे "क्षमताओं" टैब में संदर्भित करते हैं। – C6Silver

उत्तर

0

सिम्युलेटर - संस्करण 7.1 (463.9.41) - नहीं है कीचेन की सुरक्षित प्रबंधन के लिए आवश्यक हार्डवेयर (मुझे लगता है कि "अनुकरण नहीं है" और अधिक सटीक है)।

आप iCloud के तहत Settngs.app में सिम्युलेटर पर ध्यान देंगे, Keychain के लिए कोई विकल्प नहीं है, जबकि डिवाइस पर यह विकल्प मौजूद है।

यदि आप ~/Library/Application Support/iPhone Simulator/7.1/Library/Keychains में खोदते हैं तो आपको सिम्युलेटर की कीचेन मिल जाएगी। kSecAttrAccessGroup सिम्युलेटर की कीचेन में रखे गए सभी आइटमों के लिए test है। डिवाइस पर चलते समय, मुझे अपेक्षित एक्सेस समूह (मेरा ऐप ऐप आईडी) मिलता है।

यह सब मुझे दिशा में इंगित करता है कि सिम्युलेटर iCloud Keychain सिंक का समर्थन नहीं करता है। 2014 डब्ल्यूडब्ल्यूडीसी सत्र # 711 टच आईडी के साथ कीचेन और प्रमाणीकरण डिवाइस के हार्डवेयर की विशेषताएं कुंजीचेन एन्क्रिप्शन का समर्थन करने के तरीके के बारे में विस्तार से बताता है।

दो आईओएस डिवाइस या आईओएस और ओएस एक्स एकमात्र तरीका है जो मैं विश्वसनीय रूप से विकसित, डीबग और iCloud Keychain सिंक समस्या निवारण करने में सक्षम हूं।