我试图通过IOS9上的新框架Contacts和ContactsUI来操纵联系人。我需要在最终用户更改其信息(如电话号码或电子邮件)后找出确切的差异,即找出最终用户在其地址簿上为指定联系人所做的事情。
如果联系人为每个项目(电话/电子邮件)添加了不同的标签,则会更容易。但是,如果电话或电子邮件的标签相同,我也不知道如何获取差异,例如:
约翰: 电话: 主页:123-456 办公室:223-456 办公室:456-334 电子邮件: 电子邮件:124@email.com 电子邮件:345@google.com
更改后,新信息可以是: 约翰: 电话: 主页:123-456 办公室:223-889(更改项目) 办公室:456-377(更改项目) 电子邮件: 电子邮件:1241111@email.com(更改项目) 电子邮件:3451111 @ google.com(已更改项目)
使用ContactsUI,我可以在更改之前和更改之后捕获两个联系对象。
问题是,如何找到变化?
提前致谢。
答案 0 :(得分:0)
假设您知道如何遍历新phoneNumbers
和emails
以及旧版本的数组。你可以比较一对标签&新旧联系对象之间的值,并确定是否存在新对。
一些未经测试的代码:
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
属性的参考
建议您在重新获取的联系人中搜索以前已知的标记值对象时使用标识符。应用程序启动之间的标识符可以持久。