Получение адресов из контактов iCloud через CloudKit JS

Я хочу, чтобы мое веб-приложение позволяло импортировать контакты пользователя (особенно адреса) из контактов iCloud.

Что-то похожее на то, что API Google People предоставляет контакты Google.

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

Я пытаюсь использовать CloudKit JS для проблемы.

Похоже на . findAllUserIdentities - это то, что мне нужно в соответствии с этим:

GET users/discover: извлекает все пользовательские идентификаторы в текущей адресной книге пользователей, описанные в разделе "Обнаружение всех пользовательских образов" (GET users/discovery)

Однако я получаю пустой набор: {"users":[]}

Кажется, что веб-приложение не имеет прав на доступ к контактам. Если это так, как запросить разрешения?

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

Ответ 1

Обновленный ответ

Поскольку вы не создаете собственное веб-приложение, вы не можете запрашивать доступ к контактам iCloud для пользователей. Это был бы кошмар безопасности, если бы веб-сайтам был разрешен доступ к данным пользователей. Существуют такие инструменты, как ShuttleCloud, которые предлагают API для миграции контактов пользователей. Это то, что Google использует для своей собственной службы Gmail.

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

Старый ответ

Вам нужно спросить разрешение iOS. Вы можете сделать это, просмотрев Apple documentation.

Пример

#import <AddressBookUI/AddressBookUI.h>

  // Request authorization to Address Book
  ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

  if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
      if (granted) {
          // First time access has been granted, add the contact
          [self _addContactToAddressBook];
      } else {
          // User denied access
          // Display an alert telling user the contact could not be added
      }
    });
  }
  else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
    // The user has previously given access, add the contact
    [self _addContactToAddressBook];
  }
  else {
    // The user has previously denied access
    // Send an alert telling user to change privacy setting in settings app
  }

Ответ 2

Документ из apple:

Обсуждение

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

  • Пользователь должен находиться в текущей адресной книге пользователей.
  • Пользователь должен запустили приложение.
  • Пользователь должен предоставить разрешение на обнаружен для этого контейнера.

Руководство по обнаружениюAllUserIdentities