Как заставить новый 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
тип контейнера или локальный контейнер.