RHBContacts
Contacts store API using keypaths to fetch contact properties. It fetches one key at a time, but that's fine.
let contactsApi = ContactsApi(CNContactStore())
contactsApi.requestContactsAccess { result in
guard let granted = try? result.get(), granted else {
return
}
let names = try? contactsApi.fetchKeyValues(keyPath: \.givenName)
}