Как получить контакты и сохранить в массиве на iOS? - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над приложением Tinder Swiping для iOS Contacts.Я импортировал библиотеку контактов и успешно получил контакты для печати в консоли.Тем не менее, я пытаюсь динамически добавить эти имена на карту, как Tinder.Я создал класс модели для хранения имени, однако не могу добавить свои данные в эту модель.

    struct ContactInfo {

    var name: String

}


  let contactInfo = [ContactInfo]()
    func fetchContacts(){
        let contactStore = CNContactStore()
        var contacts = [CNContact]()
        let keys = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]
        let request = CNContactFetchRequest(keysToFetch: keys)

        do {
            try contactStore.enumerateContacts(with: request) { (contact, stop) in
                contacts.append(contact)
                var info = contact.givenName + " " + contact.familyName
                print(info)

            }
        } catch {
            print(error.localizedDescription)
        }

    }
    var userModels : [ContactInfo] =  {
        var model : [ContactInfo] = []
        for n in 1...10 {
            model.append(ContactInfo(name: names[Int(arc4random_uniform(UInt32(names.count)))]))
        }
        return model
    }()

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

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Я создал вспомогательный класс для этого.Это может помочь вам. Пример

 ContactSyncHelper.sharedInstance.getAllContacts { (contacts, error) in
      if error {
          print("error")
      }else {
          print(contacts)
      }
    }

ContactSyncHelper

import UIKit
import Foundation
import Contacts

let kphone_number = "phone_number"
let kcountry_code = "country_code"

class ContactSyncHelper: NSObject {

    static let sharedInstance: ContactSyncHelper = {
        let instance = ContactSyncHelper()
        // setup code
        return instance
    }()

    // MARK: - Initialization Method

    override init() {
        super.init()
    }

    //Example
//    ContactSyncHelper.sharedInstance.getAllContacts { (contacts, error) in
//      if error {
//          print("error")
//      }else {
//          print(contacts)
//      }
//    }
    func getAllContacts(completion: ([NSMutableDictionary],Bool) -> ()) {
        switch CNContactStore.authorizationStatus(for: .contacts) {
        // Update our UI if the user has granted access to their Contacts
        case .authorized:
            break

        // Prompt the user for access to Contacts if there is no definitive answer
        case .notDetermined :
            completion([],true)
            break

        // Display a message if the user has denied or restricted access to Contacts
        case .denied,
             .restricted:
            //CommData.showAlert(self, withMsg: "Permission was not granted for Contacts.", withTitle: "Privacy Warning!", action: nil)
            completion([],true)
            break
        }

        let contactStore = CNContactStore()
        let keysToFetch = [
            CNContactFormatter.descriptorForRequiredKeys(for: .fullName),
            CNContactEmailAddressesKey,
            CNContactPhoneNumbersKey,
            CNContactImageDataAvailableKey,
            CNContactThumbnailImageDataKey] as [Any]

        // Get all the containers
        var allContainers: [CNContainer] = []
        do {
            allContainers = try contactStore.containers(matching: nil)
        } catch {
            print("Error fetching containers")
        }

        var arrayNumbers: [NSMutableDictionary] = []
        for container in allContainers {
            let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)

            do {
                let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as! [CNKeyDescriptor])
                containerResults.forEach { (contact:CNContact) in

                    contact.phoneNumbers.forEach { (justPhone:CNLabeledValue) in

                        let numberValue = justPhone.value
                        let countryCode = numberValue.value(forKey: "countryCode") as? String

                        var strphone =  numberValue.stringValue
                        strphone = strphone.replacingOccurrences(of: "(", with: "")
                        strphone = strphone.replacingOccurrences(of: ")", with: "")
                        strphone = strphone.replacingOccurrences(of: "-", with: "")
                        strphone = strphone.replacingOccurrences(of: "+", with: "")
                        strphone = strphone.components(separatedBy: .whitespaces).joined()
                        if strphone.hasPrefix("0"){
                            strphone.remove(at: (strphone.startIndex))
                        }

                        if(countryCode != nil)
                        {
                            var countryCode1:String = self.getCountryPhonceCode(country: countryCode!)
                            if strphone.hasPrefix(countryCode1) {
                                strphone = strphone.deletingPrefix(countryCode1)
                            }
                            countryCode1 = "+\(countryCode1)"

                            let dict = NSMutableDictionary()
                            dict.setValue(strphone, forKey: kphone_number)
                            dict.setValue(countryCode1, forKey: kcountry_code)
                            arrayNumbers.append(dict)
                        }
                    }
                }
            } catch {
                print("Error fetching results for container")
            }
        }
        completion(arrayNumbers,false)
    }

    func getCountryPhonceCode (country : String) -> String
    {

        if country.count == 2
        {
            let x : [String] = ["972","IL","93","AF","355","AL","213","DZ","1","AS","376","AD","244","AO","1","AI","1","AG","54","AR","374","AM","297","AW","61","AU","43","AT","994","AZ","1","BS","973","BH","880","BD","1","BB","375","BY","32","BE","501","BZ","229","BJ","1","BM","975","BT","387","BA","267","BW","55","BR","246","IO","359","BG","226","BF","257","BI","855","KH","237","CM","1","CA","238","CV","345","KY","236","CF","235","TD","56","CL","86","CN","61","CX","57","CO","269","KM","242","CG","682","CK","506","CR","385","HR","53","CU" ,"537","CY","420","CZ","45","DK" ,"253","DJ","1","DM","1","DO","593","EC","20","EG" ,"503","SV","240","GQ","291","ER","372","EE","251","ET","298","FO","679","FJ","358","FI","33","FR","594","GF","689","PF","241","GA","220","GM","995","GE","49","DE","233","GH","350","GI","30","GR","299","GL","1","GD","590","GP","1","GU","502","GT","224","GN","245","GW","595","GY","509","HT","504","HN","36","HU","354","IS","91","IN","62","ID","964","IQ","353","IE","972","IL","39","IT","1","JM","81","JP","962","JO","77","KZ","254","KE","686","KI","965","KW","996","KG","371","LV","961","LB","266","LS","231","LR","423","LI","370","LT","352","LU","261","MG","265","MW","60","MY","960","MV","223","ML","356","MT","692","MH","596","MQ","222","MR","230","MU","262","YT","52","MX","377","MC","976","MN","382","ME","1","MS","212","MA","95","MM","264","NA","674","NR","977","NP","31","NL","599","AN","687","NC","64","NZ","505","NI","227","NE","234","NG","683","NU","672","NF","1","MP","47","NO","968","OM","92","PK","680","PW","507","PA","675","PG","595","PY","51","PE","63","PH","48","PL","351","PT","1","PR","974","QA","40","RO","250","RW","685","WS","378","SM","966","SA","221","SN","381","RS","248","SC","232","SL","65","SG","421","SK","386","SI","677","SB","27","ZA","500","GS","34","ES","94","LK","249","SD","597","SR","268","SZ","46","SE","41","CH","992","TJ","66","TH","228","TG","690","TK","676","TO","1","TT","216","TN","90","TR","993","TM","1","TC","688","TV","256","UG","380","UA","971","AE","44","GB","1","US","598","UY","998","UZ","678","VU","681","WF","967","YE","260","ZM","263","ZW","591","BO","673","BN","61","CC","243","CD","225","CI","500","FK","44","GG","379","VA","852","HK","98","IR","44","IM","44","JE","850","KP","82","KR","856","LA","218","LY","853","MO","389","MK","691","FM","373","MD","258","MZ","970","PS","872","PN","262","RE","7","RU","590","BL","290","SH","1","KN","1","LC","590","MF","508","PM","1","VC","239","ST","252","SO","47","SJ","963","SY","886","TW","255","TZ","670","TL","58","VE","84","VN","284","VG","340","VI","678","VU","681","WF","685","WS","967","YE","262","YT","27","ZA","260","ZM","263","ZW"]
            var keys = [String]()
            var values = [String]()
            let whitespace = NSCharacterSet.decimalDigits

            //let range = phrase.rangeOfCharacterFromSet(whitespace)
            for i in x {
                // range will be nil if no whitespace is found
                //            if  (i.rangeOfCharacterFromSet(whitespace) != nil) {
                if  (i.rangeOfCharacter(from: whitespace, options: String.CompareOptions.caseInsensitive) != nil) {
                    values.append(i)
                }
                else {
                    keys.append(i)
                }
            }
            let countryCodeListDict:NSDictionary = NSDictionary(objects: values as [String], forKeys: keys as [String] as [NSCopying])
            if let _: AnyObject = countryCodeListDict.value(forKey: country.uppercased()) as AnyObject {
                return countryCodeListDict[country.uppercased()] as! String
            } else
            {
                return ""
            }
        }
        else
        {
            return ""
        }
    }
}
0 голосов
/ 22 мая 2019

Как я понимаю, enumerateContacts является асинхронным. Это означает, что когда ваше приложение выполняет строку для создания массива userModels, контакты еще не получены: ваш массив остается пустым.

Я бы попытался переместить создание массива userModels в другой контроллер, где вы отображаете свои карты.

Для этого вы можете использовать делегата, который получает выбранные контакты в качестве параметра. Затем вы можете назначить свой массив с этим параметром content и создать содержимое ваших карт.

Вот отличный учебник по использованию делегата со Swift .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...