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()
有什么可以的问题?
什么是错误您得到在调试区? –
调试区域没有错误 – BadCodeDeveloper
在获得结果之前添加可用性检查,ABRecord在ios9中已弃用,并且CPRecord现在可用于swift。 这就是僵尸说你正在接收CPRecord作为ABRecord。请检查一下,可否帮助你。另外通过增加可用性,您可以测试此代码是否适用于您现有的iOS。 :) –