我想獲得應該支持所有iOS版本的唯一標識符......任何人都可以幫助我解決這個問題。正如你所知道的那樣,蘋果已被廢棄UDID方法,所以有可能使用wifi-mac地址來生成唯一標識。但蘋果將刪除iOS7版本中的wifi mac地址。因此,我的要求是生成一個新的唯一代碼,應在所有iOS版本中運行。提前感謝..如何生成適用於所有iOS版本的唯一標識符?
注意:一旦用戶重新啓動設備或重新安裝應用程序,請不要更改UDID。
我想獲得應該支持所有iOS版本的唯一標識符......任何人都可以幫助我解決這個問題。正如你所知道的那樣,蘋果已被廢棄UDID方法,所以有可能使用wifi-mac地址來生成唯一標識。但蘋果將刪除iOS7版本中的wifi mac地址。因此,我的要求是生成一個新的唯一代碼,應在所有iOS版本中運行。提前感謝..如何生成適用於所有iOS版本的唯一標識符?
注意:一旦用戶重新啓動設備或重新安裝應用程序,請不要更改UDID。
我正在更新我的應用程序,該應用程序僅基於支持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;
}
謝謝你。請注意SFHFKeychainUtils的創建者說它應該被視爲不推薦使用,而應該使用他的STUtils。另外,還應該在上面的'GetDeviceID'方法中添加'CFRelease(cfuuid);'以防止內存泄漏。 – ghr
@ghr。是的,他說這應該被視爲棄用,但我正在使用它。在很多應用程序中沒有問題。第二謝謝,因爲我以某種方式跳過了。 –
@ NSQuamber.java,這個生成的id在卸載應用程序後會被更改嗎?我有一個要求,說明該ID必須是唯一的,並將被髮送到服務器。即使用戶卸載/重新安裝應用程序,我應該有相同的ID。這可能與您的解決方案?另外,它還適用於iOS 8.4嗎? – shamaleyte
我現在無法訪問代碼(如果您仍然需要,可以在幾個小時後發佈),但我所做的是在助手類中創建靜態方法'deviceIdentifier'。
方法確實爲當前IOS版本基本檢查,返回UDID如果低於6.0和UNIQUEIDENTIFIER否則
讓我知道,如果你想爲代碼,當我可以我會後它。 。如果我記得正確的話,它只有10-15行左右,但是會產生很大的差異,因此無論您需要設備ID,只需致電'[myHelper deviceIdentifier]'即可,無需擔心他們使用的是哪個iOS版本。
謝謝你這麼多的快捷的信息。至於你知道,蘋果棄用的UDID的方法,所以我實現生成使用MAC地址的唯一標識符。但是蘋果會刪除iOS7版本中的wifi mac地址。所以我需要生成一個新的獨特代碼,這個代碼應該適用於包括iOS7在內的所有版本。請分享您的邏輯,這樣可以幫助我很多。謝謝你.. – Ganesh
嗨Gahesh - 只是雙重檢查我的代碼,想起我把預identifierForVendor碼出有完全只是爲了確保遵守蘋果的指導方針,我認爲他們是非常嚴格的關於新的應用程序使用UDID甚至只是人支持iiOS –
所以舊版本我只是用identifierForVendor我的理解不會滿足您的要求,它必須即使在應用程序卸載 –
現在將設備標識符更改爲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版本。
它將在卸載應用程序後發生變化,並重新安裝.... !!! –
是的,一旦重新安裝應用程序,UDID就會發生變化。這個邏輯並不完全滿足我的要求。任何方式感謝您的邏輯。 – Ganesh
有他們廢除了這些類型的唯一ID的原因。創建和存儲自己的UUID('CFUUIDCreate'),或使用廠商識別 –