Take the 2-minute tour ×

For an iPhone app that submits images to a server I need somehow to tie all the images from a particular phone together. With every submit I'd like to send some unique phone id. Looked at

  [[UIDevice mainDevice] uniqueIdentifier]
and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

but getting errors in the simulator.

Is there an Apple sanctioned way of doing this?

share|improve this question
Can you access the serial number? –  Darryl Hein Oct 22 '08 at 21:26
was getting an error with <pre>[[UIDevice mainDevice] uniqueIdentifier]</pre> but <pre> [[UIDevice currentDevice] uniqueIdentifier]</pre> seems to work. –  Martin Redmond Oct 22 '08 at 22:12
See stackoverflow.com/questions/193182/… for why getting SBFormattedPhoneNumber no longer works. –  Archie Jul 20 '10 at 14:50
add comment

12 Answers

up vote 40 down vote accepted

What errors are you getting? [[UIDevice currentDevice] uniqueIdentifier] (edited to fix API, thanks Martin!) is the officially recommended way of doing this.

share|improve this answer
*** +[UIDevice mainDevice]: unrecognized: however tried [UIDevice currentDevice] and it works in the sim –  Martin Redmond Oct 22 '08 at 22:11
sorry, you're right. –  Ben Gottlieb Oct 22 '08 at 23:11
[[UIDevice currentDevice] uniqueIdentifier] is now deprecated as of iOS 5.0 - don't use it. I've read that this GitHub repo is producing a unique ID with an open source library: github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5 –  Thomson Comer Dec 13 '11 at 22:18
add comment

You can also use CFUUID to generate a UUID. Here's some code:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
share|improve this answer
Sounds cool. Will theUUID be the same on every invocation? –  Martin Redmond Oct 23 '08 at 3:32
No, different every time, so usually you'd generate it on first launch and then save it to your preferences using NSUserDefaults. –  Jason Harris Oct 23 '08 at 5:17
The downside to this is that if the app is deleted and reinstalled or if the device is restored from backup, you'll lose the saved UUID and things won't be recognized as from the same device. –  Jeff Kelley Nov 9 '09 at 17:24
I had to type theUUID as CFUUIDRef, not CFUUID. And don't forget to add CoreFoundation to your project, and import <CoreFoundation/CoreFoundation.h> –  Glenn Barnett Jul 6 '10 at 4:32
add comment

By far the easiest and most appropriate way to obtain a unique identifier is to use the mechanisms Apple explicitly provides for obtaining one - [[UIDevice currentDevice] uniqueIdentifier]. You can not guarantee that the phone number will be unique to the device or that the device will even have a phone number. Beyond that, doing so is a horrible idea as it is a definite invasion of the user's privacy. Even the uniqueidentifier should be hashed if you are going to store it in any way.

share|improve this answer
+1 for calling out the privacy concerns. So many just ignore this aspect. –  jmanning2k Jul 24 '09 at 15:02
What is a good way to store a HASHED value of a string? –  Donna Jan 27 '10 at 5:42
As pointed out in other answers, this is deprecated as of iOS 5.0 –  Nathan Garabedian Sep 22 '12 at 23:48
add comment

In order to Persist the Unique Identifier you create between installations, you could use the Keychain Made easy with SSKeychain: Simply set your UUID as follows:

        [SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];

and then call it again anytime you need it:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];

Note: The services and accounts must match exactly.

Then, if the App is deleted and reinstalled, the UUID will persist with reinstallation.

If you then want to share this UUID across devices, set up your app to use iCloud. You can then store the UUID in NSUserDefaults, sync with KeyValueStore, and then set the UUID in the new devices keychain with the code above.

This answer would get extremely long if I typed code for all the above, but plenty of sample code around here to figure it all out.

share|improve this answer
add comment

Don't forget that in iOS 5 uniqueIdentifier will be deprecated you should use CFUUID instead of that

share|improve this answer
add comment

Interestingly, Apple has since deprecated the uniqueIdentifier in iOS 5 (as gN0Me mentioned). Here's the relevant TechCrunch article: http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/

Apple suggests that you no longer uniquely identify the device but instead identify the user. In most cases, this is excellent advice though there are some situations which still require a globally unique device ID. These scenarios are quite common in advertising. Hence, I wrote an extremely simple drop-in library which replicates the existing behavior exactly.

In a shameless plug of self promotion, I'll link it here in the hope that someone finds it useful. Also, I welcome all and any feedback/criticism: http://www.binpress.com/app/myid/591

Nevertheless, in your particular situation I would advise skipping the globally unique ID functionality my library provides as it's a bit overkill for your situation. Instead, I would generate a simple CFUUID and store it in NSUserDefaults. This ID would be specific to your application but would allow you to group all the photos for that "app install" in your database.

In other words, by deprecating the uniqueIdentifier method, Apple is suggesting that you don't identify per device but instead per app install. Unless you are operating under specific conditions, chances are the per app ID fits your product better anyway.

share|improve this answer
Your solution is not available. –  Stas Apr 30 '13 at 6:24
add comment

This is an interesting problem that I am also looking into solving. Here is a scenario that I would like to address.

What happens when you sell your phone to another person... that Device ID will then belong to somebody else, so even if the app is removed from the iPhone, it could be re-added and all that data would then be re-associated to a new user... this is bad.

Using the Phone number with the Device ID MD5 would be a great solution. Another we came up with is having a SQL Lite DB with some token Hashed with the Device ID. Then when the app is removed the DB is killed and all the data is disassociated. I think that might be too brittle.

Any other ideas?

Rob Ellis (PhoneGap/Nitobi)

share|improve this answer
Or the phone develops a problem and is replaced under warranty - same user, new phone. The generated UUID stored in NSUserDefaults solution would win here, since prefs are synced back. –  jmanning2k Jul 24 '09 at 15:05
add comment

Haven't done iphone work, but how about taking a hash of something unique to the phone ... oh, say the phone number?

Getting iphone number

share|improve this answer
That frequently works but will return incorrect information in a significant number of cases. It gets a phone number, but it's not guaranteed to be the current phone's number, a valid phone number, or even a unique number. –  Tom Harrington Jan 26 '09 at 23:11
how often does an iPod Touch have a phone number? –  user23743 Jul 24 '09 at 14:57
Phone number is definitely not unique. It is also something that is known by many people, so is a bad choice for securing any sort of data behind a webservice. Further - what happens when you change phone numbers? –  npellow May 21 '11 at 8:03
add comment


NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator!
NSLog(@"Formatted phone number [%@]", phoneNumber);

I [recently] ran this code as-is on OS 2.2.1 [and OS 3.0].


When run on the simulator, the value [returned] is a null string, so it only works on an actual iPhone device.

I did not test it on an iPod Touch.




If you didn’t enter the iPhone’s number in iTunes at device activation, or perhaps (as in my case) if the default value wasn’t the iPhone’s number and you clicked OK anyway, such that iTunes doesn’t list the phone number when your iPhone is plugged in, this code will return a null string.

[Above is an edited concatenation of comments I recently posted to another article on this topic at http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

share|improve this answer
That's not a good idea regarding data-security ... –  DAS Aug 13 '12 at 10:34
add comment

Here is some more information on a way to get it from iTunes which may be useful for testing purposes.

share|improve this answer
add comment

I had success with such code:

- (NSString *)stringUniqueID {
	NSString *  result;
	CFUUIDRef   uuid;
	CFStringRef uuidStr;
	uuid = CFUUIDCreate(NULL);
	assert(uuid != NULL);
	uuidStr = CFUUIDCreateString(NULL, uuid);
	assert(uuidStr != NULL);
	result = [NSString stringWithFormat:@"%@", uuidStr];
	assert(result != nil);
	NSLog(@"UNIQUE ID %@", result);
	return result;
share|improve this answer
add comment

You can use MAC address as a unique id. Following link will help you

How can I programmatically get the MAC address of an iphone

share|improve this answer
add comment

Your Answer


