Question

So I'm stumped on this one.

In Mac OS X there is an easy way to get the "Me" card (the owner of the Mac/account) from the built-in address book API.

Has anyone found a way to find out which contact (if it exists) belongs to the owner of the iPhone?

Was it helpful?

Solution

You could use the undocumented user default:

[[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"];

and then search the address book for the card with that phone number.

Keep in mind that since the User Default is undocumented, Apple could change at any time and you may have trouble getting into the App Store.

Another approach you could take, although it is much more fragile, is to look at the device name. If the user hasn't changed it from the default "User Name's iPhone" AND they are using their real name as an iPhone, you could grab the user name from that. Again, not the best solution by any means, but it does give you something else to try.

The generally accepted answer to this question is to file a Radar with Apple for this feature and to prompt users to choose their card.

OTHER TIPS

There is no such API in the iPhone SDK 2.2.1 and earlier. Please file a request for it at: http://bugreport.apple.com

Edit: [Obsolete answer]

There's no API for getting the "me" card because there is no "me" card. The iPhone's contacts app has no way of marking a card as being "me", and the API reflects this.

I came up with a partial solution to this

you can get the device name as follows

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

in English a device is originally called, for example, 'Joe Blogg's iPhone'

the break out the name

 NSRange t = [ownerName rangeOfString:@"’s"];
    if (t.location != NSNotFound) {
        ownerName = [ownerName substringToIndex:t.location];
    }

you can then take that name and search the contacts

CNContactStore *contactStore = [CNContactStore new];

 NSPredicate *usersNamePredicate = [CNContact predicateForContactsMatchingName:usersName];

    NSArray * keysToFetch = @[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNContactSocialProfilesKey, ];

 NSArray * matchingContacts = [contactStore unifiedContactsMatchingPredicate:usersNamePredicate keysToFetch:keysToFetch error:nil];

Of course other languages differ in the device name string e.g. 'iPhone Von Johann Schmidt' so more parsing needs to be done for other languages and it only works if the user hasn't changed the name of the device in iTunes to something like "Joes phone' but it gives you a starting point

well... it gives you an array of matching items :) So if there is more than one contact with that array you just have to use pot luck and go with the first one or work thru multiple cards and take what you need from each.

I did say its a partial solution and even though it won't work for all user cases you might find it works for many of your users and reduces a little friction

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top