UIDevice uniqueIdentifier पदावनत - अब क्या करें?


501

यह अभी पता चला है कि UIDevice का यूनीकडेंटिफायर प्रॉपर्टी iOS 5 में पदावनत है और iOS 7 और इसके बाद के संस्करण में उपलब्ध नहीं है। कोई वैकल्पिक विधि या संपत्ति उपलब्ध या आगामी प्रतीत नहीं होती है।

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

2011-2012 में प्रलेखन से सुझाव था:

विशेष ध्यान

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

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


1
अभी भी यूनिक आईडेंटिफायर का उपयोग करने वाले ऐप्स के लिए, iOS7 अब FFFFFFFF + आइडेंटिफायरफोरवेंडर लौटाता है जो बहुत बुरी तरह से लिखे गए गैर-नवीनीकरण सब्सक्रिप्शन ऐप को तोड़ रहा है।
रिदमिक फिस्टमैन

यदि आपके ऐप के द्वारा आपका ऐप पुश नोटिफिकेशन का उपयोग करता है, तो आप ऐप्पल की पुश सेवा से वापस भेजे गए टोकन का उपयोग कर सकते हैं, यह प्रति डिवाइस अद्वितीय है
Calin Chitu

@CalinChitu यदि उपयोगकर्ता पुश सूचनाओं को स्वीकार नहीं करता है, तो क्या आप अभी भी उस उपयोगकर्ता के लिए एक पुशआईडी प्राप्त कर सकते हैं?
चेस रॉबर्ट्स

जवाबों:


272

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

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

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

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

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

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


8
क्या मैक पता इस बात पर निर्भर नहीं करता है कि उपयोगकर्ता Wifi के माध्यम से जुड़ा हुआ है या नहीं?
ओलिवर पियरमैन

1
@DarkDust: लेकिन जब आप वाईफ़ाई से सेलुलर मॉडेम पर स्विच करते हैं तो सक्रिय इंटरफ़ेस बदल जाता है, सक्रिय इंटरफ़ेस का मैक पता भी बदलना चाहिए; जब तक आप हमेशा MAC
user102008

3
@ रेंजर नोलन: कृपया अन्य लोगों के उत्तरों को संपादित न करें और ऐसा सामान जोड़ें जो ऐसा लगता है कि यह मूल लेखक से आया है। धन्यवाद।
डार्कडस्ट

2
@RogerNolan जब तक पोस्ट एक सामुदायिक उत्तर नहीं है, तब तक संपादन गलतियों और ऐसी चीजों को सुधारने के लिए हैं, न कि नए सामान जोड़ने के लिए। आपके द्वारा विशेषाधिकार अर्जित करने का एक कारण है। कल्पना कीजिए कि मैं आपके उत्तर को संपादित करता हूं और कुछ बीएस लिखता हूं, लोगों को लगता है कि आपने ऐसा लिखा होगा। मुझे संदेह है कि आप ऐसा चाहेंगे :-) लेकिन आपको सूचित नहीं किया जाता है कि एक संपादन हुआ, मुझे केवल दुर्घटना से पता चला।
डार्कडस्ट

3
Apple अब उन ऐप्स को अस्वीकार करता है जो हैशेड मैक का उपयोग करता है।
ईडन

91

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

आप जीथब पर कोड पा सकते हैं


3
यह कार्यान्वयन ऐप्पल के यूनीक आईड की तरह एक डिवाइस के लिए अद्वितीय (मैक एड्रेस) है, जैसे कि ऐप्पल का यूनीक आई, लेकिन यह गोपनीयता का भी सम्मान करता है, एक एप्लिकेशन के लिए भी अद्वितीय है (बंडल का उपयोग भी करें) ... एक के पास यह होना चाहिए, कि ऐप्पल को अपने एपीआई में शामिल करना चाहिए। .. किसी भी विकल्प w / o को अपदस्थ करने के बजाय।
विंसेंट गेरसी

8
यद्यपि यह विज्ञापन खंड, yuck के साथ पुरानी शैली bsd लाइसेंस का उपयोग करता है।
jbtule

8
अब इस पोस्ट को खोजने वाले किसी अन्य व्यक्ति के लिए, उपरोक्त टिप्पणी के बाद से लाइसेंस बदल दिया गया है।
जेम्स

1
जैसा कि इस प्रतिबद्ध टिप्पणी में चर्चा की गई है, जैसा कि पुस्तकालय एक गंभीर गोपनीयता लीक मुद्दा है और इसका उपयोग नहीं किया जाना चाहिए:
होगा

15
IOS 7 से शुरू, सिस्टम हमेशा 02:00:00:00:00:00किसी भी डिवाइस पर मैक पते के लिए पूछने पर मूल्य वापस करता है। यहाँ देखें: developer.apple.com/library/prerelease/ios/releasenotes/General/…
Hejazi

61

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

#import "UIDevice+IdentifierAddition.h"

NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);

XXXX21f1f19edff198e2a2356bf4XXXX - (WIFI) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (WIFI) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (3G) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (3G) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (GPRS) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (GPRS) GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (AirPlane मोड) UDID
XXXX7dc3c577446a2bcbd77935bdXXXX (AirPlane मोड) GlobalAppUDID

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

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

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


13
iOS7 पर यह अभ्यस्त काम, Apple मैक पते के उपयोग को समाप्त करता है।
सरीम सिद

@SarimSidd अब iOS 7 के बारे में NDA के अंतर्गत है, हम यहाँ चर्चा नहीं कर सकते।
Mat

57

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

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

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

UUID उपयोगकर्ता द्वारा डिवाइस रीसेट करने पर बस फिर से बनाया जाएगा।

मैंने SFHFKeychainUtils के साथ यह तरीका आज़माया और यह एक आकर्षण की तरह काम करता है।


33
यह विधि यूडीआईडी ​​के लिए एक ठोस प्रतिस्थापन है। यह डिवाइस प्रारूप पर पहचानकर्ता को फिर से बनाने का अतिरिक्त लाभ भी है (उदाहरण के लिए, यदि डिवाइस स्वामी बदलता है)। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि यदि उपयोगकर्ता अपने बैकअप को एन्क्रिप्ट करता है, तो किचेन को अन्य उपकरणों पर बहाल किया जा सकता है। यह एक ऐसी स्थिति में परिणाम हो सकता है जहां कई उपकरण समान यूयूआईडी साझा करते हैं। इससे बचने के लिए, अपने किचेन आइटम की पहुंच निर्धारित करें kSecAttrAccessibleAlwaysThisDeviceOnly। यह सुनिश्चित करेगा कि आपका UUID किसी अन्य डिवाइस पर माइग्रेट न हो। अपने UUID को अन्य एप्लिकेशन से एक्सेस करने के लिए, kSecAttrAccessGroupकुंजी का उपयोग करें ।
जीवन ताखर

किचेन में UUID को स्टोर करने के लिए आप वास्तव में (किस कुंजी) का उपयोग करने वाले हैं?
५२ पर खोया हुआ

ओह! लिंक टूटा है
COVID19

48

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

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

उदाहरण:

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

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

फिर आप इसे KEYCHAINअपने ऐप के पहले लॉन्च पर स्टोर कर सकते हैं । ताकि पहले लॉन्च के बाद, हम इसे कीचेन से बस इस्तेमाल कर सकें, इसे दोबारा बनाने की जरूरत नहीं है। स्टोर करने के लिए किचेन का उपयोग करने का मुख्य कारण है: जब आप 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 से डाउनलोड करें और SSKeychain.m और .h फ़ाइल को अपनी परियोजना में खींचें और अपनी परियोजना में "Security.framework" जोड़ें। UUID का उपयोग करने के लिए बाद में बस उपयोग करें:

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

क्योंकि एक पहचानकर्ताForVendor पूरी तरह से काम नहीं कर रहा है। कुछ मामलों में एक शून्य या 0x0 वापस कर सकते हैं। ऐसा लगता है कि यह विधि पूरी तरह से काम कर रही है
CReaTuS

3
किसी ने भी मान्य किया है कि यह iOS7 पर काम कर रहा है।
माइंडबॉम्ब

मैंने इस समाधान का उपयोग शुरू कर दिया है। 2 उपकरणों पर कई परीक्षण (पुनर्निर्माण, पुनर्स्थापना, डिवाइस बंद करें) ने मुझे दिखाया कि आईडी समान है। iOS 10.3।
डेको

16

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

[UIDevice currentDevice].identifierForVendor.UUIDString

Apple का प्रलेखन पहचानकर्ता के रूप में निम्नानुसार वर्णन करता है:

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


उत्सुक क्यों हाल ही में जब तक कोई इसे नहीं लाया ... और अब मैं इसे iOS 6 के साथ नया देख रहा हूं
जेम्स बाउचर

1
यदि उपयोगकर्ता ios को अपडेट करता है और / या नया ios स्थापित करता है, तो पहचानकर्ता का मान बदल जाएगा या फिर वही रहेगा?
सुनील ज़लावदिया

1
एक ही विक्रेता से सभी ऐप को हटाने के बाद फिर इस मूल्य को बदल दिया जाएगा।
मितेश खत्री

14

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

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

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

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

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

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


मैं वास्तव में उत्सुक हूं कि यह कैसे काम करता है? कोड ऑब्जेक्टिव-सी में लिखा गया है, लेकिन कोई अन्य अच्छा समाधान नहीं है जो ऊपर की आवश्यकताओं को फिट करता है, इसलिए यह रूपरेखा अलग क्या है? समाधान है कि इस ढांचे का उपयोग कर रहा है यह भी एक सुझाव के रूप में यहाँ पोस्ट करने के लिए संभव होना चाहिए ...
jake_hetfield

मैं कॉन्कुर करता हूं - मैक पते को मैन्युअल रूप से अच्छी तरह से कॉन्फ़िगर किया जा सकता है ("क्लोन"), हालांकि यह अधिकांश भाग के लिए होने की संभावना नहीं है। मुझे UDID में D का विरोध करना चाहिए। यह एक डिवाइस आईडी नहीं है, यह एक यूयूआईडी (विश्वविद्यालय की विशिष्ट पहचानकर्ता) है। डिवाइस आईडी को ऐप्पल द्वारा रोम में प्रत्येक डिवाइस पर कारखाने से मुहर लगाई जाती है।
बजे जे इमरान

IOS7 के लिए सबसे अच्छा समाधान के रूप में अच्छी तरह से वास्तव में एक डिवाइस की पहचान करने के लिए
व्हाट्सएप की

1
OpenUDID को हटा दिया गया है और उपयोग करने के लिए अनुशंसित नहीं है
mkll

11

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

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

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

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

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


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

यह वास्तव में व्यवहार है जिसे मैंने कई बार देखा है। उदाहरण के लिए, मैं अपने iPhone को Google सिंक के लिए पंजीकृत करता हूं। फिर मुझे एक नया iPhone मिला, इसे पंजीकृत करें, और वॉइला - मेरे पास अब 2 सिंक हैं जो मेरी सिंक सेटिंग्स में सूचीबद्ध हैं।
जे इमरमान

11

यह iOS 6 के लिए दिखता है, Apple आपको उपयोग करने की सलाह दे रहा है NSUUID क्लास का करने

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

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


10

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

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

1
मैंने इस कोड का इस्तेमाल किया। लेकिन जब मैंने ऐप को डिलीट किया और फिर से इंस्टॉल किया तो मुझे नया आईडी मिला
दुर्गाप्रसाद

1
यदि आपको एक मजबूत विधि की आवश्यकता नहीं है तो यह एक सरल उपाय है। मैं अब अपने अनुप्रयोग में इसका उपयोग कर रहा हूँ
रूबेन एल।

@ दुर्गाप्रसाद: यह हमेशा बदल जाएगा क्योंकि यह विक्रेता पर निर्भर है। उदाहरण के लिए: 1. यदि आपने बंडलडाइनिफ़ायर के साथ एक ऐप इंस्टॉल किया है: com.abcd.com => तो यह बदल जाएगा। 2. यदि आपने बंडलडाइनिफ़ायर के साथ दो ऐप इंस्टॉल किए हैं: com.abcd.com => तो यह chnage नहीं करेगा (किसी भी एक ऐप को दौरान रखें)
अश्विन अादिया

7

मैं भी से अधिक बदलने का सुझाव देते हैं uniqueIdentifierकरने के लिए इस खुला स्रोत पुस्तकालय (2 सरल श्रेणियों वास्तव में) है कि अनुप्रयोग बंडल पहचानकर्ता के साथ डिवाइस का MAC पता का उपयोग अपने अनुप्रयोगों है कि एक UDID स्थानापन्न के रूप में इस्तेमाल किया जा सकता में एक अद्वितीय ID उत्पन्न करने के लिए।

ध्यान रखें कि UDID के विपरीत यह संख्या हर ऐप के लिए अलग होगी।

आपको बस शामिल 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

3
IOS 7 में शुरू, Apple मैक पते के लिए एक निरंतर मूल्य लौटाएगा। यह सही समझ में आता है। मैक पता संवेदनशील है।
रॉबर्टो


4

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

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

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


13
एक मान्य बिंदु हालांकि मेरा मानना ​​है कि UUID को जेलब्रेक फोन पर खराब / स्वाइप भी किया जा सकता है इसलिए तकनीकी रूप से मौजूदा [UIDevice uniqueIdentifier] उतना ही त्रुटिपूर्ण है।
ओलिवर पीयरमैन

3
आप हमेशा सर्वर पर एक पहचानकर्ता बना सकते हैं और इसे डिवाइस पर सहेज सकते हैं। यह है कि ज्यादातर आवेदन यह कैसे करते हैं। मुझे समझ नहीं आता कि iOS प्रोग्रामर को कुछ विशेष क्यों चाहिए।
सुल्तान

1
@Sulthan iOS पर काम नहीं करता है क्योंकि अगर आप किसी ऐप को अनइंस्टॉल करते हैं तो उसका सारा डेटा खत्म हो जाता है, इसलिए इस तरह से यूनिक डिवाइस आइडेंटिफायर की गारंटी देने का कोई तरीका नहीं है।
लकराइडर

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

IOS की नई रिलीज़ में मैक एड्रेस एक्सेस को Apple द्वारा प्रतिबंधित कर दिया गया है;
Ans

4

UIDevice identifierForVendor iOS 6 में पेश किया गया आपके उद्देश्यों के लिए काम करेगा।

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

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

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

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

IOS 5 के लिए इस लिंक को देखें UIDevice-with-UniqueIdentifier-for-iOS-5


4

ऊपर वर्णित SSKeychain और कोड का उपयोग करना। यहाँ कॉपी / पेस्ट (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;

}


3

UDID प्राप्त करने में निम्नलिखित कोड मदद करता है:

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

3

यह वह कोड है जिसका उपयोग मैं iOS 5 और iOS 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];
}

संकलक चेतावनी के बारे में आप क्या करते हैं PerformSelector may cause a leak because its selector is unknown?
तुलसी बॉर्क

आप इस उद्देश्य के लिए कोई विज्ञापन का उपयोग नहीं कर सकते हैं क्योंकि Apple इसे अस्वीकार कर देगा। और जानकारी: techcrunch.com/2014/02/03/...
codeplasma


2

iOS 11 ने डिवाइसचेक फ्रेमवर्क पेश किया है। यह डिवाइस की विशिष्ट पहचान के लिए एक फुलप्रूफ समाधान है।


1

UDID पाने का एक कारगर तरीका:

  1. ऐप के अंदर एक वेब सर्वर दो पृष्ठों के साथ लॉन्च करें: एक को विशेष रूप से तैयार की गई मोबाइल कॉनफिगरेशन प्रोफाइल वापस करना चाहिए और दूसरे को यूडीआईडी ​​एकत्र करना चाहिए। अधिक जानकारी यहाँ , यहाँ और यहाँ
  2. आप ऐप के अंदर से मोबाइल सफारी में पहला पेज खोलते हैं और यह आपको कॉन्फ़िगरेशन प्रोफ़ाइल को स्थापित करने के लिए Settings.app पर पुनर्निर्देशित करता है। प्रोफ़ाइल को स्थापित करने के बाद, UDID को दूसरे वेब पेज पर भेजा जाता है और आप इसे ऐप के अंदर से एक्सेस कर सकते हैं। (Settings.app में सभी आवश्यक एंटाइटेलमेंट और विभिन्न सैंडबॉक्स नियम हैं)।

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)
    }
}

यहाँ की सामग्री हैं 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>

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


1

स्विफ्ट 3.0 के लिए कृपया नीचे दिए गए कोड का उपयोग करें।

let deviceIdentifier: String = (UIDevice.current.identifierForVendor?.uuidString)!
NSLog("output is : %@", deviceIdentifier)

1
iOS 11 ने डिवाइसचेक फ्रेमवर्क पेश किया है। यह डिवाइस की विशिष्ट पहचान के लिए एक फुलप्रूफ समाधान है।
संतोष बोत्रे

1

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

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

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


1

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


लेकिन यह एक इंटरनेट कनेक्शन की जरूरत है, है ना?
निक कोव

हां इसके लिए इंटरनेट कनेक्शन की जरूरत है।
संतोष बोत्रे

0

यदि कोई व्यक्ति इस प्रश्न पर ठोकर खाता है, तो विकल्प की तलाश करते समय। मैंने 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;
}

0
+ (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;
}

0

हम 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;
}

--महत्वपूर्ण लेख ---

UDID और पहचानकर्ताForVendor अलग हैं: ---

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.

क्या आपको यकीन है ? क्या हम ios7 के लिए आइडेंटिफ़ायर वेंडर का उपयोग कर सकते हैं?
अवीस

0

Apple ने UDID को सभी सार्वजनिक API से छिपा दिया है, iOS 7 से शुरू होता है। FFFF से शुरू होने वाला कोई भी UDID एक नकली आईडी है। "Send UDID" ऐप जो पहले काम करते थे, अब टेस्ट डिवाइस के लिए UDID को इकट्ठा करने के लिए उपयोग नहीं किया जा सकता है। (आह!)

UDID को तब दिखाया जाता है जब एक डिवाइस XCode (आयोजक में) से जुड़ा होता है, और जब डिवाइस iTunes से जुड़ा होता है (हालाँकि आपको पहचान दर्शाने के लिए 'सीरियल नंबर' पर क्लिक करना होता है।

यदि आपको प्रोविजनिंग प्रोफ़ाइल में जोड़ने के लिए डिवाइस के लिए UDID प्राप्त करने की आवश्यकता है, और XCode में स्वयं ऐसा नहीं कर सकते, तो आपको इसे iTunes से कॉपी / पेस्ट करने के चरणों के माध्यम से चलना होगा।

क्या पीसी (मैक) पर आईट्यून्स का उपयोग किए बिना यूडीआईडी ​​प्राप्त करने के लिए (आईओएस 7 की रिलीज) के बाद से एक रास्ता है?


0

मुझे कुछ मुद्दा भी मिला था, और समाधान सरल है:

    // 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;

0

एक सही नहीं है, लेकिन UDID (iOS 8.1 और Xcode 6.1 का उपयोग करके स्विफ्ट में सबसे अच्छा और निकटतम विकल्प) में से एक:

एक यादृच्छिक UUID उत्पन्न करना

let strUUID: String = NSUUID().UUIDString

और किचेनवॉपर लाइब्रेरी का उपयोग करें :

चाबी का गुच्छा के लिए एक स्ट्रिंग मान जोड़ें:

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

चाबी का गुच्छा से एक स्ट्रिंग मान प्राप्त करें:

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

चाबी का गुच्छा से एक स्ट्रिंग मान निकालें:

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.