2016-10-13 4 views
0

Я пытаюсь получить CNContact. Но проблема в том, что CNContactStore.CNContactStore.authorizationStatusForEntityType не . Авторизованный в любое время.CNContactStore.CNContactStore.authorizationStatusForEntityType нет. Авторизованный

import Contacts 
import ContactsUI 

class ContactViewController: UIViewController 
    var store = CNContactStore() 
    override func viewDidLoad() { 
     checkPermission() 
    } 



func checkPermission(){ 
     switch CNContactStore.authorizationStatusForEntityType(.Contacts){ 
      case .Authorized: 
      let cnt = findContacts() 
      print(cnt.count) 

     case .NotDetermined: 
      store.requestAccessForEntityType(.Contacts){succeeded, err in 
       guard err == nil && succeeded else{ 
        return 
       } 
       let cnt = findContacts() 
       print(cnt.count) 
      } 
     default: 
      print("Not Handled") 
     } 
    } 

    func findContacts() -> [CNContact] { 

     let keysToFetch =  [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), 
     CNContactImageDataKey,CNContactEmailAddressesKey,CNContactUrlAddressesKey,CNContactNoteKey, 
      CNContactPhoneNumbersKey,CNContactPostalAddressesKey] 

     let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) 
     fetchRequest.unifyResults = true 
     var contacts = [CNContact]() 
     do { 
      try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in 
       contacts.append(contact) 
      }) 
     } 
     catch let error as NSError { 
      print(error.localizedDescription) 
     } 

     return contacts 
    } 
} 

в пределах checkPermission() метод findContacts() не называется ever.That означает печать (cnt.count) нет печати. Но почему. Чтобы получить разрешение на авторизацию, какой будет идеальный код?

Если я называю findContacts() метод из viewDidLoad без checkPermission() метод, то приложение повешен на код ниже

try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in 
        contacts.append(contact) 
       }) 

ответ

0

Пожалуйста, попробуйте добавить это .plist

<key>NSContactsUsageDescription</key> 
    <string>This app requires contacts from phone book.</string> 
+0

Недавно я сделал это. Но не получилось. Я также использую этот код, но не работал let store = CNContactStore() if CNContactStore.authorizationStatusForEntityType (.Contacts) == .NotDetermined { store.requestAccessForEntityType (.Contacts, completeHandler: {(разрешено: Bool, ошибка: NSError ?) -> Пустота в если разрешено { печать ("A") } }) } еще если CNContactStore.authorizationStatusForEntityType (.контакты) == .Authorized { печать ("A") } –

0

Try это

func initContacts() { 
//  titleArr.removeAll(); 
     CoreContextNDelegate.sharedInstance().requestForAccess { (accessGranted) -> Void in 
      if accessGranted { 
       //let predicate = CNContact.predicateForContactsMatchingName("Joshna") 
       let keys = [ 
        CNContactFormatter.descriptorForRequiredKeys(for: .fullName), 
        CNContactGivenNameKey, CNContactFamilyNameKey, 
        CNContactEmailAddressesKey, 
        CNContactPhoneNumbersKey, 
        CNContactImageDataAvailableKey, 
        CNContactThumbnailImageDataKey 
       ] as [Any] 
//    let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactBirthdayKey, CNContactImageDataKey] 
       let request = CNContactFetchRequest(keysToFetch: keys as! [CNKeyDescriptor]); 
       //var contacts = [CNContact]() 
       var message: String! 

       //let contactsStore = CoreContextNDelegate.sharedInstance().getContactStore(); 
       do { 
        // contacts = try contactsStore.unifiedContactsMatchingPredicate(predicate, keysToFetch: keys) 
        try CoreContextNDelegate.sharedInstance().getContactStore().enumerateContacts(with: request) { 
         contact, stop in 
         print(contact.givenName) 
         print(contact.familyName) 
         print(contact.identifier) 

         for phoneNumber in contact.phoneNumbers { 
          let contacts: Contact = Contact()! 
          contacts.givenName = contact.givenName+" "+contact.middleName+" "+contact.familyName 
          if let value = phoneNumber.value as? CNPhoneNumber { 
           if let digit = value.value(forKey: "digits") as? String { 
            contacts.phoneNumbers = digit; 

           } 
          } 
          self.contactList.append(contacts) 
         } 

         self.filteredContactList = self.contactList; 
        } 
        DispatchQueue.main.async { 
         self.initTableViewData(); 
        } 
       } 
       catch { 
        message = "Unable to fetch contacts." 
        DispatchQueue.main.async { 
         self.initTableViewData(); 
        } 

       } 


       if message != nil { 
        DispatchQueue.main.async(execute: {() -> Void in 
         print(message); 
         //AppDelegate.getAppDelegate().showMessage(message) 
        }) 
       } 
       else { 

       } 
      } 
     } 

    } 

Для более проверить эти адреса https://developer.apple.com/reference/contacts

https://www.safaribooksonline.com/library/view/ios-9-swift/9781491936689/ch04.html

https://code.tutsplus.com/tutorials/ios-9-an-introduction-to-the-contacts-framework--cms-25599

Смежные вопросы