Как заставить новый CNContact в Локальный CNContainer?

Я пишу приложение, которое хранит контактную информацию, извлеченную через REST и JSON, в контейнер, используя CNContactStore. Я хотел бы сохранить эти контакты отдельно от любых других учетных записей и хранить их только локально на устройстве, но локального хранилища не существует, и я не могу найти способ создать / активировать один?

Я могу получить идентификатор магазина по умолчанию (как настроено на устройстве, например, iCloud), используя:

let store = CNContactStore()
let containerID = store.defaultContainerIdentifier()

... и я могу (теоретически) идентифицировать локальный контейнер следующим образом - если он действительно существует:

var allContainers = [CNContainer]()
    do {
        allContainers = try store.containersMatchingPredicate(nil)
        for container in allContainers {
            if container.type == CNContainerType.Local {
                print("Local container is: \(container.identifier)")
                break
            }
        }           
    } catch {
        print("Error fetching containers")
    }

Но никакого локального контейнера не существует. Любые идеи о том, как хранить мои контакты локально или в новом отдельном контейнере?

2 ответа

Это стало возможным следующим образом с устаревшим AB API, который все еще может работать как обходной путь:

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions( nil, nil );

ABRecordRef source = ABAddressBookGetSourceWithRecordID( addressBook, kABSourceTypeLocal );

ABRecordRef contact = ABPersonCreateInSource( source );

containersMatchingPredicate(nil) возвращает только контейнер по умолчанию.

У меня похожая проблема. Если icloud был настроен, он будет только возвращать CNContainerTypeCardDAV тип контейнера или локальный контейнер.

Другие вопросы по тегам