Accessing iOS Address Book with Swift: array count of zero

前端 未结 9 697
陌清茗
陌清茗 2020-12-02 13:05

I am trying to write a simple method to ask a user for access to their address book and then print out the name of each person in the address book. I\'ve seen a number of tu

9条回答
  •  眼角桃花
    2020-12-02 13:39

    If anyone is also trying to get the email addresses of the contacts, I found that I needed to create two additional methods similar to the new one Wes showed.

    Here's the updated version of the getContactNames() function:

     func getContactNames()
        {
            var errorRef: Unmanaged?
            addressBook = extractABAddressBookRef(ABAddressBookCreateWithOptions(nil, &errorRef))
    
            var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
            println("records in the array \(contactList.count)")
    
            for record:ABRecordRef in contactList {
                var contactPerson: ABRecordRef = record
    
                var contactName: String = ABRecordCopyCompositeName(contactPerson).takeRetainedValue() as NSString
                println ("contactName \(contactName)")
    
                var emailArray:ABMultiValueRef = extractABEmailRef(ABRecordCopyValue(contactPerson, kABPersonEmailProperty))!
    
                for (var j = 0; j < ABMultiValueGetCount(emailArray); ++j)
                {
                    var emailAdd = ABMultiValueCopyValueAtIndex(emailArray, j)
                    var myString = extractABEmailAddress(emailAdd)
                    println("email: \(myString)")
                }
            }
        }
    

    And here are the two additional functions I created:

      func extractABEmailRef (abEmailRef: Unmanaged!) -> ABMultiValueRef? {
            if let ab = abEmailRef {
                return Unmanaged.fromOpaque(ab.toOpaque()).takeUnretainedValue()
            }
            return nil
        }
    
    func extractABEmailAddress (abEmailAddress: Unmanaged!) -> String? {
        if let ab = abEmailAddress {
            return Unmanaged.fromOpaque(abEmailAddress.toOpaque()).takeUnretainedValue() as CFStringRef
        }
        return nil
    }
    

    Thanks again to Wes for his help on my initial question which helped me figure the above out.

提交回复
热议问题