【问题标题】:iOS ABAddressBook How to change existing phone number?iOS ABAddressBook 如何更改现有电话号码?
【发布时间】:2017-01-25 11:19:33
【问题描述】:

我想检查联系人是否存在,如果存在则更改其电话号码。

我尝试这样做,并在最后一行代码中得到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()

可能是什么问题?

【问题讨论】:

  • 你在调试区遇到什么错误?
  • 调试区没有错误
  • 在获取结果之前添加可用性检查,ABRecord 在 ios9 中已弃用,CPRecord 现在可用于 swift。这就是僵尸所说的,您正在以 ABRecord 的形式接收 CPRecord。请检查这个,它会帮助你。此外,通过添加可用性,您可以测试此代码是否适用于您现有的 iOS。 :)
  • 我按你说的添加了可用性检查,应用仍然崩溃:(

标签: ios swift abaddressbook


【解决方案1】:

问题出在我想的这一行:

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
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多