Отсутствующие контакты из структуры контактов (Objective-C)

По некоторым причинам, некоторые из моих контактов отсутствуют в моем tableView. Я полагаю, что извлекаю все необходимые ключи и просмотрел документацию Apple, но все еще застрял. Ниже мой код:

  -(void)fetchContactsandAuthorization {
// Request authorization to Contacts
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted == YES)
    {

        //keys with fetching properties
        NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey];
        NSString *containerId = store.defaultContainerIdentifier;
        NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];
        NSError *error;
        NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error];
        if (error)
        {
            NSLog(@"error fetching contacts %@", error);
        }
        else
        {
            NSString *phone;
            NSString *fullName;
            NSString *firstName;
            NSString *lastName;
            UIImage *profileImage;
            NSMutableArray *contactNumbersArray = [[NSMutableArray alloc]init];
            for (CNContact *contact in cnContacts) {
                // copy data to my custom Contacts class.
                firstName = contact.givenName;
                lastName = contact.familyName;
                if (lastName == nil) {
                    fullName=[NSString stringWithFormat:@"%@",firstName];
                }else if (firstName == nil){
                    fullName=[NSString stringWithFormat:@"%@",lastName];
                }
                else{
                    fullName=[NSString stringWithFormat:@"%@ %@",firstName,lastName];
                }

                UIImage *image = [UIImage imageWithData:contact.imageData];
                if (image != nil) {
                    profileImage = image;
                }else{
                    profileImage = [UIImage imageNamed:@"person-icon.png"];
                }

                NSString *number = contact.phoneNumbers.firstObject.value.stringValue;

                if (number == (NSString *)NSNull.null || number == nil) {
                    [contactNumbersArray addObject:@"NO NUMBER"];
                } else {
                    [contactNumbersArray addObject:number];
                }


                arrayPhoneData = contactNumbersArray;
                NSDictionary* personDict = [[NSDictionary alloc] initWithObjectsAndKeys: fullName,@"fullName",profileImage,@"userImage",phone,@"PhoneNumbers", nil];
                [arrayTableData addObject:[NSString stringWithFormat:@"%@",[personDict objectForKey:@"fullName"]]];
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                //[tableViewContactData reloadData];
                [self.tableView reloadData];
            });
        }
      }
  }];
}

Любая помощь высоко ценится!!!!

2 ответа

`
let keys = [CNContactGivenNameKey, CNContactPhoneNumbersKey] as [Any]

        do {
            let contactStore = AppDelegate.getAppDelegate().contactStore
            try contactStore.enumerateContacts(with: CNContactFetchRequest(keysToFetch: keys as! [CNKeyDescriptor])) { (contact, pointer) -> Void in
                if !contact.phoneNumbers.isEmpty {
                    contacts.append(contact)
                }
            }
        }
        catch let error as NSError {

            print(error.description, separator: "", terminator: "\n")
        }


        let contactPickerViewController = CNContactPickerViewController()

        contactPickerViewController.delegate = self

        present(contactPickerViewController, animated: true, completion: nil)
`

вставьте это в ваше приложение делегат

var contactStore = CNContactStore()

   class func getAppDelegate() -> AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }

Попробуйте дважды проверить свой предикат. У меня были проблемы с предикатом, ограничивающим контакты, которые я искал, и он был полностью удален в прошлом. Не также, но вы можете попробовать добавить больше ключей к контактным ключам. Вы потенциально ограничиваете свой поиск с помощью keysToFetch.

Вы должны получить доступ к книге контактов по-другому.

   dispatch_async(dispatch_get_main_queue(), ^{

    CNContactStore *store = [[CNContactStore alloc] init];

    [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {

        if (granted == NO) {
            //show access denied popup
            return ;
        }


        NSError* contactError;
        CNContactStore* addressBook = [[CNContactStore alloc]init];
        [addressBook containersMatchingPredicate:[CNContainer predicateForContainersWithIdentifiers: @[addressBook.defaultContainerIdentifier]] error:&contactError];
        NSArray *keysToFetch = @[CNContactMiddleNameKey,CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey,CNContactEmailAddressesKey];
        CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:keysToFetch];


        [addressBook enumerateContactsWithFetchRequest:request error:&contactError usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop){\

            NSString *firstName = contact.givenName;
            NSString *lastName = contact.familyName;

           //recommend to use a function like this one: [self parseContactWithContact:contact];
        }];


    }];
});
Другие вопросы по тегам