2012-04-25 15 views
5

Wie Sie wissen, hat Apple kürzlich die Verwendung von UDID eingestellt. Also meine Lösung dieses Problems warProblem mit Enterprise-Build- und UUID-Verwendung

  1. generieren CFUUID
  2. speichern es
  3. Re-Zugang der Schlüsselbund Artikel dort nach dem Schlüsselbund.

Das hat gut funktioniert. Aber aus irgendeinem Grund haben wir kürzlich gesehen, dass wir mit der Installation eines Enterprise-Builds eine andere UUID erhalten (die mit unserem einzigartigen Zugriffsschlüssel auf dem Schlüsselbund gespeichert werden sollte).

Ist jemand auf eine solche Situation gestoßen? Hier ist der Code die UUID und speichern Sie es auf Schlüsselbund zu schaffen ..

+ (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 

Antwort

-3

können Sie MAC Addres instread von UUID verwenden

- (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

Im Gegensatz zu CFUUID, die bei jedem Aufruf einen zufälligen Schlüssel generiert, haben MAC-Adressen die gleichen sozialen/ethischen Probleme wie UUIDs. Es ist unsicher, sich darauf zu verlassen, dass die MAC-Adresse verfügbar ist, wenn MAC-Adressen auf die gleiche Weise wie UUIDs zu entfernen scheinen. –

+0

es ist ein Enterprise Build, und er möchte die UID immer gleich behalten, die MAC-Adresse wird sich nicht ändern wie UUID, die wir vorher verwendet haben (Apple erlaubt es nicht) – adali

+1

ok, als ein Enterprise Build, den Sie einfach verwenden können UUID, ** [[UIDevice currentDevice] uniqueIdentifier] ** – adali

3

Okie,

Nach ein mit der Frage kämpfen Heute habe ich herausgefunden, was das ausgelöst hat.

  • Keychain des sind Zertifikat abhängig
  • Ein Unternehmen bauen mit einem anderen Zertifikat
  • Daher wird erstellt, wenn der Code Ihren Schlüssel von einem Unternehmen bauen zuzugreifen versucht, Sie werden es nicht finden und somit der Code generiert Wille erzeuge ein neues.
  • Lösung wäre, Ihren Schlüsselbund zu erstellen, so dass es global zugänglich ist. Sie können die accessGroup-Variable in der KeyChainWrapper-Methode init ändern.

Viel Glück!

+0

+1 und danke für das Teilen! – Till