Is there any way to get own phone number by standard APIs from iPhone SDK?

upvote
  flag
may be useful for others searching for a solution that does not use private api's how-does-squares-cardcase-app-do-this - use device name to capture users name just amend to capture phone number or other details as appropriate – Nik Burns

9 Answers 11

No, there's no legal and reliable way to do this.

If you find a way, it will be disabled in the future, as it has happened with every method before.

65 upvote
  flag
Not sure why this is getting so many down-votes -- it's as correct as it gets. – Nathan de Vries
2 upvote
  flag
See Nik Burn's answer: //allinonescript.com/a/8415162/292166 - there is (sort of) a way to do this! – JosephH
4 upvote
  flag
What's the best reason you have seen for Apple disallowing permission-based access to the user's phone number? Apple already allows permission-based access to contacts, photos, location, and the user's camera and microphone. Why not the phone number? There must be a good reason, but it's not immediately clear. It's unfortunate because prohibiting access causes devs to spend a lot of time and money on other ways to verify a user's phone number. – Crashalot

Update: capability appears to have been removed by Apple on or around iOS 4


Just to expand on an earlier answer, something like this does it for me:

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

Note: This retrieves the "Phone number" that was entered during the iPhone's iTunes activation and can be null or an incorrect value. It's NOT read from the SIM card.

At least that does in 2.1. There are a couple of other interesting keys in NSUserDefaults that may also not last. (This is in my app which uses a UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

and so on.

Not sure what, if anything, the others do.

1 upvote
  flag
There's been some recent press about the security concerns behind this ability: theregister.co.uk/2009/09/30/iphone_security – JeffH
upvote
  flag
Any updates on the press and Apple's resolution? – Bryan
92 upvote
  flag
Apple just rejected my app for using this. img.ly/dbZ – Mugunth
10 upvote
  flag
Don't do it. Ask the user for the number via keypad or contact chooser. You should make any information gathering as explicit as possible to the user. It may not be the most convenient, but it's very easy to save the number, so you only have to ask for it once. – David Kanarek
3 upvote
  flag
A solution that gets apps rejected is not a solution. – averydev
up vote 284 down vote accepted

At the risk of getting negative marks, I want to suggest that the highest ranking solution (currently the first response) violates the latest SDK Agreement as of Nov 5, 2009. Our application was just rejected for using it. Here's the response from Apple:

"For security reasons, iPhone OS restricts an application (including its preferences and data) to a unique location in the file system. This restriction is part of the security feature known as the application's "sandbox." The sandbox is a set of fine-grained controls limiting an application's access to files, preferences, network resources, hardware, and so on."

The device's phone number is not available within your application's container. You will need to revise your application to read only within your directory container and resubmit your binary to iTunes Connect in order for your application to be reconsidered for the App Store.

This was a real disappointment since we wanted to spare the user having to enter their own phone number.

66 upvote
  flag
How does Snapchat do it? – rgbrgb
1 upvote
  flag
@Dylan : When was your app rejected.Perhaps the guidelines are revised? Please provide useful links to documentation. However, I appreciate your answer. – Abhishek Bedi
1 upvote
  flag
Can I get apple.developer documentation link where this mentioned ? – Ganesh AB - Android
upvote
  flag
Can any one provide me a link of apple.developer documentation link? where this mentioned ? – Saumil Shah
upvote
  flag
@Dylan Any documentation Link. – Sudheesh
2 upvote
  flag
I have never found any documentation on this, but would love to see it. It's one of those areas where Apple has remained opaque for me. I have not tried to submit an application since this. – Dylan
1 upvote
  flag
@rgbrgb I don't use Snapchat, can you please explain their experience that is so mystifying? – Full Decent
upvote
  flag
@rgbrgb Same here, could really use that knowledge – madprogramer

As you probably all ready know if you use the following line of code, your app will be rejected by Apple

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

here is a reference

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

you can use the following information instead

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

and so on

@property(nonatomic,readonly,retain) NSString    *name;              // e.g. "My iPhone"
@property(nonatomic,readonly,retain) NSString    *model;             // e.g. @"iPhone", @"iPod Touch"
@property(nonatomic,readonly,retain) NSString    *localizedModel;    // localized version of model
@property(nonatomic,readonly,retain) NSString    *systemName;        // e.g. @"iPhone OS"
@property(nonatomic,readonly,retain) NSString    *systemVersion;     // e.g. @"2.0"
@property(nonatomic,readonly) UIDeviceOrientation orientation;       // return current device orientation
@property(nonatomic,readonly,retain) NSString    *uniqueIdentifier;  // a string unique to each device based on various hardware info.

Hope this helps!

9 upvote
  flag
uniqueIdentifier is also deprecated in iOS5. Use MAC address instead. – Raptor
15 upvote
  flag
MAC address is deprecated in iOS 7. Use [UIDevice identifierForVendor] instead. – jab
9 upvote
  flag
iOS 7 is deprecated. Use iOS 10 instead (sorry, I could not stop myself). – JustAMartin

Using Private API you can get user phone number on the following way:

extern NSString* CTSettingCopyMyPhoneNumber();


+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();

return phone;
}

Also include CoreTelephony.framework to your project.

upvote
  flag
After reading other answers in this forum, i was thinking it is not possible but you have done perfect job – Mehul Thakkar
upvote
  flag
this not work on iOS7 – user501836
1 upvote
  flag
On iOS 7 it's protected by the entitlement //allinonescript.com/questions/19504478/… – creker
upvote
  flag
phone is nil when I try this – c0d3Junk13

To get you phone number you can read a plist file. It will not work on non-jailbroken iDevices:

NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist";
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter];
    NSString *PhoneNumber = [dict valueForKey:@"PhoneNumber"];
    NSLog([NSString stringWithFormat:@"Phone number: %@",PhoneNumber]);

I don't know if Apple allow this but it works on iPhones.

2 upvote
  flag
This doesn't work on iOS 7. – respectTheCode
upvote
  flag
This doesn't work on iOS 10 and above. – Sankalap Yaduraj Singh

No official API to do it. Using private API you can use following method:

-(NSString*) getMyNumber {
    NSLog(@"Open CoreTelephony");
    void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");
    NSString* (*pCTSettingCopyMyPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");
    NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");

    if (pCTSettingCopyMyPhoneNumber == nil) {
        NSLog(@"pCTSettingCopyMyPhoneNumber is nil");
        return nil;
    }
    NSString* ownPhoneNumber = pCTSettingCopyMyPhoneNumber();
    dlclose(lib);
    return ownPhoneNumber;
}

It works on iOS 6 without JB and special signing.

As mentioned creker on iOS 7 with JB you need to use entitlements to make it working.

How to do it with entitlements you can find here: iOS 7: How to get own number via private API?

You can ask the user m.phone and verficate it using sms. Legally, no method for knows it.

You can not get your own phone number due to some security reason but you can fetch your number. Save it to your contact list and then you can fetch your number programmatically.

Not the answer you're looking for? Browse other questions tagged or ask your own question.