我试图通过IOS9上的新框架Contacts和ContactsUI操作联系人。我需要找出最终用户更改其信息(例如电话号码或电子邮件)后的确切区别,即找出最终用户在其地址簿中为指定联系人所做的工作。

如果联系人的每个项目(电话/电子邮件)具有不同的标签,则会更容易。但是,如果电话或电子邮件的标签相同,我不知道如何获取差异,例如:

约翰:
  电话:
    家:123-456
    办公室:223-456
    办公室:456-334
  电子邮件:
    电子邮件:[email protected]
    电子邮件:[email protected]

更改后,新信息可以是:
约翰:
  电话:
    家:123-456
    办公室:223-889(更改项)
    办公室:456-377(更改项)
  电子邮件:
    电子邮件:[email protected](更改的项目)
    电子邮件:[email protected](更改项)

使用ContactsUI,我可以捕获更改之前和更改之后的两个联系人对象。

问题是,如何找到更改?

提前致谢。

最佳答案

假设您知道如何遍历新的phoneNumbersemails以及旧的数组。您可以比较新旧联系人对象之间的标签和值对,并确定是否存在新的一对。

一些未经测试的代码:

func findOutContactDifference() {
  // Assume you already have the two contact objects
  let oldContact : CNContact = ...
  let newContact : CNContact = ...

  // Get list of phoneNumbers out
  let oldPhoneNumbers = oldContact.phoneNumbers
  let newPhoneNumbers = newContact.phoneNumbers

  // Iterate through the new phoneNumbers array
  for aNewPhoneNumber in newPhoneNumbers { // Type of aNewPhoneNumber will be CNLabeledValue
    let newPhoneLabel = aNewPhoneNumber.label // This will be a string
    let newPhoneNumber = aNewPhoneNumber.value as! CNPhoneNumber // You have to cast as specified in the document

    let thisPhoneNumberAlreadyExisted = phoneNumberExisted(newPhoneLabel, newNumber : newPhoneNumber, oldPhoneNumbers : oldPhoneNumbers)
    if (!thisPhoneNumberAlreadyExisted) {
      // This is a new phone number!!
      let brandNewNumber = newPhoneNumber
    }
  }

  // Do the similar thing for email
  // Beaware that cast for email.value will just be String
  // ...
}

/// Will return whether the input pair already existed in the old list
func phoneNumberExisted(newLabel : String, newNumber : CNPhoneNumber, oldPhoneNumbers : [CNLabeledValue]) -> Bool {
  for anOldPhoneNumber in oldPhoneNumbers {
    let oldLabel = anOldPhoneNumber.label
    let oldNumber = anOldPhoneNumber.value as! CNPhoneNumber

    if oldLabel == newLabel && oldNumber == newLabel {
      return true // Found a matched pair
    }
  }
  return false // Nothing matched
}


==========

CNLabeledValue value属性的参考


  联系人属性值,例如CNPhoneNumber代表电话号码,NSString代表电子邮件地址,等等。有关有效值,请参见CNContact属性,它们是带有标签的值对象的数组。


编辑

CNLabeledValue identifier属性的参考


  在重新获取的联系人中搜索先前已知的带标签的值对象时,建议您使用标识符。标识符可以在应用程序启动之间保留。

关于ios - iOS9如何找到两个CNContact之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35868567/

10-09 07:12