Нахождение и контроль идентификационных данных

Один из наиболее популярных способов использования Identity Services API должен искать идентификационные данные, сохраненные в полномочиях идентификационных данных. Вы, возможно, также должны наблюдать изменения в пользователях и группах, происходящих вне объема Вашего приложения. Например, если другое приложение удаляет пользователя из группы, Ваше приложение использует, Вы хотите быть уведомленными относительно этого изменения. В Идентификационных данных Core Services API, CSIdentityQuery класс обеспечивает синхронный и асинхронный доступ, чтобы найти и контролировать идентификационные данные от базы данных полномочий идентификационных данных. В платформе Сотрудничества эти методы являются частью CBIdentity класс.

Эта глава объясняет, как искать идентификационные данные с помощью обоих CSIdentityQuery объекты и CBIdentity объекты.

Найдите идентификационные данные

Можно найти, что идентификационные данные с помощью или Objective C базировали платформу Сотрудничества или Идентификационные данные Core Services API.

Используя платформу сотрудничества

Для нахождения пользователя или группы с платформой Сотрудничества используйте один из методов фабрики классов CBIdentity. Существует три метода, позволяющие Вам искать на основе различных свойств идентификационных данных:

  • Если Вы хотите искать полными именами, краткие названия или псевдонимы, используют identityWithName:authority: метод.

  • Если Вы хотите искать UUID, используйте identityWithUUIDString:authority: метод.

  • Если Вы хотите искать использование персистентной ссылки, используйте identityWithPersistentReference: метод. (Для получения дополнительной информации о персистентных ссылках, посмотрите Загрузку ACL).

Для завершения поиска передайте критерий поиска и объект полномочий идентификационных данных любому identityWithName:authority: и identityWithUUIDString:authority: методы. Существует много методов фабрики классов в CBIdentityAuthority это позволяет Вам создавать полномочия идентификационных данных, основанные на объектах на полномочиях идентификационных данных, которые Вы хотите искать. Перечисление 3-1 показывает, как искать все идентификационные данные по имени «Давид Ортис» в локальных полномочиях идентификационных данных.

Перечисление 3-1  , Находящее идентификационные данные в Objective C

CBIdentityAuthority *localAuthority =
    [CBIdentityAuthority localIdentityAuthority];
CBIdentity *user =
    [CBIdentity identityWithName:@"David Ortiz" authority:localAuthority];

Можно также искать в частности пользовательские идентификационные данные или идентификационные данные группы при помощи CBUserIdentity и CBGroupIdentity классы, соответственно. По умолчанию, CBIdentity методы фабрики классов ищут пользователя идентификационные данные сначала, и если ни один не расположен тогда, это ищет идентификационные данные группы.

Используя базовые идентификационные данные служб API

Для нахождения пользователя или группы с Идентификационными данными Core Services API, необходимо создать a CSIdentityQuery объект. A CSIdentityQuery объект содержит методы для поиска базы данных идентификационных данных. Важно использовать надлежащий метод для создания запроса идентификационных данных, основанного на объектах о том, как Вы хотите искать базу данных. Следующие методы предоставлены для Вас:

  • Если Вы хотите искать полными именами, краткие названия или псевдонимы, используют CSIdentityQueryCreateForName метод.

  • Если Вы хотите искать UUID, используйте CSIdentityQueryCreateForUUID метод.

  • Если Вы хотите искать POSIX ID, используйте CSIdentityQueryCreateForPosixID метод.

  • Если Вы хотите искать справочными данными (сгенерированный CSIdentityCreatePersistentReference метод), используйте CSIdentityQueryCreateForPersistentReference метод.

  • Если Вы хотите искать идентификационные данные текущего пользователя, используйте CSIdentityQueryCreateForCurrentUser метод.

Существует два способа выполнить поиск, синхронно и асинхронно. Это настоятельно рекомендовано это, Вы выполняете любой процесс, который мог блокировать в результате сетевых задержек асинхронно.

Поисковые идентификационные данные синхронно

Выполнять a CSIdentityQuery ищите синхронно, вызовите метод CSIdentityQueryExecute на Ваших идентификационных данных запрашивают объект. Метод возвращается только, когда он завершил поиск. Если запрос выполняется успешно, CSIdentityQueryExecute возвраты TRUE; иначе, это возвращается FALSE. Принятие запроса было успешно, работайте CSIdentityQueryCopyResults метод для возврата массива объектов идентификационных данных. Когда Вы закончите получать идентификационные данные, удостоверьтесь, что выпустили CSIdentityQuery объект. Перечисление 3-2 показывает пример этого.

Перечисление 3-2  , Находящее идентификационные данные синхронно

CSIdentityQueryRef query;
CFErrorRef error;
CFArrayRef identityArray;
 
// create the identity query based on name
query = CSIdentityQueryCreateForName(kCFAllocatorDefault,
                                     CFSTR("David"),
                                     kCSIdentityQueryStringBeginsWith,
                                     kCSIdentityClassUser,
                                     CSGetDefaultIdentityAuthority());
 
// execute the query
if (CSIdentityQueryExecute(query, kCSIdentityQueryGenerateUpdateEvents, &error))
{
    // retrieve the results of the identity query
    identityArray = CSIdentityQueryCopyResults(query);
 
    // do something with identityArray
 
 
 
}
CFRelease(query);

Поисковые идентификационные данные асинхронно

Выполнение запроса идентификационных данных асинхронно подобно выполнению запроса синхронно, но отличается важным способом. С синхронным запросом Вы выполняете запрос, ожидаете его, чтобы завершиться, и затем попросить результаты. Напротив, с асинхронным запросом Вы запускаете запрос, и Ваша функция обратного вызова будет передана результаты, поскольку они становятся доступными. Процесс для установки асинхронных обратных вызовов подобен в теории и на практике к другим обратным вызовам Core Services.

Искать идентификационные данные асинхронно требует двух основных шагов: установка функции обратного вызова и добавление идентификационных данных запрашивают объект к циклу выполнения. Во-первых, установите свою функцию обратного вызова. Функция обратного вызова должна быть a void функционируйте и должен принять пять параметров:

  • CSIdentityQueryRef query, объект запроса идентификационных данных

  • CSIdentityQueryEvent event, событие, заставившее функцию обратного вызова быть выполненной

  • CFArrayRef identities, результаты запроса как массив идентификационные данные

  • CFErrorRef error, ошибка, произошедшая в результате запроса идентификационных данных, если применимо

  • void *info, любые данные поместили в CSIdentityQueryClientContext, быть отправленным в функцию обратного вызова

Функция обратного вызова могла бы быть похожей на Перечисление 3-3.

  Идентификационные данные перечисления 3-3 запрашивают функцию обратного вызова

void myIdentityQueryCallback (CSIdentityQueryRef query,
                              CSIdentityQueryEvent event,
                              CFArrayRef identities,
                              CFErrorRef error,
                              void *info) {
 
    // See what event triggered the callback
    switch ( event ) {
 
        case kCSIdentityQueryEventResultsAdded:
        // An identity was added to the list of results
        break;
 
        case kCSIdentityQueryEventSearchPhaseFinished:
        // The query was completed
        break;
    }
}

Для добавления объекта запроса идентификационных данных к циклу выполнения сначала создайте объект. Тогда создайте a CSIdentityQueryClientContext структура. В CSIdentityQueryClientContext структура, определите имя функции обратного вызова, которая будет выполнена. С CSIdentityQueryClientContext установленная структура, вызовите CSIdentityQueryExecuteAsynchronously метод для добавления запроса к циклу выполнения.

CSIdentityQueryExecuteAsynchronously требует пяти параметров: запрос идентификационных данных возражает, чтобы быть выполненным, опции выполнения (от CSIdentityQueryFlags), указатель на Ваш CSIdentityQueryClientContext структура, цикл выполнения, на который можно запланировать обратные вызовы и режим цикла выполнения. Если запрос добавляется к циклу выполнения, функциональным возвратам TRUE и любые ошибки в результате запроса отправляются в Вашу функцию обратного вызова. См. Перечисление 3-4, чтобы видеть, как это смотрит в коде.

Перечисление 3-4  , Добавляющее идентификационные данные, запрашивает объект к циклу выполнения

CSIdentityQueryRef query;
CSIdentityQueryClientContext queryclient =
    {0, NULL, NULL, NULL, NULL, myIdentityQueryCallback};
 
// create the identity query based on name
query = CSIdentityQueryCreateForName(kCFAllocatorDefault,
                                     CFSTR("David"),
                                     kCSIdentityQueryStringBeginsWith,
                                     kCSIdentityClassUser,
                                     CSGetDefaultIdentityAuthority());
 
// add the identity query object to the current run loop
if (!CSIdentityQueryExecuteAsynchronously(query,
                                          kCSIdentityQueryGenerateUpdateEvents,
                                          &queryclient,
                                          CFRunLoopGetCurrent(),
                                          kCFRunLoopCommonModes))
{
    // query was not added to the run loop
}

Когда событие инициировано на основе Вашего запроса, Ваша функция обратного вызова выполняется. Событие, заставляющее Вашу функцию обратного вызова работать, передается функции обратного вызова вместе с массивом идентификационных данных. Если идентификационные данные от запроса добавляются, удалили или изменили, массив содержит только те затронутые идентификационные данные. Если поиск завершается, то массив NULL. В этом случае использовать CSIdentityQueryCopyResults получить полный список идентификационных данных.

После того, как запрос завершился, необходимо удалить объект запроса идентификационных данных из цикла выполнения. Чтобы сделать это, вызовите CSIdentityQueryStop метод и передача это объект запроса идентификационных данных. Затем выпустите объект запроса идентификационных данных. Это должно быть похожим на код в Перечислении 3-5.

Перечисление 3-5  , Лишающее законной силы идентификационные данные, запрашивает объект

CSIdentityQueryStop(query);
CFRelease(query);

Постоянно идентификационные данные монитора

Контроль идентификационных данных очень подобен поиску того. При поиске идентификационных данных асинхронно то все, что необходимо сделать, не должно вызывать CSIdentityQueryStop когда завершается запрос. Пока Ваш объект запроса идентификационных данных регистрируется на цикле выполнения, он продолжает уведомлять Вас, когда изменяется содержание Вашего запроса. Таким образом, если Вы будете искать все Идентификационные данные с именем «Крис», и новый пользователь создается с именем «Крис Джонс» после того, как Ваш исходный поиск закончился, то Ваша функция обратного вызова будет уведомлена относительно этого нового пользователя. Когда Вы будете сделаны, контролируя идентификационные данные, удостоверьтесь, что вызвали CSIdentityQueryStop.

Для контроля идентификационных данных синхронно необходимо опросить объект запроса идентификационных данных. Каждый объект запроса идентификационных данных может только быть выполнен один раз, поэтому после выполнения CSIdentityQueryExecute и проверка результатов с CSIdentityQueryCopyResults, необходимо будет создать идентичный объект запроса идентификационных данных выполниться снова. Каждый раз Вы работаете CSIdentityQueryCopyResults это возвратит массив с полными результатами Вашего запроса, не, что изменилось. Это - другая причина, почему рекомендуется, чтобы Вы искали и контролировали идентификационные данные асинхронно, а не синхронно.