如何在iOS上获取联系人并存储在数组中?

时间:2019-05-22 01:04:21

标签: ios swift delegates cncontactstore

我正在为iOS联系人开发Tinder刷卡应用程序。我已导入联系人库,并成功获取了要在控制台中打印的联系人。但是,我试图将这些名称动态添加到Tinder之类的卡中。我创建了一个模型类来保存名称,但是,我无法将数据附加到该模型中。

 using System.Collections;
 using System.ComponentModel;
 using System.Configuration.Install;

 namespace Dell.Client.Framework.AutoUpdateBootstrapper
 {
     [RunInstaller(true)] //This attribute is true.
     public partial class ProjectInstaller : Installer
     {
         public ProjectInstaller()
         {
             InitializeComponent();
         }

         protected override void OnAfterInstall(IDictionary savedState)
         {
             base.OnAfterInstall(savedState);
             using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
             {
                 serviceController.Start();
             }
         }
     }
 }

我希望所有联系人都附加到模型变量,然后将其返回给卡片。

2 个答案:

答案 0 :(得分:0)

据我了解,enumerateContacts是异步的。这意味着,当您的应用正在执行创建userModels数组的行时,尚未提取联系人:因此您的数组保持为空。

我会尝试将userModels数组的创建移动到另一个正在显示卡的控制器中。

要实现此目的,您可以使用一个委托,该委托将获取的联系人作为参数接收。然后,您可以为阵列分配此参数内容并创建卡的内容。

这里是great tutorial on how to use a delegate with Swift

希望这会对您有所帮助。

答案 1 :(得分:0)

我为此创建了帮助程序类。那可能对您有帮助。 示例

 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 ""
        }
    }
}