Я пытаюсь написать простой метод, чтобы попросить пользователя получить доступ к их адресной книге, а затем распечатать имя каждого человека в адресной книге. Я видел несколько руководств, объясняющих, как это сделать в objective-C, но мне трудно преобразовать их в swift.
Вот что я сделал до сих пор. Следующий блок работает в моем методе viewDidLoad() и проверяет, имеет ли пользователь авторизованный доступ к адресной книге или нет, если у них еще нет авторизированного доступа, первый запрос if запрашивает доступ. Этот раздел работает так, как ожидалось.
var emptyDictionary: CFDictionaryRef?
var addressBook: ABAddressBookRef?
if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.NotDetermined)
{
println("requesting access...")
addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
ABAddressBookRequestAccessWithCompletion(addressBook,{success, error in
if success {
self.getContactNames();
}
else
{
println("error")
}
})
}
}
else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Denied || ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Restricted)
{
println("access denied")
}
else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Authorized)
{
println("access granted")
getContactNames()
}
Как только я знаю, что пользователь предоставил доступ, я запустил метод getContactNames(), который ниже. После того, как много назад и вперед, я, наконец, смог получить это, чтобы скомпилировать, добавив метод takeRetainedValue(), чтобы преобразовать массив, возвращенный ABAddressBookCopyArrayOfAllPeople из неуправляемого массива в управляемый массив, тогда это позволяет мне преобразовать CFArrayRef в NSArray.
Проблема, с которой я сталкиваюсь, заключается в том, что массив contactList заканчивается тем, что имеет число 0, и цикл for поэтому пропускается. В моем симуляторе адресная книга имеет 6 или 7 записей, поэтому я ожидаю, что массив будет такой длины. Есть идеи?
func getContactNames()
{
addressBook = !ABAddressBookCreateWithOptions(emptyDictionary,nil)
var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
println("records in the array \(contactList.count)") // returns 0
for record:ABRecordRef in contactList {
var contactPerson: ABRecordRef = record
var contactName: String = ABRecordCopyCompositeName(contactPerson).takeRetainedValue()
println ("contactName \(contactName)")
}
}
Еще одна точка - если я использую метод ABAddressBookGetPersonCount, он возвращает -1.
var count: CFIndex = ABAddressBookGetPersonCount(addressBook);
println("records in the array \(count)") // returns -1
Основываясь на этой ссылке ABAddressBookGetPersonCount возвращает -1 в iOS, похоже, что эта функция, возвращающая -1, может быть связана с предоставлением разрешения, но я определенно спросил для разрешения в приведенном выше коде (и предоставил его при запуске приложения в симуляторе)