2013-09-27 18 views
5

Ho un problema con la richiesta di accesso alla rubrica, poiché ABAddressbook.Create è sempre nullo.Xamarin ios: ABAddressbook.Create sempre nullo, impossibile richiedere l'accesso

Quindi, come posso richiedere l'accesso?

NSError err = new NSError(); 
ABAddressBook ab = ABAddressBook.Create(out err) 
ab.RequestAccess (delegate {}); //ab always null 

Grazie per l'aiuto.

+0

NSError err = new NSError(); utilizzando (ABAddressBook ab = ABAddressBook.Create (out err)) { ab.RequestAccess (delegato {}); } // USATO DOPO SMALTIMENTO, Che diavolo ?! :( – anguish

+0

stai ottenendo un valore err? – Jason

+0

sì "ABAddressBookErrorDomain error 1." – anguish

risposta

6

Se è null, allora qualcosa non andava e il tuo NSError dovrebbe dirti di cosa si tratta (non è necessario inizializzare un parametro out).

In generale (iOS6 +) il codice dovrebbe essere simile:

NSError err; 
var ab = ABAddressBook.Create (out err); 
if (err != null) { 
    // process error 
    return; 
} 
// if the app was not authorized then we need to ask permission 
if (ABAddressBook.GetAuthorizationStatus() != ABAuthorizationStatus.Authorized) { 
    ab.RequestAccess (delegate (bool granted, NSError error) { 
     if (error != null) { 
      // process error 
     } else if (granted) { 
      // permission now granted -> use the address book 
     } 
    }); 
} else { 
    // permission already granted -> use the address book 
} 
+0

ottenuto un errore "ABAddressBookErrorDomain 1." – anguish

+1

Da Apple doc -> 'kABOperationNotPermittedByUserError'. È possibile che l'applicazione sia già stata rifiutata l'utente del dispositivo? Se fosse andato controllare le impostazioni per riattivarlo. – poupou

+0

sì, una volta ottenuto, ho risposto con no per testare, ma se cancello l'app, si ricorda comunque la mia decisione per tutto il tempo? – anguish

0

Ecco la mia formula per affrontare questa situazione.

private void RequestAddressBookAccess() 
{ 
    NSError error; 
    ABAddressBook addressBook = ABAddressBook.Create (out error); 
    if (error != null || addressBook == null) 
     ShowAddressBookAccessInstructions(); 

    else if (ABAddressBook.GetAuthorizationStatus() != ABAuthorizationStatus.Authorized) { 
     addressBook.RequestAccess (delegate(bool granted, NSError err) { 
      if (granted && err == null) 
       this.InvokeOnMainThread (() => DoStuff (addressBook)); 
      else 
       ShowAddressBookAccessInstructions(); 
     }); 
    } else 
     DoStuff (addressBook); 
} 

private void ShowAddressBookAccessInstructions() 
{ 
    UIAlertView alert = new UIAlertView ("Cannot Access Contacts", 
     "Go to Settings -> Privacy -> Contacts and allow this app to access your contacts to use this functionality", 
     null, "Ok", null); 
    alert.Show(); 
} 
+0

Qualche migliore gestione degli errori è giustificata, ma dipende da come lo si vuole gestire. – macawm