Есть ли способ получить карту "Я" из API адресной книги iPhone? - PullRequest
19 голосов
/ 07 мая 2009

Так что я поставлен в тупик на этом.

В Mac OS X есть простой способ получить карту «Я» (владелец Mac / учетная запись) из встроенного API адресной книги.

Кто-нибудь нашел способ выяснить, какой контакт (если он существует) принадлежит владельцу iPhone?

Ответы [ 4 ]

7 голосов
/ 08 мая 2009

Вы можете использовать недокументированное пользовательское значение по умолчанию:

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

, а затем найдите в адресной книге карточку с этим номером телефона.

Имейте в виду, что, поскольку пользовательские настройки по умолчанию недокументированы, Apple может измениться в любое время, и у вас могут возникнуть проблемы с входом в App Store.

Другой подход, который вы можете использовать, хотя он и более хрупкий, - это посмотреть на имя устройства. Если пользователь не изменил его по умолчанию «iPhone с именем пользователя» и использует свое настоящее имя в качестве iPhone, вы можете получить имя пользователя из этого. Опять же, не самое лучшее решение, но оно дает вам еще кое-что попробовать.

Общепринятый ответ на этот вопрос - подать в Apple радар для этой функции и предложить пользователям выбрать свою карту.

4 голосов
/ 08 мая 2009

Редактировать: [устаревший ответ]

Нет API для получения карты "я", потому что нет карты "я". Приложение контактов iPhone не может пометить карту как «я», и API отражает это.

4 голосов
/ 08 мая 2009

В iPhone SDK 2.2.1 и более ранних версиях такого API нет. Пожалуйста, отправьте запрос на: http://bugreport.apple.com

0 голосов
/ 07 июня 2017

Я придумал частичное решение для этого

Вы можете получить имя устройства следующим образом

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

на английском языке устройство изначально называется, например, «iPhone Джо Блога»

название

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

затем вы можете взять это имя и искать контакты

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];

Конечно, другие языки отличаются строкой имени устройства, например, «iPhone Von Johann Schmidt», поэтому требуется больше разбора для других языков, и он работает, только если пользователь не изменил имя устройства в iTunes на что-то вроде «Joes phone», но дает вам отправную точку

хорошо ... он дает вам массив подходящих предметов :) Так что, если есть несколько контактов с этим массивом, вам просто нужно использовать удачу в поте и идти с первой или работать через несколько карт и брать то, что вы нужно от каждого.

Я сказал, что это частичное решение, и хотя оно не будет работать для всех пользовательских случаев, вы можете найти, что оно работает для многих ваших пользователей и уменьшает небольшое трение

...