2013-07-16 24 views
11

我想獲得應該支持所有iOS版本的唯一標識符......任何人都可以幫助我解決這個問題。正如你所知道的那樣,蘋果已被廢棄UDID方法,所以有可能使用wifi-mac地址來生成唯一標識。但蘋果將刪除iOS7版本中的wifi mac地址。因此,我的要求是生成一個新的唯一代碼,應在所有iOS版本中運行。提前感謝..如何生成適用於所有iOS版本的唯一標識符?

注意:一旦用戶重新啓動設備或重新安裝應用程序,請不要更改UDID。

+0

有他們廢除了這些類型的唯一ID的原因。創建和存儲自己的UUID('CFUUIDCreate'),或使用廠商識別 –

回答

38

我正在更新我的應用程序,該應用程序僅基於支持iOS 4.3及更高版本的唯一標識符所以,

1)我無法使用[UIDevice currentDevice].uniqueIdentifier;因爲它不再

2)我不能用[UIDevice currentDevice].identifierForVendor.UUIDString,因爲它的iOS 6.0及更高版本只和無法使用較低的iOS版本。

3)的MAC地址是不是一種選擇,因爲它不是在iOS的-7

4)OpenUDID允許爲deprecated前一段時間也有問題與iOS-6。

5)廣告標識也不能用於iOS-5及以下

最後,這是我做了什麼

A)中加入SFHFKeychainUtils所產生的項目

B)CFUUID關鍵字符串

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); 
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 

c)將它保存到Key Chain Utils 否則就會產生一個新的獨特的每個時間

終極密碼

+ (NSString *)GetDeviceID { 
    NSString *udidString; 
    udidString = [self objectForKey:@"deviceID"]; 
    if(!udidString) 
    { 
    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault); 
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 
    CFRelease(cfuuid); 
     [self setObject:udidString forKey:@"deviceID"]; 
    } 
    return udidString; 
} 

+(void) setObject:(NSString*) object forKey:(NSString*) key 
{ 
    NSString *objectString = object; 
    NSError *error = nil; 
    [SFHFKeychainUtils storeUsername:key 
         andPassword:objectString 
         forServiceName:@"LIB" 
         updateExisting:YES 
           error:&error]; 

    if(error) 
     NSLog(@"%@", [error localizedDescription]); 
} 

+(NSString*) objectForKey:(NSString*) key 
{ 
    NSError *error = nil; 
    NSString *object = [SFHFKeychainUtils getPasswordForUsername:key 
                andServiceName:@"LIB" 
                  error:&error]; 
    if(error) 
     NSLog(@"%@", [error localizedDescription]); 

    return object; 
} 

enter image description here

For further Details

+1

謝謝你。請注意SFHFKeychainUtils的創建者說它應該被視爲不推薦使用,而應該使用他的STUtils。另外,還應該在上面的'GetDeviceID'方法中添加'CFRelease(cfuuid);'以防止內存泄漏。 – ghr

+0

@ghr。是的,他說這應該被視爲棄用,但我正在使用它。在很多應用程序中沒有問題。第二謝謝,因爲我以某種方式跳過了。 –

+0

@ NSQuamber.java,這個生成的id在卸載應用程序後會被更改嗎?我有一個要求,說明該ID必須是唯一的,並將被髮送到服務器。即使用戶卸載/重新安裝應用程序,我應該有相同的ID。這可能與您的解決方案?另外,它還適用於iOS 8.4嗎? – shamaleyte

-3

我現在無法訪問代碼(如果您仍然需要,可以在幾個小時後發佈),但我所做的是在助手類中創建靜態方法'deviceIdentifier'。

方法確實爲當前IOS版本基本檢查,返回UDID如果低於6.0和UNIQUEIDENTIFIER否則

讓我知道,如果你想爲代碼,當我可以我會後它。 。如果我記得正確的話,它只有10-15行左右,但是會產生很大的差異,因此無論您需要設備ID,只需致電'[myHelper deviceIdentifier]'即可,無需擔心他們使用的是哪個iOS版本。

+0

謝謝你這麼多的快捷的信息。至於你知道,蘋果棄用的UDID的方法,所以我實現生成使用MAC地址的唯一標識符。但是蘋果會刪除iOS7版本中的wifi mac地址。所以我需要生成一個新的獨特代碼,這個代碼應該適用於包括iOS7在內的所有版本。請分享您的邏輯,這樣可以幫助我很多。謝謝你.. – Ganesh

+0

嗨Gahesh - 只是雙重檢查我的代碼,想起我把預identifierForVendor碼出有完全只是爲了確保遵守蘋果的指導方針,我認爲他們是非常嚴格的關於新的應用程序使用UDID甚至只是人支持iiOS –

+0

所以舊版本我只是用identifierForVendor我的理解不會滿足您的要求,它必須即使在應用程序卸載 –

1

現在將設備標識符更改爲UUID。您可以通過以下代碼獲取UUID:

- (NSString *)getUUID 
{ 
    NSString *UUID = [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueID"]; 
    if (!UUID) { 
     CFUUIDRef theUUID = CFUUIDCreate(NULL); 
     CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
     CFRelease(theUUID); 
     UUID = [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""]; 
     [[NSUserDefaults standardUserDefaults] setValue:UUID forKey:@"uniqueID"]; 
    } 
    return UUID; 
} 

它適用於所有iOS版本。

+1

它將在卸載應用程序後發生變化,並重新安裝.... !!! –

+0

是的,一旦重新安裝應用程序,UDID就會發生變化。這個邏輯並不完全滿足我的要求。任何方式感謝您的邏輯。 – Ganesh