2017-01-25 3 views
0

Я хочу проверить, существует ли контакт и изменить его номер телефона, если это произойдет.iOS ABAddressBook Как изменить существующий номер телефона?

Я пытался сделать это, и получил exc_bad_access в последней строке кода:

if doesPersonExistWithFirstName(firstName: "Call Recorder", inAddressBook: adbk) 
     { 
      let existingContact: ABRecord! = ABAddressBookGetPersonWithRecordID(adbk, recordID).takeRetainedValue() 
      var success: Bool = false 
      let phoneNumbers: ABMutableMultiValue = ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType)).takeRetainedValue() 
      var error: Unmanaged<CFError>? = nil 

      success = ABMultiValueAddValueAndLabel(phoneNumbers, recordServicePhoneNumber!, kABPersonPhoneMainLabel, nil) 
      print("setting phone number successful? \(success)") 
      success = ABRecordSetValue(existingContact, kABPersonPhoneProperty, phoneNumbers, &error) 
      print("adding phone numbers successful? \(success)") 

      success = ABAddressBookAddRecord(adbk, existingContact, &error) 
      print("Adbk addRecord successful? \(success)") 
      success = ABAddressBookSave(adbk, &error) 
      print("Adbk Save successful? \(success)") 
     } 
     else 
     { 
      let newContact: ABRecord! = ABPersonCreate().takeRetainedValue() 
      var success: Bool = false 
      let newFirstName: NSString = "Call Recorder" 
      let image: UIImage = UIImage(named: "record")! 
      let imageData = UIImagePNGRepresentation(image) 
      let phoneNumbers: ABMutableMultiValue = ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType)).takeRetainedValue() 
      var error: Unmanaged<CFError>? = nil 

      success = ABRecordSetValue(newContact, kABPersonFirstNameProperty, newFirstName as CFTypeRef, &error) 
      print("setting first name was successful? \(success)") 
      success = ABMultiValueAddValueAndLabel(phoneNumbers, recordServicePhoneNumber!, kABPersonPhoneMainLabel, nil) 
      print("setting phone number successful? \(success)") 
      success = ABPersonSetImageData(newContact, imageData as CFData!, &error) 
      print("setting image successful? \(success)") 
      success = ABRecordSetValue(newContact, kABPersonPhoneProperty, phoneNumbers, &error) 
      print("adding phone numbers successful? \(success)") 
      success = ABAddressBookAddRecord(adbk, newContact, &error) 
      print("Adbk addRecord successful? \(success)") 
      success = ABAddressBookSave(adbk, &error) 
      print("Adbk Save successful? \(success)") 
     } 
    } **// I get exception here** 

код работает, номер телефона правильно меняется, но приложение падает каждый раз, когда я запустить его.

UPD: Я побежал зомби инструмент, и он дал мне это:

An Objective-C message was sent to a deallocated 'CPRecord' object (zombie) at address: 0x7c6a3200. 

UPD2: я узнал, эта линия падает приложение:

let existingContact: ABRecord! = ABAddressBookGetPersonWithRecordID(adbk, recordID).takeRetainedValue() 

Что может быть проблема?

+0

Что ошибка вы получаете в отладочной области? –

+0

В области отладки нет ошибок – BadCodeDeveloper

+0

Добавить проверку доступности перед получением результата, ABRecord устарел в ios9, а CPRecord теперь доступен для быстрого доступа. Это то, что зомби говорит, что вы получаете CPRecord как ABRecord. Просьба проверить это, может это вам поможет. Кроме того, добавив доступность, вы можете проверить, работает ли этот код для существующей iOS или нет. :) –

ответ

0

Проблема была в этой линии, как я подумал:

let existingContact: ABRecord! = ABAddressBookGetPersonWithRecordID(adbk, recordID).takeRetainedValue() 

Я так теперь он использует ABRecord вместо ABRecordID для доступа к требуемой записи изменил мою функцию.

Исправлен код:

if doesPersonExistWithFirstName(firstName: "Call Recorder", inAddressBook: adbk) 
     { 
      var success: Bool = false 
      let phoneNumbers: ABMutableMultiValue = ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType)).takeRetainedValue() 
      var error: Unmanaged<CFError>? = nil 

      success = ABMultiValueAddValueAndLabel(phoneNumbers, recordServicePhoneNumber!, kABPersonPhoneMainLabel, nil) 
      print("setting phone number successful? \(success)") 
      success = ABRecordSetValue(existingContact, kABPersonPhoneProperty, phoneNumbers, &error) 
      print("adding phone numbers successful? \(success)") 
      success = ABAddressBookAddRecord(adbk, existingContact, &error) 
      print("Adbk addRecord successful? \(success)") 
      success = ABAddressBookSave(adbk, &error) 
      print("Adbk Save successful? \(success)") 
     } 
     else 
     { 
      let newContact: ABRecord! = ABPersonCreate().takeRetainedValue() 
      var success: Bool = false 
      let newFirstName: NSString = "Call Recorder" 
      let image: UIImage = UIImage(named: "record")! 
      let imageData = UIImagePNGRepresentation(image) 
      let phoneNumbers: ABMutableMultiValue = ABMultiValueCreateMutable(ABPropertyType(kABMultiStringPropertyType)).takeRetainedValue() 
      var error: Unmanaged<CFError>? = nil 

      success = ABRecordSetValue(newContact, kABPersonFirstNameProperty, newFirstName as CFTypeRef, &error) 
      print("setting first name was successful? \(success)") 
      success = ABMultiValueAddValueAndLabel(phoneNumbers, recordServicePhoneNumber!, kABPersonPhoneMainLabel, nil) 
      print("setting phone number successful? \(success)") 
      success = ABPersonSetImageData(newContact, imageData as CFData!, &error) 
      print("setting image successful? \(success)") 
      success = ABRecordSetValue(newContact, kABPersonPhoneProperty, phoneNumbers, &error) 
      print("adding phone numbers successful? \(success)") 
      success = ABAddressBookAddRecord(adbk, newContact, &error) 
      print("Adbk addRecord successful? \(success)") 
      success = ABAddressBookSave(adbk, &error) 
      print("Adbk Save successful? \(success)") 
     } 

existingContacts реализация:

var existingContact: ABRecord! = ABPersonCreate().takeRetainedValue() 
func doesPersonExistWithFirstName(firstName paramFirstName: String, 
             inAddressBook addressBook: ABAddressBook) -> Bool 
    { 
     let people = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray as [ABRecord] 
     for person: ABRecord in people 
     { 
      let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as! String 
      if firstName == paramFirstName 
      { 
       existingContact = person 
       return true 
      } 
     } 
     return false 
    } 
Смежные вопросы