获取数组swift中的所有联系人电话号码



我获取了所有联系人信息,如下所示。此刻,我刚从联系人那里取了一个电话号码问题是如何获取字符串数组中联系人的所有电话号码来使用它

存储数据:

class ContactStruct : NSObject {
let identifier : String
let thumbnailImageData : UIImage?
let givenName : String
let familyName : String
let phoneNumbers : String
let emailAddresses : String
init(identi:String,img:UIImage?,name:String,family:String,phone:String,email:String) {
self.identifier = identi
self.thumbnailImageData = img
self.givenName = name
self.familyName = family
self.phoneNumbers = phone
self.emailAddresses = email
}

提取方法:

class func generateModelArray() -> [ContactStruct]{
let contactStore = CNContactStore()
var contactsData = [ContactStruct]()
let key = [CNContactGivenNameKey,CNContactFamilyNameKey,CNContactImageDataKey,CNContactThumbnailImageDataKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNLabelPhoneNumberMobile] as [CNKeyDescriptor]
let request = CNContactFetchRequest(keysToFetch: key)
try? contactStore.enumerateContacts(with: request, usingBlock: { (contact, stoppingPointer) in
let givenName = contact.givenName
let familyName = contact.familyName
let emailAddress = contact.emailAddresses.first?.value ?? ""
let phoneNumber = contact.phoneNumbers.first?.value.stringValue ?? ""
let identifier = contact.identifier
var image : UIImage?
if contact.thumbnailImageData != nil{
image = UIImage(data: contact.thumbnailImageData!)!
}
contactsData.append(ContactStruct(identi: identifier, img: image, name: givenName, family: familyName, phone: phoneNumber, email: emailAddress as String))
})
return contactsData
}

您可以使用此

func extractNumber(data: [ContactStruct]) ->[String] 
{
var arrNumbers = [String]()
for number in data
{
arrNumbers.append(number.phoneNumber)
}
return arrNumbers
}

并像这样使用:

let arrayNumbers = extractNumber(data: contactsData)
dump(arrayNumbers) //<- this line prints on console

首先,phoneNumbersemailAddresses变量应该是String数组,而不是String数组,因为可以有多个。

更详细地说,我会把它们做成一个像[String:String]这样的词典——稍后会有更多内容。

class ContactStruct: NSObject {
let identifier: String
let thumbnailImageData: UIImage?
let givenName: String
let familyName: String
let phoneNumbers: [String:String] // <----- the new dictionaries
let emailAddresses: [String:String] // <--
init(identifier: String, img: UIImage?, name: String, family: String, phones: [String:String], emails: [String:String]) {
self.identifier = identifier
self.thumbnailImageData = img
self.givenName = name
self.familyName = family
self.phoneNumbers = phones
self.emailAddresses = emails
}

其次,当涉及到获取电话号码和电子邮件时,你需要循环浏览它们,因为它们到达的类型是[CNLabeledValue<CNPhoneNumber>],这是一个包含在CNLabledValue中的电话号码数组,这意味着它们有一个值(电话号码(和标签,在本例中是电话号码的类型(即家庭、手机、传真、esc…更多信息,请点击此处-来自苹果文件。(

这也是为什么我会使用Dictionary[String:String],这样你就可以将它们保持在键值关系中,其中键是电话类型,值是电话号码。

例如CCD_ 7。

如果我是你,我会构建一个简单的函数来遍历它们,并返回准备好的Dictionary,例如:

private func getPhoneNumbersFromContact(_ contact: CNContact) -> [String:String] {
var numbers: [String:String] = [:]
var i = 1
for number in contact.phoneNumbers {
if number.label != nil {
numbers[number.label!] = number.value.stringValue
} else {
numbers["unknown #(i)"] = number.value.stringValue
i += 1
}       
}
return numbers
}

你可以随时为它添加自己的口味和风格。我会把编写getEmailAddressesFromContact函数的工作留给你:(

所以你的最后一节generateModelArray课可能看起来像这样-

class func generateModelArray() -> [ContactStruct]{
let contactStore = CNContactStore()
var contactsData = [ContactStruct]()
let key = [CNContactGivenNameKey,CNContactFamilyNameKey,CNContactImageDataKey,CNContactThumbnailImageDataKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNLabelPhoneNumberMobile] as [CNKeyDescriptor]
let request = CNContactFetchRequest(keysToFetch: key)
try? contactStore.enumerateContacts(with: request, usingBlock: { (contact, stoppingPointer) in
let givenName = contact.givenName
let familyName = contact.familyName
let emailAddress = getEmailAddressesFromContact(contact) // <--- only changes
let phoneNumber = getPhoneNumbersFromContact(contact) // <--- are here
let identifier = contact.identifier
var image : UIImage?
if contact.thumbnailImageData != nil{
image = UIImage(data: contact.thumbnailImageData!)!
}
contactsData.append(ContactStruct(identifier: identifier, img: image, name: givenName, family: familyName, phone: phoneNumber, email: emailAddress))
})
return contactsData
}

最新更新