Подтвердить что ты не робот

Есть ли способ получить карту "Я" из API адресной книги iPhone?

Итак, я в тупике.

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

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

4b9b3361

Ответ 1

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

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

а затем выполните поиск в адресной книге для карты с этим номером телефона.

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

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

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

Ответ 2

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

Ответ 3

Изменить: [Устаревший ответ]

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

Ответ 4

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

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

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

на английском языке устройство первоначально называется, например, "Joe Blogg 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", но он дает вам начальную точку

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

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