Search code examples
iosiphoneswiftabaddressbook

App crashing while fetching contact numbers from iPhone in SWIFT


I am trying to get the contacts using the following code:

var addressBook: ABAddressBook!
let addressBookRef: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()

var arrContacts = [""]
var personNameContactNo:[String: String] = ["":""]
var arrOfDictContacts = NSMutableArray()
var Name: String!

    if let people = ABAddressBookCopyArrayOfAllPeople(addressBook)?.takeRetainedValue() as? NSArray {

        for person in people{
            if let name = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as? String {
                Name = name
            }
            let numbers:ABMultiValue = ABRecordCopyValue(
                person, kABPersonPhoneProperty).takeRetainedValue()
            var number = ABMultiValueCopyValueAtIndex(numbers,0).takeRetainedValue() as! String

            println("number = \(number)")

            if(number.isEmpty) {
                println("empty")
            } else {
                personNameContactNo.removeAll(keepCapacity: true)
                personNameContactNo.updateValue(number, forKey:Name)
                arrOfDictContacts.addObject(personNameContactNo)
            }
            println(personNameContactNo)
        }
        println(arrOfDictContacts)
    }

what am expecting is: ["Arun":"123455"], ["John":"23456122"], etc...

It runs good in simulator but not on device. maybe it is due to some nil value. The app crashes with following msg: fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

Crashing Image


Solution

  • Try; this should solve your problem.

    var addressBookRef: ABAddressBookRef = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()
    
    var arrOfDictContacts:NSMutableArray = NSMutableArray()
    
    let people:NSArray = ABAddressBookCopyArrayOfAllPeople(addressBookRef).takeRetainedValue();
    
    for person in people{
            if  let name:String = ABRecordCopyValue(person, kABPersonFirstNameProperty)?.takeRetainedValue() as? String {
                let numbers:ABMultiValue = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue()
    
    //                if (ABMultiValueGetCount(numbers) > 0) {  //This condition is optional because using '?' before calling takeRetainedValue
                    if let number:String = ABMultiValueCopyValueAtIndex(numbers,0)?.takeRetainedValue() as? String {
                        println("number = \(number)");
                        arrOfDictContacts.addObject(["\(name)":"\(number)"]);
                    }
    //                }
            }
    }
    //--
    println(arrOfDictContacts);