2016-04-26 6 views
1

私は連絡先をNSMutableDictionaryにインポートする必要があるアプリケーションに取り組んでいますが、連絡先の詳細を記入していない人もいます。だから、番号または会社名だけを残してください。どのフィールドが自分の「表示名」になるかを確認するには、すべての連絡先の詳細を調べる必要がありますか。 AndroidではdisplayNameという変数があります。しかし、どのようにそれが迅速または目的Cにあるのですか?CNContact表示名目的c/swift

マイコード:

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

     NSString * contactId = contact.identifier; 
     NSString * firstName = contact.givenName; 
     NSString * lastName = contact.familyName; 
       }]; 

答えて

5

から連絡先を取得するにはディスプレイを構築するにはCNContactFormatterを使用してください名前。要求のキーを指定するときは、descriptorForRequiredKeysForStyleを使用して、適切なフィールドを要求していることを確認してください。スウィフトは

、それは次のようになります。

let store = CNContactStore() 
store.requestAccess(for: .contacts) { granted, error in 
    guard granted else { 
     print(error?.localizedDescription ?? "Unknown error") 
     return 
    } 

    let request = CNContactFetchRequest(keysToFetch: [CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) 

    let formatter = CNContactFormatter() 
    formatter.style = .fullName 

    do { 
     try store.enumerateContacts(with: request) { contact, stop in 
      if let name = formatter.string(from: contact) { 
       print(name) 
      } 
     } 
    } catch let fetchError { 
     print(fetchError) 
    } 
} 

あなたはどちらの名前も会社がある状況が、ちょうど電話番号を持っていることが示唆されました。さて、その後、手動で自分で対処する必要があると思います:スウィフト2について

let request = CNContactFetchRequest(keysToFetch: [CNContactIdentifierKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) 

do { 
    try store.enumerateContacts(with: request) { contact, stop in 
     if let name = formatter.string(from: contact) { 
      print(name) 
     } else if let firstPhone = contact.phoneNumbers.first?.value { 
      print(firstPhone.stringValue) 
     } else { 
      print("no name; no number") 
     } 
    } 
} catch let fetchError { 
    print(fetchError) 
} 

を、previous revision of this answerを参照してください。

+0

これをチェックする方法.fullNameは利用可能かどうか。 isKeyAvilableでこれを使用できますか? – commando24

+1

IIRCの場合、 '.FullName'は連絡先フレームワークの最初のバージョンで利用できましたので、空き状況を確認する必要はありません。オプションで 'stringFromContact'をバインドすることができます(たとえば、' 'let fullName = formatter.stringFromContact(contact){...}')。また、 'fullName!=" "'それが必要ではないとは思うが、そこにもチェックを加えることができる。 – Rob

0
#import <Contacts/Contacts.h> 
#import <ContactsUI/ContactsUI.h> 


- (IBAction)displayContact:(id)sender { 

    id keysToFetch = @[[CNContactViewController descriptorForRequiredKeys]]; 
    CNContact *contact = [self.store unifiedContactWithIdentifier:self.contactIdentifier keysToFetch:keysToFetch error:nil]; 

    self.controller = [[CNContactViewController alloc] init]; 

    [self.controller.view setFrameSize:NSMakeSize(500, 500)]; 

    [self presentViewController:self.controller asPopoverRelativeToRect:self.view.bounds ofView: self.view preferredEdge: NSMaxXEdge behavior:NSPopoverBehaviorTransient]; 

    self.controller.contact = contact; 
} 
0

あなたはこのコードを使用して、電話帳から連絡先の名前を取得することができます -

- (void) fetchContacts 
{ 
    CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; 
    if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusDenied) { 
     UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:@"This app previously was refused permissions to contacts; Please go to settings and grant permission to this app so it can use contacts" preferredStyle:UIAlertControllerStyleAlert]; 

     [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]]; 
     [self presentViewController:alert animated:TRUE completion:nil]; 
     return; 
    } 

    CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { 

     // make sure the user granted us access 

     if (!granted) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // user didn't grant access; 
       // so, again, tell user here why app needs permissions in order to do it's job; 
       // this is dispatched to the main queue because this request could be running on background thread 
      }); 
      return; 
     } 

     // build array of contacts 

     NSMutableArray *contacts = [NSMutableArray array]; 

     NSError *fetchError; 
     CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactIdentifierKey, [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]]; 

     BOOL success = [store enumerateContactsWithFetchRequest:request error:&fetchError usingBlock:^(CNContact *contact, BOOL *stop) { 
      [contacts addObject:contact]; 
     }]; 



     if (!success) { 
      NSLog(@"error = %@", fetchError); 
     } 



     // you can now do something with the list of contacts, for example, to show the names 

     CNContactFormatter *formatter = [[CNContactFormatter alloc] init]; 

     for (CNContact *contact in contacts) { 
      if (!_contacts) { 
       _contacts = [[NSMutableArray alloc] init]; 
      } 

      NSString *string = [formatter stringFromContact:contact]; 
      NSLog(@"contact = %@", string); 
      [_contacts addObject:string]; 
     } 
     [_contactatableview reloadData]; 

    }]; 
} 
0

デバイス

if (isIOS9) { //checking iOS version of Device 

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

    //keys with fetching properties 
    NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactEmailAddressesKey,CNContactPostalAddressesKey, CNLabelWork, CNLabelDateAnniversary]; 

    NSString *containerId = store.defaultContainerIdentifier; 

    NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId]; 
    NSError *error; 
    NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error]; 
    DLOG(@"cnContacts %lu",(unsigned long)cnContacts.count); 

    if (error) { 
     //error 
    } else { 

     for (CNContact *contact in cnContacts) { 

      //iterate over cnContacts to get details 
     } 

    } 

} else { 

    //for below iOS 9 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 

    CFArrayRef arrPersons = ABAddressBookCopyArrayOfAllPeople(addressBook); 
    CFIndex count = ABAddressBookGetPersonCount(addressBook); 
    NSLog(@"cnContacts %lu",(unsigned long)count); 

    for (int i = 0; i < count; i++) { 

     ABRecordRef record = CFArrayGetValueAtIndex(arrPersons,i); 

     //use kABPersonBirthdayProperty to get b’day 
     NSString *birthDay = (__bridge NSString *)(ABRecordCopyValue(record, kABPersonBirthdayProperty)); 
     NSLog(@“B’day %@”, birthDay); 
    } 

} 
+1

許可をリクエストする必要があります。また、ABAddressBookコードにリークがあります。 – Rob

+0

はいRob、true ... –

関連する問題