iOS получает контакты пользователей, за исключением предприятий
У меня есть приложение, которое загружает все контакты пользователей. Я хотел бы исключить любой бизнес, но я не могу найти способ определить, является ли контакт бизнесом.
Первоначально я рассмотрел проверку, если поле "компания" содержит значение, когда нет имени и фамилии, но я не могу найти это свойство из ABRecord.
Вот как я хватаю имя и фамилию:
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
Есть идеи? Спасибо!
1 ответ
Вы можете получить название фирмы через:
NSString *company = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonOrganizationProperty);
Вы можете отфильтровать свой массив на основе того, есть ли имя организации, но нет имени или фамилии.
Но, если вы хотите исключить бизнес, вам не нужно знать название компании (потому что у людей может быть название компании, но у компаний, как правило, нет имени / фамилии). Просто отфильтруйте свои записи, чтобы включить только те, которые имеют имя и / или фамилию:
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (error) {
NSLog(@"Address book creation failure: %@", CFBridgingRelease(error));
return;
}
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();
if (status == kABAuthorizationStatusDenied) {
// authorization previously denied ... tell user to go to settings and authorize access
NSLog(@"kABAuthorizationStatusDenied");
return;
}
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, NULL, kABPersonSortByLastName));
// if you didn't want to sort, just use
//
// NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) {
NSString *firstName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonFirstNameProperty));
NSString *lastName = CFBridgingRelease(ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonLastNameProperty));
return (firstName || lastName);
}];
NSArray *peopleNotCompanies = [allPeople filteredArrayUsingPredicate:predicate];
// You now have an array of `ABRecordRef` associated with
// those contacts with first or last name
} else {
// authorization only just now denied ... tell user to go to settings and authorize access
NSLog(@"Access not granted: %@", CFBridgingRelease(error));
}
});
В качестве альтернативы, вы можете посмотреть на kABPersonKindProperty
:
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) {
CFNumberRef recordType = ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonKindProperty);
BOOL isCompany = (recordType == kABPersonKindOrganization);
CFRelease(recordType);
return !isCompany;
}];
Удобно ли вам полагаться на это? kABPersonKindProperty
Зависит от тебя. Я не уверен, правильно ли он заполнен источниками, такими как Microsft Exchange, тем более, все ли конечные пользователи всегда нажимали соответствующий флажок.