2013-09-27 6 views
5

Ich habe ein Problem mit dem Zugriff auf das Adressbuch anfordern, da ABAddressbook.Create immer Null ist.Xamarin ios: ABAddressbook.Create immer null, kann keinen Zugriff anfordern

Wie kann ich den Zugriff anfordern?

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

Danke für Hilfe.

+0

NSError err = new NSError(); mit (ABAddressBook ab = ABAddressBook.Create (out err)) { ab.RequestAccess (Delegat {}); } // NACH VERWENDUNG VERWENDET, Was zum Teufel ?! :( – anguish

+0

erhalten Sie einen Wert in Fehler? – Jason

+0

ja "ABAddressBookErrorDomain Fehler 1." – anguish

Antwort

6

Wenn es null ist, dann war etwas falsch und Ihr NSError sollte Ihnen sagen, was es ist (übrigens ist es nicht notwendig, einen out Parameter zu initialisieren).

Im Allgemeinen (iOS6 +) sollte Ihr Code wie folgt aussehen:

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

hat einen "ABAddressBookErrorDomain Fehler 1." Fehler – anguish

+1

Von Apple doc -> 'kABOperationNotPermittedByUserError'. Ist es möglich, die Anwendung wurde bereits Zugriff verweigert durch der Gerätebenutzer? Wenn es ging, überprüfen Sie Ihre Einstellungen, um es wieder zu aktivieren. – poupou

+0

Ja, sobald ich es bekam, antwortete ich mit Nein zum Testen.Aber wenn ich die App lösche, erinnert er sich immer noch an meine Entscheidung für die ganze Zeit? – anguish

0

meine Formel Hier ist mit dieser Situation fertig zu werden.

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

Etwas bessere Fehlerbehandlung ist gerechtfertigt, aber das hängt davon ab, wie Sie damit umgehen wollen. – macawm