2012-04-25 30 views
5

Như bạn đã biết, Apple gần đây đã ngừng sử dụng UDID. Vì vậy, giải pháp của tôi để này làVấn đề với việc xây dựng doanh nghiệp và sử dụng UUID

  1. Tạo CFUUID
  2. Lưu nó vào móc chìa khóa
  3. Tái truy cập mục keychain có sau.

Điều này đã hoạt động tốt. Nhưng, vì một lý do nào đó chúng tôi mới thấy rằng với việc cài đặt một doanh nghiệp xây dựng, chúng tôi đang nhận được một UUID khác nhau (Được cho là được lưu trữ trên keychain với khóa truy cập duy nhất của chúng tôi).

Có ai gặp phải tình huống như vậy không? Đây là đoạn mã để tạo ra các UUID và lưu trữ nó vào keychain ..

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

Trả lời

-3

bạn có thể sử dụng MAC Địa Chỉ instread của UUID

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

Không giống như CFUUID, tạo khóa ngẫu nhiên mỗi khi được gọi, địa chỉ MAC có cùng vấn đề xã hội/đạo đức như UUID. Không an toàn khi dựa vào địa chỉ mac có sẵn khi có vẻ như địa chỉ MAC cũng sẽ bị ngắt cùng kiểu với UUID. –

+0

đó là một Doanh nghiệp Xây dựng, và ông muốn giữ UID cùng mọi lúc, địa chỉ MAC sẽ không thay đổi như UUID chúng tôi sử dụng trước đây (Apple không cho phép sử dụng nó) – adali

+1

ok, như là một Doanh nghiệp Xây dựng, bạn chỉ có thể sử dụng UUID, ** [[UIDevice currentDevice] uniqueIdentifier] ** – adali

3

Okie,

Sau khi chiến đấu với các vấn đề đối với một ngày, tôi tìm thấy những gì đã gây ra điều này.

  • Keychain của là giấy chứng nhận phụ thuộc
  • Một xây dựng doanh nghiệp được tạo ra với một giấy chứng nhận khác nhau
  • Do đó, khi mã cố gắng truy cập chìa khóa của bạn từ một xây dựng doanh nghiệp bạn sẽ không tìm thấy nó và do đó mã tạo ra ý chí tạo một cái mới.
  • Giải pháp sẽ là tạo Keychain của bạn để có thể truy cập toàn cầu. Bạn có thể thay đổi biến accessGroup trong phương thức init KeyChainWrapper.

Chúc may mắn!

+0

+1 và cảm ơn bạn đã chia sẻ! – Till

Các vấn đề liên quan