2012-09-24 10 views
14

Questo codice ha funzionato correttamente su iOS 5.1 e funziona anche nel simulatore iPhone con iOS 6. Fallisce silenziosamente sul mio iPhone 4 con iOS 6. Il risultato finale è che io non è possibile aggiungere una persona all'app Contatti. Nessuno dei lavori frammenti seguente codice (log segue ogni):Impossibile accedere alle origini dei contatti sul dispositivo in iOS 6

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(_addressBook); 
NSLog(@"2 - defaultSource = %@", defaultSource); 

AB: Non è stato possibile compilare dichiarazioni per la query (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELEZIONA ROWID, Nome, ExternalIdentifier, Tipo, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Abilitato, SyncData, MeIdentifier, Funzionalità da ABStore WHERE Enabled =?;

2012-09-24 11: 00: 36,731 QR vCard [193: 907] 2 - defaultSource = (CPRecord: 0x1f59fd50 ABStore)

Quando provo ad aggiungere una persona alla Rubrica ho questa (sembra essere perché la fonte non è valida, anche se sembra che potrebbe essere OK da quanto sopra):

2012-09-24 11: 18: 32.231 QR vCard [220: 907] ABAddressBookAddRecord error = L'operazione couldn essere completato (Errore ABAddressBookErrorDomain 1.)


pensavo di poter ottenere tutte le fonti e poi sceglierne uno, ma il seguente rendimenti del tutto assenti:

CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources (_addressBook); 
NSLog(@"2 - allSources = %@", allSources); 

AB: non potrebbe compilare dichiarazioni per la query (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELEZIONA ROWID, Nome, ExternalIdentifier, Tipo, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Funzionalità da ABStore WHERE Enabled =?;

2012-09-24 10: 58: 09,908 QR vCard [177: 907] 2 - allSources =()

+0

Ho scoperto che in iOS 6 è necessario PERMESSO da parte dell'utente per aggiungere una persona a AddressBook. Apple ci protegge di nuovo. Aggiunge alla complessità del codice ... –

risposta

3

Questo messaggio di log è un'indicazione che la vostra applicazione non (forse non ancora) è consentito l'accesso Contatti. iOS 6 offre agli utenti la possibilità di negare alle app il permesso di accedere alla rubrica.

Il messaggio scompare dopo che l'utente ha consentito all'app di accedere ai Contatti, tramite la finestra di dialogo a comparsa o andando su Impostazioni -> Privacy -> Contatti.

Per ulteriori informazioni su questo argomento, consultare la sessione 710 del WWDC 2012 "Supporto della privacy in iOS e OS X".

+0

il tuo suggerimento è di risparmiare un sacco di tempo.grazie – Anju

24

Ho riscontrato lo stesso problema e non è stato possibile richiamare l'avviso Consenti accesso a contatti.

La risposta è stato pubblicato da Kyle qui: https://stackoverflow.com/a/12648938/480415

// Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
      // First time access has been granted, add the contact 
    }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add the contact 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user to change privacy setting in settings app 
    } 
0

Se è arrivato qui da Google e si sta utilizzando il nuovo quadro di iOS CNContactStore, e ottenere questi errori, continua a leggere:

I pensato che sarebbe stato più pulito per rendere al mio account di depositare un variabile membro inizializzata con l'istanza della classe:

class foo { 
    var contactStore = CNContactStore() 

    func findByIdentifier(identifier: String) -> CNContact { 
     let contact = try self.contactStore.unifiedContactWithIdentifier(identifier... 
     return contact 
    } 
} 

dopo ho chiamato questo una cinquantina di volte, è iniziato erroring con

AB: Impossibile compilare dichiarazioni per la query (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties)

ho provato rate-limiting mie chiamate, ma che non ha Aiuto. Si è scoperto che istanziare un nuovo CNContactStore per ogni chiamata avuto zero ramificazioni prestazioni e completamente risolto il problema per me:

class foo { 

    func findByIdentifier(identifier: String) -> CNContact { 
     let contactStore = CNContactStore() 
     let contact = try contactStore.unifiedContactWithIdentifier(identifier... 
     return contact 
    } 
} 

Spero che questo aiuti!