2012-04-25 13 views
5

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

  1. CFUUID
  2. उत्पन्न यह वहाँ के बाद
  3. पुन: उपयोग कर सकते कीचेन आइटम कीचेन पर सहेजें था।

यह अच्छा काम कर रहा है। लेकिन, किसी कारण से हमने हाल ही में देखा है कि एंटरप्राइज़ बिल्ड की स्थापना के साथ हमें एक अलग यूयूआईडी मिल रही है (जिसे हमारी अनन्य एक्सेस कुंजी के साथ कीचेन पर संग्रहीत किया जाना था)।

क्या कोई ऐसी स्थिति में आया था? यहाँ UUID बना सकते हैं और कीचेन पर इसे स्टोर करने के लिए कोड .. है

+ (NSString *)registerUUIDWithKeyChain 
{ 
CFUUIDRef udid = CFUUIDCreate(NULL); 
NSString *uuidString = (NSString *) CFUUIDCreateString(NULL, udid); 

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"UniqueApp" accessGroup:nil]; 

NSString *userName = @"UniqueAppName"; 
NSString *password = uuidString; 

[keychainItem setObject:userName forKey:(id)kSecAttrAccount]; 
[keychainItem setObject:password forKey:(id)kSecValueData]; 

[keychainItem release]; 

return uuidString; 

} 

+ (NSString *)userUUID 
{ 
    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"UniqueApp" accessGroup:nil]; 

//Accesing the v_data was the only way. For some reason there is a runtime issue if we try to access it though "kSecValueData" 
NSString *uuid = [keychainItem.keychainItemData objectForKey:@"v_Data"]; 

//Check if the app is installed for the first time on the device. If YES register the UUID in to the keychain. 
//Also check if it is a reinstall by accessing the previous keyChainItem with our Identifier. 
if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"firstRun"] intValue] == 0 && !(uuid.length > 0)) 
{ 
    uuid = [UIDevice_Additions registerUUIDWithKeyChain]; 

    NSLog(@"\n First Time Registered UUID is %@", uuid); 

    //after stuff done 
    [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:1] forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    [keychainItem release]; 
    return uuid; 
} 

[keychainItem release]; 
return uuid; 
} 

@end 

उत्तर

-3

आप UUID के मैक पते पर instread का उपयोग कर सकते

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

CFUUID के विपरीत, जो हर बार यादृच्छिक कुंजी उत्पन्न करता है, मैक पते में यूयूआईडी के समान सामाजिक/नैतिक मुद्दे होते हैं। मैक पते पर भरोसा करना असुरक्षित है जब ऐसा लगता है कि मैक पते को यूयूआईडी के समान ही धुंधला किया जाएगा। –

+0

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

+1

ठीक है, एंटरप्राइज़ बिल्ड के रूप में, आप बस उपयोग कर सकते हैं UUID, ** [[UIDevice currentDevice] uniqueIdentifier] ** – adali

3

Okie,

एक के लिए मुद्दे के साथ जूझ के बाद दिन, मैंने पाया कि यह क्या चल रहा था।

  • कीचेन के आश्रित प्रमाण पत्र
  • एक उद्यम के निर्माण के लिए एक अलग प्रमाण पत्र के साथ
  • इसलिए बनाया जाता है, जब कोड एक उद्यम के निर्माण से अपनी चाबी का उपयोग करने की कोशिश करता है आप नहीं मिलेगा होते हैं और इसलिए कोड इच्छा उत्पन्न करता है एक नया उत्पन्न करें।
  • समाधान आपके कीचेन को बनाना होगा ताकि यह विश्व स्तर पर पहुंच योग्य हो। आप KeyChainWrapper init विधि में accessGroup चर बदल सकते हैं।

शुभकामनाएँ!

+0

+1 और साझा करने के लिए धन्यवाद! – Till

संबंधित मुद्दे