दिलचस्प पोस्ट
WPF MVVM ट्रीदृश्य चयनित आईटम क्या मैं सीएसएस में एक छवि की ऊंचाई को बदल सकता हूँ: पहले /: छद्म तत्वों के बाद? किस परिदृश्य में मैं एक विशेष एसटीएल कंटेनर का उपयोग करता हूं? PHP प्रकार हिंटिंग पर मैं एक "पकड़ने वाला गंभीर त्रुटि" कैसे पकड़ सकता हूं? उद्देश्य सी में एक स्ट्रिंग खाली है, तो मैं कैसे परीक्षण कर सकता हूं? लिनक्स में स्थानीय फ़ंक्शन कॉल्स का पता लगाने के लिए उपकरण अद्वितीय समाधान के साथ सुडोकू बोर्ड कैसे उत्पन्न करें जावा में कई मापदंडों के साथ कन्स्ट्रस्ट्रक्टरों को प्रबंधित करना मैं कैसे Excel VBA में एक स्ट्रिंग को यूआरएल सांकेतिक शब्दों में बदल सकता हूँ? एक निश्चित स्थिति में एक स्ट्रिंग में एक वर्ण डालें पंक्तियों को जोड़ने का प्रयास करते समय यह पंक्ति पहले से दूसरी टेबल त्रुटि से संबंधित है? ऑब्जेक्ट के तरीकों और विशेषताओं की पूरी सूची कैसे प्राप्त करें? क्या जावास्क्रिप्ट में स्थिरता है? वेबसाइट परिनियोजन: 500 – आंतरिक सर्वर त्रुटि Ffmpeg के साथ वीडियो के केंद्र में पारदर्शी वॉटरमार्क कैसे जोड़ें?

आईओएस अद्वितीय उपयोगकर्ता पहचानकर्ता

मैं आईफ़ोन के लिए एक आवेदन को रुक रहा हूँ, जो मेरे सर्वर के साथ REST का उपयोग करता है। मुख्य समस्या यह है, मुझे किसी भी तरह से उपयोगकर्ता की पहचान करने की आवश्यकता है बहुत समय पहले, हमें यूडीआईडी ​​का उपयोग करने की अनुमति नहीं थी, लेकिन अब इसकी अनुमति नहीं है। तो मुझे इसके बजाय क्या प्रयोग करना चाहिए? मुझे आईफोन पर किसी तरह की पहचानकर्ता चाहिए, इसलिए उपयोगकर्ता एप्लिकेशन को हटा देगा, इसे फिर से स्थापित करेगा, और उसे एक ही आईडी मिलेगी।

वेब के समाधान से एकत्रित समाधान "आईओएस अद्वितीय उपयोगकर्ता पहचानकर्ता"

सबसे पहले, यूडीआईडी ​​को केवल आईओएस 5 में पदावनत किया जाता है। इसका यह अर्थ नहीं है कि यह अभी तक चला गया है (फिर भी)।

दूसरे, आपको खुद से पूछना चाहिए कि आपको वास्तव में ऐसी चीज़ की ज़रूरत है क्या होगा अगर उपयोगकर्ता को एक नया डिवाइस मिल जाता है और उस पर आपका ऐप इंस्टॉल हो जाता है? समान उपयोगकर्ता, लेकिन यूडीआईडी ​​बदल गया है। इस बीच, मूल उपयोगकर्ता ने अपना पुराना डिवाइस बेची हो सकता है, इसलिए अब पूरी तरह से नया उपयोगकर्ता आपके ऐप को स्थापित करता है और आपको लगता है कि यह यूडीआईडी ​​पर आधारित एक अलग व्यक्ति है।

यदि आपको CFUUIDCreate() आवश्यकता नहीं है, तो CFUUIDCreate() को एक स्ट्रिंग में कनवर्ट करने के लिए एक CFUUIDCreate() आईडी बनाने और यूज़र डिफॉल्ट पर लॉन्च करने के लिए CFUUIDCreateString() का उपयोग करें)। यह बैकअप और पुनर्स्थापित होगा और मूल उपयोगकर्ता के साथ आएगा जब वे एक नए डिवाइस पर स्विच करेंगे। यह कई मायनों में एक बेहतर विकल्प है जो कि यूडीआईडी

यदि आपको वास्तव में एक अद्वितीय डिवाइस पहचानकर्ता की आवश्यकता है (यह आपके जैसा नहीं लगता है), सुहाईल के जवाब में बताए गए मैक पते के लिए जाएं।

मैंने UUID बनाने के लिए CFUUIDCreate() का उपयोग किया है:

 + (NSString *)GetUUID { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef string = CFUUIDCreateString(NULL, theUUID); CFRelease(theUUID); return [(NSString *)string autorelease]; } 

इसके बाद उपरोक्त UUID को मेरे NSString पर सेट करें:

 NSString *UUID = [nameofclasswhereGetUUIDclassmethodresides UUID]; 

मैंने तब उस यूकेआईआईडी को एसकेकेई चाइन का उपयोग करते हुए संग्रहीत किया

SSKeyChain के साथ यूयूआईडी सेट करने के लिए:

 [SSKeychain setPassword:UUID forService:@"com.yourapp.yourcompany" account:@"user"]; 

इसे पुनर्प्राप्त करने के लिए:

 NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"]; 

जब आप चाबी काँच में यूयूआईडी सेट करते हैं, तो यह तब भी जारी रहेगा जब उपयोगकर्ता पूरी तरह ऐप को अनइंस्टॉल करेगा और फिर इसे फिर से इंस्टॉल करेगा।

यह सुनिश्चित करने के लिए कि सभी उपकरणों की चाबी का शीआन में समान यूयूआईडी है

  1. ICloud का उपयोग करने के लिए अपना ऐप सेटअप करें
  2. UUID को सहेजें जो कुंजीयन में NSUserDefaults के रूप में भी है।
  3. कुंजी-मान डेटा स्टोर के साथ क्लाउड में यूयूआईडी NSUserDefaults में पास करें।
  4. पहली बार ऐप पर, जांचें कि क्या क्लाउड डेटा उपलब्ध है और नया डिवाइस पर चाबी का टुकड़ा में यूयूआईडी सेट करें।

आपके पास अब एक अनन्य पहचानकर्ता है जो सभी उपकरणों के साथ लगातार और साझा / समन्वयित है।

मैं अपने आवेदन को अद्यतन कर रहा था जो केवल अद्वितीय अभिज्ञापक पर आधारित था जो iOS 4.3 और बाद के संस्करणों का समर्थन करता था इसलिए,

1) मैं [UIDevice currentDevice].uniqueIdentifier; का उपयोग करने में असमर्थ था [UIDevice currentDevice].uniqueIdentifier; क्योंकि यह अब उपलब्ध नहीं था

2) मैं [UIDevice currentDevice].identifierForVendor.UUIDString उपयोग नहीं कर सकता। [UIDevice currentDevice].identifierForVendor.UUIDString क्योंकि यह आईओएस 6.0 और बाद में केवल उपलब्ध था और कम आईओएस संस्करणों के लिए उपयोग करने में असमर्थ था।

3) मैक एड्रेस एक विकल्प नहीं था क्योंकि इसे आईओएस -7 में अनुमति नहीं थी

4) ओपनडाइड को कुछ समय पहले पदावनत किया गया था और आईओएस -6 के साथ भी समस्याएं थीं।

5) विज्ञापन पहचानकर्ता IOS-5 और नीचे के लिए भी उपलब्ध नहीं थे

अंत में यह वही था जो मैंने किया था

क) परियोजना के लिए एसएफएचएफकेईचयन जोड़ा गया

बी) उत्पन्न CFUUID कुंजी स्ट्रिंग

  CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 

ग) इसे मुख्य चेन उपयोग में सहेज लिया गया है या नहीं, यह एक नया अद्वितीय प्रत्येक समय उत्पन्न करेगा

अंतिम कोड

 + (NSString *)GetDeviceID { NSString *udidString; udidString = [self objectForKey:@"deviceID"]; if(!udidString) { CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); CFRelease(cfuuid); [self setObject:udidString forKey:@"deviceID"]; } return udidString; } +(void) setObject:(NSString*) object forKey:(NSString*) key { NSString *objectString = object; NSError *error = nil; [SFHFKeychainUtils storeUsername:key andPassword:objectString forServiceName:@"LIB" updateExisting:YES error:&error]; if(error) NSLog(@"%@", [error localizedDescription]); } +(NSString*) objectForKey:(NSString*) key { NSError *error = nil; NSString *object = [SFHFKeychainUtils getPasswordForUsername:key andServiceName:@"LIB" error:&error]; if(error) NSLog(@"%@", [error localizedDescription]); return object; } 

यहां छवि विवरण दर्ज करें

अधिक जानकारी के लिए

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

NSUUID का उपयोग करना

मैं यूयूआईडी बनाने के लिए एनएसयूयूआईआईडी वर्ग का उपयोग करता हूं:

 NSUUID *uuid = [NSUUID UUID]; 

फिर स्ट्रिंग बनाने के लिए, आपको केवल UUIDString विधि कॉल करने की आवश्यकता है:

 NSString *uuidString = [uuid UUIDString]; 

या इसे एक पंक्ति में करें:

 NSString *uuidString = [[NSUUID UUID] UUIDString]; 

आईएमएचओ, यह CFUUIDCreate का प्रयोग करने की कोशिश करने से बहुत आसान है और आपके पास एक तरीका है जिसे आपको बनाए रखना होगा


संपादित करें: अब मैं यूइकई चेनस्टोर का उपयोग कर रहा हूं

UikeeyChainStore के साथ यूयूआईडी सेट करने के लिए:

 UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.sample.MyApp"]; keychain[@"com.sample.MyApp.user"] = userID; 

इसे पुनः प्राप्त करने के लिए:

 UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.sample.MyApp"]; NSString *userID = keychain[@"com.sample.MyApp.user"]; 

मैंने तब उस यूकेआईआईडी को एसकेकेई चाइन का उपयोग करते हुए संग्रहीत किया

SSKeyChain के साथ यूयूआईडी सेट करने के लिए:

 [SSKeychain setPassword:userID forService:@"com.sample.MyApp.user" account:@"com.sample.MyApp"]; 

इसे पुनः प्राप्त करने के लिए:

 NSString *userID = [SSKeychain passwordForService:@"com.sample.MyApp.user" account:@"com.sample.MyApp"]; 

जब आप चाबी काँच में यूयूआईडी सेट करते हैं, तो यह तब भी जारी रहेगा जब उपयोगकर्ता पूरी तरह ऐप को अनइंस्टॉल करेगा और फिर इसे फिर से इंस्टॉल करेगा।

ICloud के साथ समन्वयित करना

इसलिए यह सुनिश्चित करने के लिए उपयोगी है कि सभी उपयोगकर्ता के उपकरण समान UUID का उपयोग करते हैं। यह सुनिश्चित करने के लिए है कि डेटा सभी डिवाइसों में सिंक्रनाइज़ किया जाता है, बजाय प्रत्येक डिवाइस को यह एक अद्वितीय उपयोगकर्ता है।

सिंक्रनाइज़ेशन कैसे काम करेगा, इस पर मेरे जवाब के लिए टिप्पणियों में कई सवाल थे, इसलिए अब मुझे यह सब काम मिल गया है, मैं और अधिक विवरण प्रदान करूंगा।

ICloud / NSUbiquitousKeyValueStore का उपयोग करना कॉन्फ़िगर करना

  1. Xcode में प्रोजेक्ट नेविगेटर के शीर्ष पर अपनी प्रोजेक्ट पर क्लिक करें
  2. क्षमताओं का चयन करें
  3. ICloud चालू करें

इसे अब ऐसा कुछ दिखना चाहिए: ICloud का स्क्रीनशॉट सक्षम किया गया

NSUbiquitousKeyValueStore का उपयोग करना

ICloud का उपयोग करना काफी आसान है। लिखना:

 // create the UUID NSUUID *userUUID = [[NSUUID UUID]; // convert to string NSString *userID = [userUUID UUIDString]; // create the key to store the ID NSString *userKey = @"com.sample.MyApp.user"; // Save to iCloud [[NSUbiquitousKeyValueStore defaultStore] setString:userID forKey:userKey]; 

पढ़ने के लिए:

 // create the key to store the ID NSString *userKey = @"com.sample.MyApp.user"; // read from iCloud NSString *userID = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:userKey]; 

इससे पहले कि आप NSUbiquitousKeyValueStore प्रलेख लिख सकते हैं कि आपको पहले iCloud से पढ़ने की आवश्यकता है पढ़ने के लिए मजबूर करने के लिए, निम्नलिखित विधि को कॉल करें:

 [[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

अपने ऐप को iCloud में परिवर्तनों की सूचना प्राप्त करने के लिए, निम्न अधिसूचना जोड़ें:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(iCloudStoreDidChange:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:[NSUbiquitousKeyValueStore defaultStore]]; 

ICloud के साथ यूयूआईडी बनाना

NSUUID, SSKeychain और NSUbiquityKeyValueStore का संयोजन, यहां एक उपयोगकर्ता आईडी बनाने के लिए मेरी विधि है:

 - (NSUUID *)createUserID { NSString *userKey = @"com.sample.MyApp.user"; NSString *KEYCHAIN_ACCOUNT_IDENTIFIER = @"com.sample.MyApp"; NSString *userID = [SSKeychain passwordForService:userKey account:KEYCHAIN_ACCOUNT_IDENTIFIER]; if (userID) { return [[NSUUID UUID] initWithUUIDString:userID]; } // check iCloud userID = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:userKey]; if (!userID) { // none in iCloud, create one NSUUID *newUUID = [NSUUID UUID]; userID = [newUUID UUIDString]; // save to iCloud [[NSUbiquitousKeyValueStore defaultStore] setString:userID forKey:userKey]; } // store the user ID locally [SSKeychain setPassword:userID forService:userKey account:KEYCHAIN_ACCOUNT_IDENTIFIER]; return [[NSUUID UUID] initWithUUIDString:userID]; } 

यह सुनिश्चित करने के लिए कि आपका यूजर आईडी सिंक में है

क्योंकि iCloud को लिखने के लिए पहले iCloud में कोई डेटा डाउनलोड करने की आवश्यकता है, मैं (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions के शीर्ष पर कॉल को सिंक्रनाइज़ कर देता हूं (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions विधि मैंने इसके साथ ही अधिसूचना पंजीकरण भी जोड़ा। यह मुझे iCloud से किसी भी परिवर्तन का पता लगाने और उन्हें उचित रूप से प्रबंधित करने की अनुमति देता है।

यहाँ एक नमूना है:

 NSString *const USER_KEY = @"com.sample.MyApp.user"; NSString *const KEYCHAIN_ACCOUNT_IDENTIFIER = @"com.sample.MyApp"; - (void)iCloudStoreDidChange:(NSNotification *)notification { NSDictionary *userInfo = notification.userInfo; NSNumber *changeReason = userInfo[NSUbiquitousKeyValueStoreChangeReasonKey]; NSArray *keysChanged = userInfo[NSUbiquitousKeyValueStoreChangedKeysKey]; if (changeReason) { switch ([changeReason intValue]) { default: case NSUbiquitousKeyValueStoreServerChange: case NSUbiquitousKeyValueStoreInitialSyncChange: // check changed keys for (NSString *keyChanged in keysChanged) { NSString *iCloudID = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:keyChanged]; if (![keyChanged isEqualToString:USER_KEY]) { NSLog(@"Unknown key changed [%@:%@]", keyChanged, iCloudID); continue; } // get the local key NSString *localID = [SSKeychain passwordForService:keyChanged account:KEYCHAIN_ACCOUNT_IDENTIFIER]; if (!iCloudID) { // no value from iCloud continue; } // local ID not created yet if (!localID) { // save the iCloud value locally [SSKeychain setPassword:iCloudID forService:keyChanged account:KEYCHAIN_ACCOUNT_IDENTIFIER]; continue; // continue because there is no user information on the server, so no migration } if ([iCloudID isEqualToString:localID]) { // IDs match, so continue continue; } [self handleMigration:keyChanged from:localID to:iCloudID]; } break; case NSUbiquitousKeyValueStoreAccountChange: // need to delete all data and download new data from server break; } } } 

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

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self configureSecKeyWrapper]; // synchronize data from iCloud first. If the User ID already exists, then we can initialize with it [[NSUbiquitousKeyValueStore defaultStore] synchronize]; [self checkUseriCloudSync]; } - (void)applicationWillEnterForeground:(UIApplication *)application { // synchronize changes from iCloud [[NSUbiquitousKeyValueStore defaultStore] synchronize]; [self checkUseriCloudSync]; } - (BOOL)checkUseriCloudSync { NSString *userKey = @"com.sample.MyApp.user"; NSString *KEYCHAIN_ACCOUNT_IDENTIFIER = @"com.sample.MyApp"; NSString *localID = [SSKeychain passwordForService:userKey account:KEYCHAIN_ACCOUNT_IDENTIFIER]; NSString *iCloudID = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:userKey]; if (!iCloudID) { // iCloud does not have the key saved, so we write the key to iCloud [[NSUbiquitousKeyValueStore defaultStore] setString:localID forKey:userKey]; return YES; } if (!localID || [iCloudID isEqualToString:localID]) { return YES; } // both IDs exist, so we keep the one from iCloud since the functionality requires synchronization // before setting, so that means that it was the earliest one [self handleMigration:userKey from:localID to:iCloudID]; return NO; } 

यदि कौन से यूयूआईडी पहले मामलों में आया था

मेरे यूजरआईड के उपयोग के मामले में, मैंने मान लिया है कि iCloud में मान रखने वाला है, क्योंकि पहले यूयूआईडी को iCloud पर धकेल दिया जाएगा, भले ही किस उपकरण ने पहले यूयूआईडी उत्पन्न किया हो। आप में से अधिकांश शायद एक ही रास्ता ले लेंगे, क्योंकि आप वास्तव में परवाह नहीं करेंगे कि कौन सा UUID इसका समाधान करता है, जब तक यह किसी एकल को हल करता है आप में से उन लोगों के लिए जो वास्तव में पहले से आए थे, मैं आपको यूयूआईडी और टाइमस्टैम्प पीढ़ी ( [[NSDate date] timeIntervalSince1970] 9 [[NSDate date] timeIntervalSince1970] दोनों को स्टोर करने का सुझाव देता हूं ताकि आप यह देख सकें कि कौन सा पुराना है:

 // using dates NSDate *uuid1Timestamp = [NSDate dateWithTimeIntervalSince1970:timestamp1]; NSDate *uuid2Timestamp = [NSDate dateWithTimeIntervalSince1970:timestamp2]; NSTimeInterval timeDifference = [uuid1 timeIntervalSinceDate:uuid2Timestamp]; // or just subtract double timeDifference = timestamp1 - timestamp2; 

Github पर एक अच्छा विकल्प है जो मैक एड्रेस और बंडल आइडेंटिफ़ायर के संयोजन के आधार पर एक अनन्य पहचानकर्ता बनाता है जो बहुत अच्छी तरह से काम करता है: यूआईडीवाइस के साथ- अनूठी पहचानकर्ता- IOS-5 के लिए

आईओएस 7 में एपल ने यूआईडीवाइस क्लास में "पहचानकर्ताफ़ोअरवेन्डर" नामक एक पठन केवल प्रॉपर्टी पेश की है। यदि आप इसका उपयोग करने का निर्णय लेते हैं, तो आपको निम्नलिखित के नोट बनाना चाहिए,

  • यदि उपयोगकर्ता डिवाइस को अनलॉक करने से पहले यह एक्सेस किया जाता है तो यह मान शून्य हो सकता है
  • यह मान तब बदलता है जब उपयोगकर्ता डिवाइस से सभी विक्रेता के ऐप्स को हटा देता है और बाद में इनमें से एक या अधिक को पुनः स्थापित करता है
  • Xcode का उपयोग करते हुए या टेड-हॉक डिस्ट्रीब्यूशन का उपयोग करते हुए डिवाइस पर ऐप इंस्टॉल करते समय परीक्षण को बदलते समय मूल्य भी बदल सकता है।

यदि आपको विज्ञापन उद्देश्यों के लिए एक पहचानकर्ता की आवश्यकता है, तो विज्ञापन पहचानकर्ता संपत्ति ASIdentifierManager का उपयोग करें। हालांकि ध्यान दें कि ऊपर चर्चा की गई बात अभी भी इसके लिए भी सही है।

स्रोत: https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/occ/instp/UIDevice/identifierForVendor

यह वास्तव में एक गर्म विषय है मेरे पास एक ऐसा एप होता है जिसे मुझे माइग्रेट करना पड़ता है क्योंकि उसने यूडीआईडी ​​को किसी एक्सएमएल फाइल के नाम पर सर्वर पर संग्रहीत करने के लिए इस्तेमाल किया था। फिर ऐप वाला उपकरण सर्वर से कनेक्ट होगा और इसके विशिष्ट udid.xml को डाउनलोड करेगा और इसे काम करने के लिए पार्स करेगा।

Ive सोच रहा था कि वास्तव में अगर उपयोगकर्ता एक नए डिवाइस पर ले जाता है, तो ऐप टूट जाएगा। इसलिए मुझे वाकई कुछ और का उपयोग करना चाहिए। बात यह है, मैं डेटा के लिए डेटाबेस का उपयोग नहीं करता हूं डेटा को बस एक XML प्रारूप में संग्रहीत किया जाता है, बादल पर संग्रहीत प्रत्येक डिवाइस प्रति एक XML फ़ाइल।

मैं सोच रहा हूं कि उपयोगकर्ता को वेब पर डेटा भरने के लिए सबसे अच्छी चीज होगी, फ़्लाइट पर एक टोकन बनाएं, जो डेटाबेस में संग्रहीत नहीं किया जाएगा बल्कि उपयोगकर्ता को भेजा जाएगा। उपयोगकर्ता तब लक्ष्य डिवाइस पर टोकन को इनपुट कर सकता है और सवाल में एक्सएमएल पुनः प्राप्त कर सकता है।

यही समस्या का मेरा समाधान होगा सुनिश्चित नहीं है कि संपूर्ण 'अद्वितीय टोकन बनाने' को कैसे लागू किया जाए, हालांकि