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