Итак, я в тупике.
В Mac OS X есть простой способ получить карту "Me" (владельца Mac/account) из встроенного API адресной книги.
Кто-нибудь нашел способ узнать, какой контакт (если он существует) принадлежит владельцу iPhone?
Итак, я в тупике.
В Mac OS X есть простой способ получить карту "Me" (владельца Mac/account) из встроенного API адресной книги.
Кто-нибудь нашел способ узнать, какой контакт (если он существует) принадлежит владельцу iPhone?
Вы можете использовать недокументированный пользователь по умолчанию:
[[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"];
а затем выполните поиск в адресной книге для карты с этим номером телефона.
Имейте в виду, что, поскольку пользовательское значение по умолчанию недокументировано, Apple может измениться в любое время, и у вас могут возникнуть проблемы с доступом в App Store.
Другой подход, который вы могли бы предпринять, хотя он гораздо более хрупкий, - это посмотреть на имя устройства. Если пользователь не изменил его с по умолчанию "Имя пользователя iPhone" И они используют свое настоящее имя в качестве iPhone, вы можете получить от него имя пользователя. Опять же, не лучшее решение любым способом, но оно дает вам еще кое-что, чтобы попробовать.
Общепринятый ответ на этот вопрос заключается в том, чтобы предоставить Radar с Apple для этой функции и предложить пользователям выбрать свою карту.
В iPhone SDK 2.2.1 и ранее такого API нет. Пожалуйста, напишите запрос на него: http://bugreport.apple.com
Изменить: [Устаревший ответ]
Нет API для получения карты "я" , потому что нет "я" карты. Приложение для контактов iPhone не имеет способа маркировать карту как "я" , и API отражает это.
Я придумал частичное решение этого
вы можете получить имя устройства следующим образом
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", но он дает вам начальную точку
хорошо... он дает вам массив совпадающих элементов:) Итак, если есть более одного контакта с этим массивом, вам просто нужно использовать удачу в банке и пойти с первой или работать через несколько карт и взять то, что вы нужно от каждого.
Я сказал, что это частичное решение, и даже если оно не будет работать для всех случаев пользователей, вы можете обнаружить, что оно работает для многих ваших пользователей и уменьшает небольшое трение.