1

在 iOS 中,可以为电话号码和电子邮件地址创建自定义标签。有没有办法以编程方式删除这些创建的标签(使用 CNContacts 或 ABAddressBook)?换句话说:我不想从联系人中删除自定义标签,我想从系统中删除“自定义标签”,这样当有人提出可用列表时它根本不会出现。

附加的 iOS 9 源代码可在电话簿中创建联系人,并在电子邮件字段上使用自定义标签。

func createContact() {

    let contactStore = CNContactStore()
    let newContact = CNMutableContact()

    newContact.givenName = "Chris"
    newContact.familyName = "Last"

    let homeEmail = CNLabeledValue(label: "RandomLabel", value: "IGotAnEmail@Address.com")
    newContact.emailAddresses = [homeEmail]

    do {
        let saveRequest = CNSaveRequest()
        saveRequest.addContact(newContact, toContainerWithIdentifier: nil)
        try contactStore.executeSaveRequest(saveRequest)
    }
    catch {
        NSLog("Save failed")
    }
}
4

1 回答 1

0

联系框架 + deleteContact

可能会帮助你。

使用此功能

编辑:我过得很好:

NSOperationQueue().addOperationWithBlock{[unowned store] in
  let predicate = CNContact.predicateForContactsMatchingName("john")
  let toFetch = [CNContactEmailAddressesKey]

  do{

    let contacts = try store.unifiedContactsMatchingPredicate(predicate,
      keysToFetch: toFetch)

    guard contacts.count > 0 else{
      print("No contacts found")
      return
    }

    //only do this to the first contact matching our criteria
    guard let contact = contacts.first else{
      return
    }

    let req = CNSaveRequest()
    let mutableContact = contact.mutableCopy() as! CNMutableContact
    req.deleteContact(mutableContact)

    do{
      try store.executeSaveRequest(req)
      print("Successfully deleted the user")

    } catch let e{
      print("Error = \(e)")
    }

  } catch let err{
    print(err)
  }
}

编辑:看起来你可以,但你需要做这样的批处理功能:

  • 使用 AddressBook/ABAAddressBookCopyArrayOfAllPeople 获取联系人
  • 对于...进入联系人
  • 获取 ABRecordCopyValue 以获取您想要的 ABMultiValueRef
    • kABPerson电子邮件属性
    • kABPersonAddress 属性
    • kABPersonPhoneProperty
  • 对于...进入他们
  • 使用 ABMultiValueCopyLabelAtIndex 获取当前值
  • 将其与默认标签进行比较(注意此处获取默认标签)
  • 如果不匹配,删除它

希望对你有帮助

编辑 2:嗯,ABAddressBook 已弃用,您需要对新联系人框架执行相同操作...玩得开心!

于 2015-10-05T13:38:49.723 回答