iosiphoneswiftabaddressbook

Programmatically add contact in Swift


I want to add a contact (just the name and phone number) programatically in Swift. I've found some Objective-C examples but I didn't get them to work, not even in Objective-C. I don't want this to involve AddressBookUI, because I want to get the values from my own UI.


Solution

  • Here's a quick method to add a contact in Swift. I verified it on my iPhone 5 iOS 7.1 as I've found the simulator doesn't always match the same results as my phone does for AB stuff.

    You can add a button and point to this method:

    @IBAction func createContact(sender: AnyObject) {
        var newContact:ABRecordRef! = ABPersonCreate().takeRetainedValue()
        var success:Bool = false
        var newFirstName:NSString = "AA"
        var newLastName = "a"
    
    //Updated to work in Xcode 6.1
            var error: Unmanaged<CFErrorRef>? = nil
    //Updated to error to &error so the code builds in Xcode 6.1
        success = ABRecordSetValue(newContact, kABPersonFirstNameProperty, newFirstName, &error)
        println("setting first name was successful? \(success)")
        success = ABRecordSetValue(newContact, kABPersonLastNameProperty, newLastName, &error)
        println("setting last name was successful? \(success)")
        success = ABAddressBookAddRecord(adbk, newContact, &error)
        println("Adbk addRecord successful? \(success)")
        success = ABAddressBookSave(adbk, &error)
        println("Adbk Save successful? \(success)")
    
    }//createContact
    

    btw-it assumes you've already got an addressbook var assigned, which you can on opening the view by overriding viewDidAppear. It does the security prompt as well:

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        if !self.authDone {
            self.authDone = true
            let stat = ABAddressBookGetAuthorizationStatus()
            switch stat {
            case .Denied, .Restricted:
                println("no access")
            case .Authorized, .NotDetermined:
                var err : Unmanaged<CFError>? = nil
                var adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, &err).takeRetainedValue()
                if adbk == nil {
                    println(err)
                    return
                }
                ABAddressBookRequestAccessWithCompletion(adbk) {
                    (granted:Bool, err:CFError!) in
                    if granted {
                        self.adbk = adbk
                    } else {
                        println(err)
                    }//if
                }//ABAddressBookReqeustAccessWithCompletion
            }//case
        }//if
    }//viewDidAppear