2017-01-25 9 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

結果を得る前に可用性チェックを追加してください.iOS9ではABRecordが推奨されておらず、CPRecordはすぐに利用可能です。 これはゾンビがABRecordとしてCPRecordを受け取っていると言っていることです。親切にこれをチェックしてください、それはあなたを助けるかもしれません。また、このコードが既存の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 
    } 
関連する問題