Acessando o Catálogo de Endereços iOS com Swift: contagem zero de matrizes
Estou tentando escrever um método simples para solicitar a um usuário acesso ao catálogo de endereços e depois imprimir o nome de cada pessoa no catálogo de endereços. Eu já vi vários tutoriais explicando como fazer isso no objetivo-C, mas estou tendo dificuldades para convertê-los para rápidos.
Aqui está o que eu fiz até agora. O bloco abaixo é executado no meu método viewDidLoad () e verifica se o usuário autorizou o acesso ao catálogo de endereços ou não, se ainda não o autorizou, a primeira instrução if solicitará acesso. Esta seção funciona conforme o esperado.
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()
}
Depois que eu souber que o usuário concedeu acesso, eu executo o método getContactNames () que está abaixo. Depois de muito e muito tempo, finalmente consegui compilar isso adicionando o método takeRetainedValue () para converter a matriz retornada por ABAddressBookCopyArrayOfAllPeople de uma matriz não gerenciada em uma matriz gerenciada, isso me permite converter o CFArrayRef em um NSArray.
O problema que estou enfrentando é que a matriz contactList acaba tendo uma contagem de 0 e, portanto, o loop for é ignorado. No meu simulador, o catálogo de endereços tem 6 ou 7 registros, então eu esperaria que o array tivesse esse comprimento. Alguma ideia?
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)")
}
}
Um ponto adicional - se eu usar o método ABAddressBookGetPersonCount, ele retornará -1.
var count: CFIndex = ABAddressBookGetPersonCount(addressBook);
println("records in the array \(count)") // returns -1
Com base neste linkABAddressBookGetPersonCount retorna -1 no iOS, parece que essa função retornando -1 pode estar relacionada à permissão não ser concedida, mas eu definitivamente solicitei permissão no código acima (e concedeu quando executo o aplicativo no simulador)