L'accès iOS Carnet d'Adresses avec Swift: array nombre de zéro

Je suis en train d'écrire une méthode simple de demander à un utilisateur pour l'accès à leur carnet d'adresse et ensuite, imprimez le nom de chaque personne dans le carnet d'adresses. J'ai vu un certain nombre de tutoriels expliquant comment faire en objective-C, mais vais avoir du mal à les convertir à swift.

Voici ce que j'ai fait jusqu'à présent. Le bloc ci-dessous coule dans mon viewDidLoad() la méthode et vérifie si l'utilisateur a l'autorisation d'accéder au carnet d'adresses ou pas, si ils n'ont pas autorisé l'accès encore, le premier si-déclaration de demander l'accès. Cette section fonctionne comme prévu.

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()
        }

Une fois, je sais que l'utilisateur a accès, je lance le getContactNames() méthode qui est ci-dessous. Après beaucoup de va-et-vient, j'ai enfin réussi à obtenir ce pour compiler en ajoutant le takeRetainedValue() méthode pour convertir le tableau retourné par ABAddressBookCopyArrayOfAllPeople non géré à partir d'un tableau à une matrice, ensuite, cela me permet de convertir le CFArrayRef à un NSArray.

La question, je suis en cours d'exécution, c'est que le contactList tableau finit par avoir un nombre de 0 et la boucle donc a sauté. Dans mon simulateur, le carnet d'adresses a 6 ou 7, les enregistrements, donc je m'attends à ce que la matrice soit de cette longueur. Des idées?

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)")
        }
    }

Un point supplémentaire - si j'utilise le ABAddressBookGetPersonCount méthode, il renvoie -1.

 var count: CFIndex = ABAddressBookGetPersonCount(addressBook);
        println("records in the array \(count)") // returns -1

Basée sur ce lien ABAddressBookGetPersonCount retourne -1 en iOS, il semble que cette fonction renvoyant -1 pourraient être liés à accorder, mais je doute avoir demandé la permission dans le code ci-dessus (et accordé quand je lance l'application dans le simulateur)

  • Avez-vous essayé cette stackoverflow.com/a/12603213/2429147 ?
  • Merci, j'ai effectivement trouver que plus tôt, mais n'a pas résolu mon problème. Ci-dessus vous permet de réinitialiser l'autorisation que vous avez accordé l'application, afin de tester la partie de l'application.
  • avez-vous un peu d'avance avec le carnet d'adresses?
  • Est addressBook obtenir une quelconque valeur? Je devine ABAddressBookCreateWithOptions() est défectueux en quelque sorte.
  • John, je pense que vous avez probablement raison. La recherche dans le débogueur après le "ABAddressBookCreateWithOptions()" la méthode est exécutée dans getContactNames() la méthode affiche "carnet d'adresses = (Swift.bool)faux, valeur = (Builtin.int1)0"
  • Pour ceux qui ont encore de le regarder, j'ai juste ajouté de la solution de travail, vous pouvez copier & utiliser.

InformationsquelleAutor user1031648 | 2014-07-15