Можно ли программно связать записи адресной книги?

У ABPerson есть API для получения всех «связанных» записей о людях.

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (
   ABRecordRef person
);

Что определяет возвращаемый результат этого вызова (т. е. как устанавливаются ссылки)? Моя цель — создать новую запись адресной книги (в коде), связанную с существующей записью.


person Swany    schedule 27.01.2014    source источник
comment
Нет общедоступного API для установки собственных ссылок. Что вы пытаетесь достичь? Мне удалось добавить запись с тем же именем и фамилией, что и у существующей записи, и структура адресной книги автоматически связала мою новую запись с существующей записью, но, насколько мне известно, это нигде не задокументировано, поэтому я не уверен, насколько он надежен.   -  person alivingston    schedule 15.02.2014
comment
Я пытаюсь надежно записать новые данные для человека, выбранного из ABPeoplePickerNavigationController. Иногда ABRecordRef возвращается после того, как пользователь выбирает кого-то, недоступного для записи (вызовы ABRecordSetValue() завершаются с ошибкой, не могут быть завершены...). Недоступные для записи записи кажутся связанными записями, содержащими профили социальных сетей (например, Facebook). Поэтому я подумал, что создам новую запись с нужными мне данными и свяжу ее с выбранным человеком. Логика заключается в том, что я всегда могу написать вновь созданную запись. Я подозреваю, что вы говорите правду. Я надеюсь, что Apple обновит этот грубый старый API.   -  person Swany    schedule 16.02.2014


Ответы (1)


Я добился этого, пытаясь записать информацию в рассматриваемый ABRecordRef, а также записи, связанные с ним. Если запись во все связанные записи не дает разрешения (в случае, если единственной записью является, например, контакт Facebook), я создал новую запись с тем же именем и фамилией, что и существующие записи, и адресная книга связала их. Это поведение нигде не задокументировано, но без общедоступного метода для связывания контактов это может быть единственный вариант.

person alivingston    schedule 16.02.2014
comment
Если кто-либо другой не предоставит дополнительную информацию об обратном, мы будем считать, что alivingston прав и что связь между двумя или более ABRecords устанавливается автоматически при наличии одинакового имени и фамилии. Если кто-то может пролить больше света на пределы этого, пожалуйста, поделитесь. Мне любопытно узнать механизм, по которому это происходит. Я надеюсь, что вызов ABPersonCopyArrayOfAllLinkedPeople() не выполняет динамическое сравнение строк между несколькими полями всех записей в адресной книге. - person Swany; 18.02.2014
comment
Это определенно не возвращает связанных людей динамически. Я потратил довольно много времени, пытаясь покопаться в адресной книге, чтобы обнаружить различные крайние случаи. Вы можете углубиться в контакт адресной книги, чтобы просмотреть связанные записи — если вы измените имя связанной записи, они останутся связанными с соответствующими записями. Единственный способ разъединить их — перевести приложение «Контакты» в режим редактирования и попросить его разъединить их. Итак, в какой-то момент Apple устанавливает связь между ABRecords, и кажется, что связь не удаляется, если только пользователь не сделал это явно. - person alivingston; 18.02.2014
comment
Начиная с iOS 8.3 я не могу воспроизвести эту функцию. Кажется, он совсем ушел :( - person Tim; 21.04.2015
comment
@Tim Я не копался в этом снова с тех пор, как была выпущена iOS 8, и многое из поведения было недокументировано, поэтому неудивительно, если что-то за кулисами было изменено, что нарушило некоторые из поведения, которые мы видели, просто копаясь. . :( - person alivingston; 21.04.2015