Как фильтровать контакты по набору телефонных номеров с помощью CNContactPickerViewController?

Я пытаюсь отфильтровать некоторые контакты из адресной книги с набором существующих телефонных номеров. CNContactPickerViewController следует отключить выбор этих контактов, если у них есть номер телефона, совпадающий с существующими телефонными номерами.

Мне нужно использовать номер телефона в качестве фильтра, потому что этот номер телефона может быть из других платформ приложений. И служба не должна позволять пользователю использовать контакт с тем же номером телефона, который уже существует. Я не хочу создавать собственное средство выбора контактов только для этого быстрого действия.

Вот что я пробовал до сих пор.

NSArray<CNPhoneNumber *> *existingPhoneNumbers = @[@"1111", @"2222"];

CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];
contactPicker.delegate = self;
contactPicker.displayedPropertyKeys = @[CNContactNamePrefixKey,
                                        CNContactGivenNameKey,
                                        CNContactFamilyNameKey,
                                        CNContactOrganizationNameKey,
                                        CNContactPhoneNumbersKey];

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (ANY phoneNumbers.value.stringValue IN %@)", existingPhoneNumbers];

contactPicker.predicateForEnablingContact = predicates;

Сообщение об ошибке:

[CNUI ERROR] Error when showing picker: Error Domain=CNErrorDomain Code=300 "(null)" UserInfo={CNValidationErrors=(
"Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo={CNKeyPaths=(\n    \"phoneNumbers.value.stringValue\"\n), NSLocalizedDescription=Invalid Predicate, NSLocalizedFailureReason=The operation couldn't be completed because its predicate is invalid.}")}

С SUBQUERY все еще не работает.

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(phoneNumbers, $CNLabeledValue,$CNLabeledValue.value.stringValue IN %@).@count == 0"];

Сообщение об ошибке:

[CNUI ERROR] Error when showing picker: Error Domain=CNErrorDomain Code=300 "(null)" UserInfo={CNValidationErrors=(
"Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo={CNKeyPaths=(\n    \"value.stringValue\"\n), NSLocalizedDescription=Invalid Predicate, NSLocalizedFailureReason=The operation couldn't be completed because its predicate is invalid.}")}

Тоже пробовал с predicateWithBlock:. Он вообще не поддерживает блочные предикаты.

Источник: WWDC 2015 Представляем платформу контактов для сеанса iOS и OS X. Они сказали, что predicateForEnablingContact оценивается на «CNContact». В документе не сказано, что предикат должен быть от CNContact+Predicates, как CNContactFetchRequest.


person Thanakrit Weekhamchai    schedule 27.05.2016    source источник


Ответы (2)


Проблема уже обнаружена. Когда я столкнулся с этой проблемой, мои волосы чуть не выпали. Решение состоит в том, чтобы добавить к значению апостроф. Нравится

let predicate = NSPredicate(format: "ANY self.phoneNumbers.'value'.'digits' BEGINSWITH %@", "+420" 

Я надеюсь, это поможет вам.

person user3539984    schedule 07.10.2016

Надеюсь, вы нашли решение, которое искали. Я расскажу, как я справился с такого рода проблемами. Это может помочь другим.

Я хотел ограничить CNContactPickerViewController показом только контактов, скажем, единственных контактов (номеров телефонов), которые у меня есть в наборе. По сути, в отличие от вашего случая, я хотел показать только существующих пользователей. Итак, In viewDidLoad ...

let exsitingNumbers = Set(["1111", "2222"])
let predicate = NSPredicate(format: "SUBQUERY(phoneNumbers, $x, $x.'value'.'stringValue' IN %@).@count > 0", exsitingNumbers)
self.contactPicker.predicateForEnablingContact = predicate

Для получения дополнительных сведений о SUBQUERY в NSPredicate воспользуйтесь посмотри на это.

person Gaurav Chandarana    schedule 01.12.2018