2012-11-14 15 views
5

Mi trovo in una situazione in cui ABAddressBookGetPersonCount restituisce -1. Il tester mi assicura che ci sono contatti nella rubrica. Tutti i portatili utilizzano iOS 6.0.1.ABAddressBookGetPersonCount restituisce -1 in iOS

Ecco il codice:

NSMutableDictionary *myAddressBook = [[NSMutableDictionary alloc] init]; 
ABAddressBookRef addressBook = ABAddressBookCreate(); 
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); 
int numEntries = ABAddressBookGetPersonCount(addressBook); 
if (numEntries == 0) 
{ 
    NSString *title = NSLocalizedString(@"error", nil); 
    NSString *description = NSLocalizedString(@"error_empty_contacts", nil); 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title 
                message:description 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    [alert show]; 


    return; 
} 

NSLog(@"emails: found %d", numEntries); 

io non sono in grado di riprodurre questo su uno dei miei telefoni, ma il tester ha provato su 3 portatili. Funziona correttamente su un iPhone 5, ma non su un 4 o 3;

Non riesco a trovare alcun documento che indichi il valore di -1. Suppongo che sia un errore di qualche tipo, ma cosa?

risposta

3

In iOS 6, questo codice non è valido. Devi verificare che la tua app abbia il permesso di accedere alla rubrica. Molto probabilmente, il -1 è un'indicazione che l'app non ha autorizzazioni (o uno stato di autorizzazione sconosciuto) su quei dispositivi.

Dalla documentazione per ABAddressBookRequestAccessCompletionHandler:

CFErrorRef myError = NULL; 
ABAddressBookRef myAddressBook = ABAddressBookCreateWithOptions(NULL, &myError); 
APLViewController * __weak weakSelf = self; // avoid capturing self in the block 
ABAddressBookRequestAccessWithCompletion(myAddressBook, 
    ^(bool granted, CFErrorRef error) { 
    if (granted) { 
     NSArray *theSmiths = CFBridgingRelease(
      ABAddressBookCopyPeopleWithName(myAddressBook, 
      CFSTR("Smith") 
     ) 
     ); 
     weakSelf.numberOfSmiths = [theSmiths count]; 
    } else { 
     // Handle the error 
    } 
}); 
CFRelease(myAddressBook); 

Se è necessario supportare iOS 5.x o 4.x è necessario controllare adeguatamente l'esistenza dei nuovi metodi.

+0

Sto anche ricevendo -1 in iOS 6 nel caso in cui l'utente non abbia ancora toccato un'opzione nella richiesta di privacy sul primo avvio dell'app. In tal caso, ABAddressBookCreateWithOptions restituisce una rubrica valida, ma ABAddressBookGetPersonCount restituisce -1. Una volta che l'utente ha scelto di consentire o negare l'accesso, ABAddressBookCreateWithOptions restituisce la rubrica effettiva o nulla. Sto usando il -1 return per rilevare se l'utente ha concesso l'accesso. – Nicholas

+1

@Nicholas Il modo corretto per verificare è chiamare la funzione 'ABAddressBookGetAuthorizationStatus' e controllarne il valore di ritorno. – rmaddy

+0

Grazie a @rmaddy. Avevo provato prima ma non riuscivo a ottenere dati affidabili da esso. Ora che so di più su come funziona e su come testarlo, sembra darmi quello che ho bisogno di sapere. La risposta riguardante -1 da ABAddressBookGetPersonCount è ancora valida. È piuttosto chiaro, anche se non documentato, che -1 viene restituito quando ABAddressBookGetAuthorizationStatus restituisce kABAuthorizationStatusNotDetermined. – Nicholas

Problemi correlati