दिलचस्प पोस्ट
क्रोम के साथ जावास्क्रिप्ट स्मृति लीक ढूँढना आईओएस 8 के तहत स्थानीय फाइलों को लोड नहीं कर रहा है jQuery के JSON प्रतिक्रिया हमेशा एक ParseError को चालू करती है Data.frames की एक सूची को एक एकल डेटा फ्रेम में दोबारा जोड़ने बाइनरी में दशमलव संख्या का प्रतिनिधित्व क्यों नहीं किया जा सकता है? IE8 पॉपअप विंडो में सत्र कुकीज़ खोना क्रोम एक्सटेंशन में jQuery को लोड करना एक HTML लिंक बनाने के लिए एक फ़ोल्डर खोलने के तरीके क्या हैं डब्ल्यूसीएफ, इंटरफ़ेस रिटर्न टाइप और ज्ञात टाइप्स क्या फ्लक्स स्टोर, या क्रिया (या दोनों) बाहरी सेवाओं को स्पर्श करना चाहिए? HEROKU – गिट को धक्का नहीं ले पा रहे हैंओकू मास्टर मोगोडीबी के साथ उप-दस्तावेज में सरणी कैसे फ़िल्टर करें मैं कमांड के लिए चयनित पंक्ति कैसे पार करूं? डेटा के अंदर लिंक या यूआई: दोहराएँ? CreateProcess त्रुटि क्यों देता है 1 9 3 (% 1 वैध Win32 ऐप नहीं है) एक ऐसा गुण क्यों नहीं है जिसे स्पष्ट रूप से लागू किया गया है?

UIDevice अद्वितीय पहचानकर्ता अप्रतिबंधित – अब क्या करना है?

यह सिर्फ प्रकाश में आया है कि यूआईडीवाइस अद्वितीय पहचानकर्ता संपत्ति IOS5 और इसके बाद के संस्करण में पदावनत की गई है। कोई वैकल्पिक विधि या संपत्ति उपलब्ध या आगामी होने प्रतीत होती है

विशेष रूप से किसी विशेष उपकरण की पहचान करने के लिए हमारे मौजूदा ऐप्स बहुत सख्ती से इस प्रॉपर्टी पर निर्भर हैं। क्या कोई सुझाव दे सकता है कि हम इस समस्या को कैसे आगे बढ़ाएंगे?

दस्तावेज़ीकरण का सुझाव है …

विशेष ध्यान

अद्वितीय पहचानकर्ता संपत्ति का उपयोग न करें अपने ऐप के लिए विशिष्ट पहचानकर्ता बनाने के लिए, आप CFUUIDCreate बनाने के लिए CFUUIDCreate फ़ंक्शन को कॉल कर सकते हैं, और इसे NSUserDefaults वर्ग का उपयोग करके डिफ़ॉल्ट डेटाबेस पर लिख सकते हैं।

हालांकि यह मान समान नहीं होगा यदि कोई उपयोगकर्ता ऐप को अनइंस्टॉल और पुन: इंस्टॉल करता है।

Solutions Collecting From Web of "UIDevice अद्वितीय पहचानकर्ता अप्रतिबंधित – अब क्या करना है?"

CFUUIDCreate द्वारा बनाई गई CFUUIDCreate अद्वितीय है यदि कोई उपयोगकर्ता ऐप को अनइंस्टॉल और पुन: इंस्टॉल करता है: आपको हर बार एक नया CFUUIDCreate मिलेगा।

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

संपादित करें: एक को हमेशा एक ही इंटरफ़ेस के मैक को पूछना चाहिए, ज़ाहिर है। मुझे लगता है कि सबसे अच्छा शर्त en0 साथ है। मैक हमेशा मौजूद होता है, भले ही इंटरफ़ेस में कोई आईपी / डाउन नहीं हो।

2 संपादित करें: जैसे कि दूसरों द्वारा बताया गया था, आईओएस 6 के बाद से पसंदीदा समाधान – [यूआईडीइविस पहचानकर्ता फॉरवेन्डर] ज्यादातर मामलों में, आप इसे ड्रॉप-इन को पुरानी -[UIDevice uniqueIdentifier] प्रतिस्थापन के रूप में उपयोग कर सकते हैं (लेकिन एक -[UIDevice uniqueIdentifier] जो पहली बार ऐप शुरू होता है जब ऐप आपको उपयोग करने के लिए लगता है)।

3 संपादित करें: तो इस प्रमुख बिंदु टिप्पणी शोर में खो नहीं है: यूएआईडी के रूप में मैक का उपयोग न करें, मैक का उपयोग कर एक हैश बनाएँ। यह हैश हमेशा हर बार एक ही परिणाम बना देगा, यहां तक ​​कि रिस्टॉल और ऐप्स (यदि हैशिंग उसी तरह से किया जाता है) भर में भी। वैसे भी, आजकल (2013) यदि आपको आईओएस <6.0 पर एक "स्थिर" डिवाइस पहचानकर्ता की आवश्यकता है, तो इसके अलावा कोई और जरूरी नहीं है।

4 संपादित करें: आईओएस 7 में, ऐप्पल अब हमेशा एक निश्चित मूल्य देता है जब एमएसी को विशेष रूप से आईडी योजना के आधार के रूप में मैक को विफल करने के लिए पूछता है। तो अब आपको वास्तव में उपयोग करना चाहिए – [UIDevice identifierForVendor] या एक प्रति-स्थापित UUID बनाएँ

आप पहले से ही Apple UDID लिए अपने विकल्प का उपयोग कर सकते हैं। तरह का आदमी जीकेकिट ने यूआईडीवाइस पर श्रेणी लिखा है जो डिवाइस मैक-एड्रेस और बंडल आइडेंटिफ़ायर पर आधारित कुछ प्रकार की UIDevice उत्पन्न करेगा।

आप github पर कोड पा सकते हैं

@ मूनलाइट द्वारा प्रस्तावित लिंक के आधार पर, मैंने कई परीक्षण किए और यह सबसे अच्छा समाधान लगता है @ डर्कडस्ट के रूप में यह कहते हुए कि विधि हमेशा en0 जांच करने जा en0 जो हमेशा उपलब्ध है।
इसमें 2 विकल्प हैं:
uniqueDeviceIdentifier (मैक + uniqueDeviceIdentifier एमडी 5)
और uniqueGlobalDeviceIdentifier ( uniqueGlobalDeviceIdentifier एमडी 5), ये हमेशा एक ही मान देता है।
मेरे द्वारा किए गए परीक्षण (वास्तविक उपकरण के साथ) के नीचे:

 #import "UIDevice+IdentifierAddition.h" NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]); NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]); 

XXXX21f1f19edff198e2a2356bf4XXXX – (वाईफ़ाई) यूडीआईडी
XXXX7dc3c577446a2bcbd77935bdXXXX – (वाईफ़ाई) ग्लोबल ऐपसड आईडी

XXXX21f1f19edff198e2a2356bf4XXXX – (3 जी) यूडीआईडी
XXXX7dc3c577446a2bcbd77935bdXXXX – (3 जी) ग्लोबल ऐपयूडीडी

XXXX21f1f19edff198e2a2356bf4XXXX – (जीपीआरएस) यूडीआईडी
XXXX7dc3c577446a2bcbd77935bdXXXX – (जीपीआरएस) ग्लोबल ऐप्साइड

XXXX21f1f19edff198e2a2356bf4XXXX – (एयरप्लेन मोड) यूडीआईडी
XXXX7dc3c577446a2bcbd77935bdXXXX – (एयरप्लेन मोड) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX – ऐप निकालने और इंस्टॉल करने के बाद XXXX7dc3c577446a2bcbd77935bdXXXX (वाई-फाई) को हटाने और इंस्टॉल करने के बाद (वाई-फाई)

आशा है कि यह उपयोगी है

संपादित करें:
जैसा कि अन्य लोगों ने बताया है, आईओएस 7 में यह समाधान उपयोगी नहीं है क्योंकि uniqueIdentifier अब उपलब्ध नहीं है और मैक पते के लिए पूछताछ अब हमेशा रिटर्न देता है 02: 00: 00: 00: 00: 00

इसकी जांच करें,

हम CFUUIDCreate द्वारा बनाए गए UUID को स्टोर करने के लिए NSUserDefaults वर्ग के बजाय कीचेन का उपयोग कर सकते हैं

इस तरह से हम पुनर्स्थापितकरण के साथ UUID मनोरंजन से बच सकते हैं, और एक ही आवेदन के लिए हमेशा एक ही UUID प्राप्त कर सकते हैं, यहां तक ​​कि उपयोगकर्ता अनइंस्टॉल और फिर से पुनर्स्थापित कर सकते हैं।

UUID पुन: निर्मित होगा जब उपयोगकर्ता द्वारा रीसेट होगा।

मैंने इस पद्धति की कोशिश की एसएफएचएफकेईचैन यूटल्स के साथ और यह एक जादू की तरह काम करता है

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

प्रभावी रूप से यह एक अद्वितीय उपयोगकर्ता पहचानकर्ता बन जाता है जहां तक ​​आप चिंतित हैं। ( डिवाइस पहचानकर्ता से भी बेहतर)

उदाहरण:

मैं UUID को बनाने के लिए कस्टम विधि को परिभाषित कर रहा हूं:

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

फिर आप अपने ऐप के बहुत पहले लॉन्च पर इसे KEYCHAIN में संग्रहीत कर सकते हैं। ताकि पहले लॉन्च के बाद, हम इसे केवल चाबी का गुच्छा से इस्तेमाल कर सकते हैं, इसे पुनर्जन्म करने की कोई जरूरत नहीं है। कुंजीचेन को स्टोर करने का मुख्य कारण यह है: जब आप चाबी का UUID में UUID सेट करते हैं, तो यह तब भी जारी रहेगा जब उपयोगकर्ता पूरी तरह ऐप को अनइंस्टॉल करेगा और फिर उसे फिर से इंस्टॉल करेगा। । इसलिए, यह इसे संचय करने का स्थायी तरीका है, जिसका अर्थ है कि कुंजी सभी तरह से अद्वितीय होगी।

  #import "SSKeychain.h" #import <Security/Security.h> 

प्रस्तुति लॉन्च में निम्नलिखित कोड शामिल हैं:

  // getting the unique key (if present ) from keychain , assuming "your app identifier" as a key NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"]; if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device NSString *uuid = [self createNewUUID]; // save newly created key to Keychain [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"]; // this is the one time process } 

SSKeychain.m और .h फ़ाइल को डाउनलोड करें sskeychain और Drag SSKeychain.m और .h फ़ाइल को अपनी प्रोजेक्ट में जोड़ें और "Security.framework" को अपनी प्रोजेक्ट में जोड़ें। UUID का प्रयोग करने के बाद बस का उपयोग करें:

 NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"]; 

शायद आप इसका उपयोग कर सकते हैं:

 [UIDevice currentDevice].identifierForVendor.UUIDString 

एप्पल के प्रलेखन पहचानकर्ता फॉरवेन्डर का वर्णन निम्नानुसार है:

इस उपकरण का मान एक ही डिवाइस पर चलने वाले वही विक्रेता से आने वाले ऐप्स के लिए समान है। अलग-अलग विक्रेताओं से आने वाले एक ही डिवाइस पर मौजूद ऐप्स के लिए और अलग-अलग डिवाइस पर ऐप्स के लिए एक अलग मान दिया जाता है, चाहे विक्रेता की परवाह किए बिना।

आप OpenUDID का उपयोग करने पर विचार कर सकते हैं जो OpenUDID ड्रॉप-इन प्रतिस्थापन है।

असल में, UDID से मिलान करने के लिए, निम्नलिखित विशेषताएं आवश्यक हैं:

  1. अद्वितीय या पर्याप्त रूप से अद्वितीय (एक कम संभावना टकराव शायद बहुत स्वीकार्य है)
  2. रिबूट में दृढ़ता, पुनर्स्थापित, अनइंस्टॉल
  3. विभिन्न विक्रेताओं के ऐप्स में उपलब्ध है (सीपीआई नेटवर्क के माध्यम से उपयोगकर्ताओं को प्राप्त करने के लिए उपयोगी) –

OpenUDID उपरोक्त को पूरा करती है और इसके बाद के विचार के लिए एक अंतर्निहित ऑप्ट-आउट तंत्र भी है।

http://OpenUDID.org जांचें, यह संबंधित गीटहब को इंगित करता है। उम्मीद है की यह मदद करेगा!

एक तरफ नोट के रूप में, मैं किसी भी मैक पते के विकल्प से दूर शर्मीली होगी। जबकि मैक एड्रेस एक मोहक और सार्वभौमिक समाधान की तरह दिखता है, यह सुनिश्चित करें कि यह कम फांसी के फल ज़हर है। मैक एड्रेस बहुत ही संवेदनशील है, और इससे पहले कि आप "इस एपीपी को भेजें" भी कह सकते हैं, एप्पल इससे पहले अच्छी तरह से इसका उपयोग नापसंद कर सकता है … मैक नेटवर्क एड्रेस का इस्तेमाल निजी लेन्स (डब्ल्यूएलएएन) या अन्य वर्चुअल प्राइवेट पर कुछ डिवाइस को प्रमाणित करने के लिए किया जाता है। नेटवर्क (वीपीएन) .. यह पूर्व यूडीआईडी ​​से भी ज्यादा संवेदनशील है!

मुझे यकीन है कि ऐप्पल ने इस बदलाव के साथ कई लोगों से नाराज किया है। मैं आईओएस के लिए एक बहीखाता पद्धति का ऐप विकसित करता हूं और विभिन्न उपकरणों पर किए गए परिवर्तनों को सिंक करने के लिए एक ऑनलाइन सेवा है। यह सेवा सभी उपकरणों का एक डाटाबेस रखती है और उन परिवर्तनों को उनको प्रचारित करने की आवश्यकता होती है। इसलिए यह जानना महत्वपूर्ण है कि कौन से डिवाइस हैं मैं UIDevice uniqueIdentifier का उपयोग करने वाले उपकरणों का ट्रैक रखता हूं और इसके लिए क्या कीमत है, यह मेरा विचार है

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

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

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

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

ऐसा लगता है कि आईओएस 6 के लिए, ऐप्पल आपको एनएसयूयूआईआईडी वर्ग का इस्तेमाल करने की सलाह दे रहा है।

अद्वितीय uniqueIdentifier संपत्ति के लिए uniqueIdentifier डॉक्स में अब संदेश से:

आईओएस 5.0 में पदावनत इस क्लास की पहचानकर्ता फॉर वेंडर संपत्ति या इसके बजाय ASIdentifierManager क्लास के विज्ञापनप्रतिनिधि गुण का उपयोग करें, या यूयूआईडी वर्ग के यूयूआईडी विधि का उपयोग करके यूयूआईडी बनाने के लिए और इसे यूज़र डीफॉल्ट डेटाबेस में लिखना है।

मदद कर सकते हैं: नीचे दिए गए कोड का उपयोग करें यह आपके डिवाइस को मिटाए (प्रारूप) को छोड़कर हमेशा अनूठा होगा।

 UIDevice *myDevice=[UIDevice currentDevice]; NSString *UUID = [[myDevice identifierForVendor] UUIDString]; 

मैं यह भी uniqueIdentifier से इस ओपन सोर्स लाइब्रेरी (वास्तव में 2 सरल श्रेणियों) को बदलने का सुझाव देगा जो ऐप बंडल आइडेंटिफ़ायर के साथ डिवाइस के मैक एड्रेस के साथ उपयोग करने के लिए यूपीआईडी ​​प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है।

ध्यान रखें कि यूडीआईडी ​​के विपरीत यह संख्या हर ऐप के लिए अलग-अलग होगी।

आपको बस शामिल NSString और UIDevice श्रेणियों को आयात करने और [[UIDevice currentDevice] uniqueDeviceIdentifier] कॉल करने की आवश्यकता है:

 #import "UIDevice+IdentifierAddition.h" #import "NSString+MD5Addition.h" NSString *iosFiveUDID = [[UIDevice currentDevice] uniqueDeviceIdentifier] 

आप इसे गिथूब पर पा सकते हैं:

आईआईएस 5 के लिए यूआईडीइविसेज को अनूठीआईडेंटिफायर के साथ


यहां श्रेणियां हैं (सिर्फ .m फाइलें – हेडर के लिए गिथूब प्रोजेक्ट की जांच करें):

UIDevice + IdentifierAddition.m

 #import "UIDevice+IdentifierAddition.h" #import "NSString+MD5Addition.h" #include <sys/socket.h> // Per msqr #include <sys/sysctl.h> #include <net/if.h> #include <net/if_dl.h> @interface UIDevice(Private) - (NSString *) macaddress; @end @implementation UIDevice (IdentifierAddition) //////////////////////////////////////////////////////////////////////////////// #pragma mark - #pragma mark Private Methods // Return the local MAC addy // Courtesy of FreeBSD hackers email list // Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb. - (NSString *) macaddress{       int mib[6];    size_t len;    char *buf;    unsigned char *ptr;    struct if_msghdr *ifm;    struct sockaddr_dl *sdl;       mib[0] = CTL_NET;    mib[1] = AF_ROUTE;    mib[2] = 0;    mib[3] = AF_LINK;    mib[4] = NET_RT_IFLIST;       if ((mib[5] = if_nametoindex("en0")) == 0) {        printf("Error: if_nametoindex error\n");        return NULL;    }       if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {        printf("Error: sysctl, take 1\n");        return NULL;    }       if ((buf = malloc(len)) == NULL) {        printf("Could not allocate memory. error!\n");        return NULL;    }       if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {        printf("Error: sysctl, take 2");        return NULL;    }       ifm = (struct if_msghdr *)buf;    sdl = (struct sockaddr_dl *)(ifm + 1);    ptr = (unsigned char *)LLADDR(sdl);    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];    free(buf);       return outstring; } //////////////////////////////////////////////////////////////////////////////// #pragma mark - #pragma mark Public Methods - (NSString *) uniqueDeviceIdentifier{    NSString *macaddress = [[UIDevice currentDevice] macaddress];    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];     NSString *stringToHash = [NSString stringWithFormat:@"%@%@",macaddress,bundleIdentifier];    NSString *uniqueIdentifier = [stringToHash stringFromMD5];     return uniqueIdentifier; } - (NSString *) uniqueGlobalDeviceIdentifier{    NSString *macaddress = [[UIDevice currentDevice] macaddress];    NSString *uniqueIdentifier = [macaddress stringFromMD5];       return uniqueIdentifier; } @end 

NSString + MD5Addition.m:

 #import "NSString+MD5Addition.h" #import <CommonCrypto/CommonDigest.h> @implementation NSString(MD5Addition) - (NSString *) stringFromMD5{       if(self == nil || [self length] == 0)        return nil;       const char *value = [self UTF8String];       unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];    CC_MD5(value, strlen(value), outputBuffer);       NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];    for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){        [outputString appendFormat:@"%02x",outputBuffer[count]];    }    return [outputString autorelease]; } @end 

आप इस कोड से प्राप्त कर सकते हैं: IID-5 के लिए UIDevice-with-UniqueIdentifier-

मैक पते को धोखा दिया जा सकता है जो विशिष्ट उपयोगकर्ताओं को सामग्री बांधने या ब्लैकलिस्ट के जैसी सुरक्षा विशेषताओं को लागू करने के लिए ऐसा एक तरीका बेकार है।

कुछ और शोध के बाद मुझे यह प्रतीत होता है कि अब हम उचित विकल्प के बिना छोड़े गए हैं। मैं गंभीरता से आशा करता हूं कि एप्पल उनके फैसले पर पुनर्विचार करेगा।

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

UIDevice identifierForVendor 6 में शुरू की गई UIDevice identifierForVendor आपके प्रयोजनों के लिए काम करेगा

identifierForVendor एक अल्फ़ान्यूमेरिक स्ट्रिंग है जो विशिष्ट रूप से ऐप के विक्रेता के लिए एक डिवाइस की पहचान करता है। (सिफ़ पढ़िये)

 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor 

इस उपकरण का मान एक ही डिवाइस पर चलने वाले वही विक्रेता से आने वाले ऐप्स के लिए समान है। अलग-अलग विक्रेताओं से आने वाले एक ही डिवाइस पर मौजूद ऐप्स के लिए एक अलग मान दिया जाता है, और विभिन्न उपकरणों पर मौजूद ऐप्स के लिए विक्रेता के संबंध हैं

आईओएस 6.0 और बाद में उपलब्ध है और UIDevice.h में घोषित किया UIDevice.h

आईओएस 5 के लिए इस लिंक को यूआईडीवाइस के साथ-अनूठी पहचानकर्ता- आईओएस -5 का संदर्भ लें

उपर्युक्त एसएसकेइचैन और कोड का उपयोग करना। कॉपी / पेस्ट करने के लिए यहां कोड (SSKeychain मॉड्यूल जोड़ें):

 +(NSString *) getUUID { //Use the bundle name as the App identifier. No need to get the localized version. NSString *Appname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; //Check if we have UUID already NSString *retrieveuuid = [SSKeychain passwordForService:Appname account:@"user"]; if (retrieveuuid == NULL) { //Create new key for this app/device CFUUIDRef newUniqueId = CFUUIDCreate(kCFAllocatorDefault); retrieveuuid = (__bridge_transfer NSString*)CFUUIDCreateString(kCFAllocatorDefault, newUniqueId); CFRelease(newUniqueId); //Save key to Keychain [SSKeychain setPassword:retrieveuuid forService:Appname account:@"user"]; } return retrieveuuid; 

}

यह कोड है I आईओएस 5 और आईओएस 6, 7 दोनों के लिए आईडी प्राप्त करने के लिए उपयोग कर रहा हूं:

 - (NSString *) advertisingIdentifier { if (!NSClassFromString(@"ASIdentifierManager")) { SEL selector = NSSelectorFromString(@"uniqueIdentifier"); if ([[UIDevice currentDevice] respondsToSelector:selector]) { return [[UIDevice currentDevice] performSelector:selector]; } } return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; } 

आईओएस 6 के बाद से, हमारे पास NSUUID वर्ग है जो आरएफसी 4122 का अनुपालन करता है

एपल लिंक: एनएसयूयूआईडी के लिए apple_ref

निम्नलिखित कोड यूडीआईडी ​​प्राप्त करने में मदद करता है:

  udid = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; NSLog(@"UDID : %@", udid); 

आईओएस 11 ने डिवाइस चेक फ्रेमवर्क पेश किया है डिवाइस की विशिष्ट रूप से पहचानने के लिए इसमें एक पूर्ण समाधान है

आप उपयोग कर सकते हैं

 NSString *sID = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; 

जो सभी एप्लिकेशन में डिवाइस के लिए अद्वितीय है

ऐप्पल ने आईओएस 11 नामक एक नए ढांचे को डिवाइस चेक कहा है जो आपको अद्वितीय पहचानकर्ता को बहुत आसानी से प्राप्त करने में मदद करेगा। इस फॉर्म को और अधिक जानकारी पढ़ें। https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d

इन पुस्तकालयों का प्रयोग न करें – libOmnitureAppMeasurement, यह अनन्य पहचानकर्ता का उपयोग करता है जो सेब का समर्थन नहीं करता

यदि कोई इस प्रश्न पर ठोकर खाएगा, तो एक विकल्प की तलाश में। मैं IDManager वर्ग में इस दृष्टिकोण का पालन किया है, यह विभिन्न समाधानों से एक संग्रह है। चाबी का चाइना चाबी का गुच्छा से पढ़ने के लिए एक आवरण है। आप एक प्रकार की अद्वितीय आईडी के रूप में hashed MAC address उपयोग कर सकते हैं।

 /* Apple confirmed this bug in their system in response to a Technical Support Incident  request. They said that identifierForVendor and advertisingIdentifier sometimes  returning all zeros can be seen both in development builds and apps downloaded over the  air from the App Store. They have no work around and can't say when the problem will be fixed. */ #define kBuggyASIID @"00000000-0000-0000-0000-000000000000" + (NSString *) getUniqueID { if (NSClassFromString(@"ASIdentifierManager")) { NSString * asiID = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; if ([asiID compare:kBuggyASIID] == NSOrderedSame) { NSLog(@"Error: This device return buggy advertisingIdentifier."); return [IDManager getUniqueUUID]; } else { return asiID; } } else { return [IDManager getUniqueUUID]; } } + (NSString *) getUniqueUUID { NSError * error; NSString * uuid = [KeychainUtils getPasswordForUsername:kBuyassUser andServiceName:kIdOgBetilngService error:&error]; if (error) { NSLog(@"Error geting unique UUID for this device! %@", [error localizedDescription]); return nil; } if (!uuid) { DLog(@"No UUID found. Creating a new one."); uuid = [IDManager GetUUID]; uuid = [Util md5String:uuid]; [KeychainUtils storeUsername:USER_NAME andPassword:uuid forServiceName:SERVICE_NAME updateExisting:YES error:&error]; if (error) { NSLog(@"Error getting unique UUID for this device! %@", [error localizedDescription]); return nil; } } return uuid; } /* NSUUID is after iOS 6. */ + (NSString *)GetUUID { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef string = CFUUIDCreateString(NULL, theUUID); CFRelease(theUUID); return [(NSString *)string autorelease]; } #pragma mark - MAC address // Return the local MAC addy // Courtesy of FreeBSD hackers email list // Last fallback for unique identifier + (NSString *) getMACAddress { int mib[6]; size_t len; char *buf; unsigned char *ptr; struct if_msghdr *ifm; struct sockaddr_dl *sdl; mib[0] = CTL_NET; mib[1] = AF_ROUTE; mib[2] = 0; mib[3] = AF_LINK; mib[4] = NET_RT_IFLIST; if ((mib[5] = if_nametoindex("en0")) == 0) { printf("Error: if_nametoindex error\n"); return NULL; } if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { printf("Error: sysctl, take 1\n"); return NULL; } if ((buf = malloc(len)) == NULL) { printf("Error: Memory allocation error\n"); return NULL; } if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { printf("Error: sysctl, take 2\n"); free(buf); // Thanks, Remy "Psy" Demerest return NULL; } ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm + 1); ptr = (unsigned char *)LLADDR(sdl); NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; free(buf); return outstring; } + (NSString *) getHashedMACAddress { NSString * mac = [IDManager getMACAddress]; return [Util md5String:mac]; } + (NSString *)md5String:(NSString *)plainText { if(plainText == nil || [plainText length] == 0) return nil; const char *value = [plainText UTF8String]; unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH]; CC_MD5(value, strlen(value), outputBuffer); NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){ [outputString appendFormat:@"%02x",outputBuffer[count]]; } NSString * retString = [NSString stringWithString:outputString]; [outputString release]; return retString; } 

IOS में UniqueIdetifier को खोजने के लिए इसका उपयोग करें:

https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5/blob/master/Classes/UIDevice+IdentifierAddition.m#L32

 + (NSString *) getUniqueUUID { NSError * error; NSString * uuid = [KeychainUtils getPasswordForUsername:kBuyassUser andServiceName:kIdOgBetilngService error:&error]; if (error) { NSLog(@"Error geting unique UUID for this device! %@", [error localizedDescription]); return nil; } if (!uuid) { DLog(@"No UUID found. Creating a new one."); uuid = [IDManager GetUUID]; uuid = [Util md5String:uuid]; [KeychainUtils storeUsername:USER_NAME andPassword:uuid forServiceName:SERVICE_NAME updateExisting:YES error:&error]; if (error) { NSLog(@"Error getting unique UUID for this device! %@", [error localizedDescription]); return nil; } } return uuid; } 

We can use identifierForVendor for ios7,

 -(NSString*)uniqueIDForDevice { NSString* uniqueIdentifier = nil; if( [UIDevice instancesRespondToSelector:@selector(identifierForVendor)] ) { // >=iOS 7 uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; } else { //<=iOS6, Use UDID of Device CFUUIDRef uuid = CFUUIDCreate(NULL); //uniqueIdentifier = ( NSString*)CFUUIDCreateString(NULL, uuid);- for non- ARC uniqueIdentifier = ( NSString*)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));// for ARC CFRelease(uuid); } } return uniqueIdentifier; } 

–Important Note —

UDID and identifierForVendor are different:—

 1.) On uninstalling and reinstalling the app identifierForVendor will change. 2.) The value of identifierForVendor remains the same for all the apps installed from the same vendor on the device. 3.) The value of identifierForVendor also changes for all the apps if any of the app (from same vendor) is reinstalled. 

Apple has hidden the UDID from all public APIs, starting with iOS 7. Any UDID that begins with FFFF is a fake ID. The "Send UDID" apps that previously worked can no longer be used to gather UDID for test devices. (sigh!)

The UDID is shown when a device is connected to XCode (in the organizer), and when the device is connected to iTunes (although you have to click on 'Serial Number' to get the Identifier to display.

If you need to get the UDID for a device to add to a provisioning profile, and can't do it yourself in XCode, you will have to walk them through the steps to copy/paste it from iTunes.

Is there a way since (iOS 7's release) to get the UDID without using iTunes on a PC/Mac?

I had got some issue too, and solution is simple:

  // Get Bundle Info for Remote Registration (handy if you have more than one app) NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]; NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; // Get the users Device Model, Display Name, Unique ID, Token & Version Number UIDevice *dev = [UIDevice currentDevice]; NSString *deviceUuid=[dev.identifierForVendor UUIDString]; NSString *deviceName = dev.name; 

A not perfect but one of the best and closest alternative to UDID (in Swift using iOS 8.1 and Xcode 6.1):

Generating a random UUID

 let strUUID: String = NSUUID().UUIDString 

And use KeychainWrapper library:

Add a string value to keychain:

 let saveSuccessful: Bool = KeychainWrapper.setString("Some String", forKey: "myKey") 

Retrieve a string value from keychain:

 let retrievedString: String? = KeychainWrapper.stringForKey("myKey") 

Remove a string value from keychain:

 let removeSuccessful: Bool = KeychainWrapper.removeObjectForKey("myKey") 

This solution uses the keychain, thus the record stored in the keychain will be persisted, even after the app is uninstalled and reinstalled. The only way of deleting this record is to Reset all contents and settings of the device. That is why I mentioned that this solution of substitution is not perfect but stays one of the best solution of replacement for UDID on iOS 8.1 using Swift.

A working way to get UDID:

  1. Launch a web server inside the app with two pages: one should return specially crafted MobileConfiguration profile and another should collect UDID. More info here , here and here .
  2. You open the first page in Mobile Safari from inside the app and it redirects you to Settings.app asking to install configuration profile. After you install the profile, UDID is sent to the second web page and you can access it from inside the app. (Settings.app has all necessary entitlements and different sandbox rules).

An example using RoutingHTTPServer :

 import UIKit import RoutingHTTPServer @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var bgTask = UIBackgroundTaskInvalid let server = HTTPServer() func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { application.openURL(NSURL(string: "http://localhost:55555")!) return true } func applicationDidEnterBackground(application: UIApplication) { bgTask = application.beginBackgroundTaskWithExpirationHandler() { dispatch_async(dispatch_get_main_queue()) {[unowned self] in application.endBackgroundTask(self.bgTask) self.bgTask = UIBackgroundTaskInvalid } } } } class HTTPServer: RoutingHTTPServer { override init() { super.init() setPort(55555) handleMethod("GET", withPath: "/") { $1.setHeader("Content-Type", value: "application/x-apple-aspen-config") $1.respondWithData(NSData(contentsOfFile: NSBundle.mainBundle().pathForResource("udid", ofType: "mobileconfig")!)!) } handleMethod("POST", withPath: "/") { let raw = NSString(data:$0.body(), encoding:NSISOLatin1StringEncoding) as! String let plistString = raw.substringWithRange(Range(start: raw.rangeOfString("<?xml")!.startIndex,end: raw.rangeOfString("</plist>")!.endIndex)) let plist = NSPropertyListSerialization.propertyListWithData(plistString.dataUsingEncoding(NSISOLatin1StringEncoding)!, options: .allZeros, format: nil, error: nil) as! [String:String] let udid = plist["UDID"]! println(udid) // Here is your UDID! $1.statusCode = 200 $1.respondWithString("see https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/ConfigurationProfileExamples/ConfigurationProfileExamples.html") } start(nil) } } 

Here are the contents of udid.mobileconfig :

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PayloadContent</key> <dict> <key>URL</key> <string>http://localhost:55555</string> <key>DeviceAttributes</key> <array> <string>IMEI</string> <string>UDID</string> <string>PRODUCT</string> <string>VERSION</string> <string>SERIAL</string> </array> </dict> <key>PayloadOrganization</key> <string>udid</string> <key>PayloadDisplayName</key> <string>Get Your UDID</string> <key>PayloadVersion</key> <integer>1</integer> <key>PayloadUUID</key> <string>9CF421B3-9853-9999-BC8A-982CBD3C907C</string> <key>PayloadIdentifier</key> <string>udid</string> <key>PayloadDescription</key> <string>Install this temporary profile to find and display your current device's UDID. It is automatically removed from device right after you get your UDID.</string> <key>PayloadType</key> <string>Profile Service</string> </dict> </plist> 

The profile installation will fail (I didn't bother to implement an expected response, see documentation ), but the app will get a correct UDID. And you should also sign the mobileconfig .