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, тем более, все ли конечные пользователи всегда нажимали соответствующий флажок.

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