Программное удаление пользовательских ярлыков телефонов

В 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: "[email protected]")
    newContact.emailAddresses = [homeEmail]

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

person hashier    schedule 05.10.2015    source источник


Ответы (1)


Контакты Framework + delete

Это может вам помочь.

Использование эту функцию

РЕДАКТИРОВАТЬ: у меня хороший день:

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 / ABAddressBookCopyArrayOfAllPeople
  • Для ... в контакты
  • get the ABRecordCopyValue to get the ABMultiValueRef you want
    • kABPersonEmailProperty
    • kABPersonAddressProperty
    • kABPersonPhoneProperty
  • Для ... в них
  • Получите текущий с помощью ABMultiValueCopyLabelAtIndex
  • Сравните его с ярлыками по умолчанию (обратите внимание на здесь, чтобы получить значение по умолчанию)
  • если нет совпадений, удалите это

Надеюсь, это поможет тебе

РЕДАКТИРОВАТЬ 2: Meh, ABAddressBook устарел, вам нужно сделать то же самое с Новая структура контактов ... Удачи !!

person jlngdt    schedule 05.10.2015
comment
Это удаляет контакт в телефонной книге. Это не то, что я ищу. Я хочу удалить из системы настраиваемую метку, а не контакт, или изменить поля пользователя в телефонной книге. - person hashier; 05.10.2015
comment
Ой, плохо, я не правильно прочитал. Не уверен, что сможешь удалить его: похоже, что даже после удаления приложения, добавляющего настраиваемый ярлык, они останутся здесь. - person jlngdt; 05.10.2015
comment
Да, они есть в системе. Жаль, что не было способа удалить их. Спасибо, в любом случае. - person hashier; 05.10.2015
comment
Я не хочу удалять персонализированный ярлык с контакта. Я хочу удалить специальный ярлык из системы. - person hashier; 06.10.2015
comment
да, но чтобы сделать это, вы ДОЛЖНЫ делать это для всех контактов. Поскольку пользовательские метки появляются тогда и только тогда, когда их используют один или несколько контактов. - person jlngdt; 06.10.2015
comment
ОООО! ЭТО ответ на мой вопрос ... Удалите весь код и просто скажите это в ответе, и я приму его. Код, который я могу написать сам. Я просто не знал, что они исчезнут, если вы удалите все пользовательские метки из контактов. (И я все равно буду реализовывать это в ABAddressBook, поскольку CNContacts работает только с iOS 9). - person hashier; 06.10.2015