Я хочу проверить, существует ли контакт и изменить его номер телефона, если это произойдет.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()
Что может быть проблема?
Что ошибка вы получаете в отладочной области? –
В области отладки нет ошибок – BadCodeDeveloper
Добавить проверку доступности перед получением результата, ABRecord устарел в ios9, а CPRecord теперь доступен для быстрого доступа. Это то, что зомби говорит, что вы получаете CPRecord как ABRecord. Просьба проверить это, может это вам поможет. Кроме того, добавив доступность, вы можете проверить, работает ли этот код для существующей iOS или нет. :) –