2016-11-07 137 views
0

由于某些原因,我的一些联系人在我的tableView中缺失。我相信我会提取所有必要的密钥并审查了Apple的文档,但我仍然陷入困境。以下是我的代码:联系人框架中缺少联系人(Objective-C)

-(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]; 
      }); 
     } 
     } 
    }]; 
} 

任何帮助非常感谢!

+0

张贴失踪和非接触缺失,包括包含组,比较 – shallowThought

回答

0
` 
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限制搜索。

+0

试图添加多个键,但似乎并没有工作。如果删除谓词,您是如何获得cnContacts的? – a2b123

+0

对不起,延迟回复 – Fallah

0

您应该以不同方式访问联系簿。

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]; 
     }]; 


    }]; 
});