7 Stimmen

FaceBook iOS - Prüfen, ob meine Facebook-App bereits autorisiert ist

Meine Frage ist, wie ich überprüfen kann, ob meine FaceBook-App bereits für Beiträge des Benutzers autorisiert ist, ich kann dazu keine Informationen finden.

Ich benutze:

 Facebook* facebook = [[Facebook alloc] initWithAppId:@"1234567"];
 [facebook authorize:[NSArray arrayWithObjects:@"read_stream", @"offline_access",nil] delegate:self];

Es erscheint ein Dialog, in dem ich aufgefordert werde, die App zu autorisieren, danach ist alles in Ordnung und ich kann ein:

 [facebook dialog:@"feed" andDelegate:self];

um Notizen in dieser App zu veröffentlichen.

Aber, wenn der Benutzer blockiert oder entfernt die app, die ich tun möchten, die autorisieren wieder vor der Anzeige des Dialogs für die Buchung, kann nicht finden, einen Weg, um diese Art von Informationen vor dem Aufruf autorisieren.

Für jede Hilfe sind wir dankbar.

Danke.

3voto

carlos Punkte 2504

Auch ich hatte mit diesem Problem zu kämpfen.

Wenn Sie die Dialogmethode aufrufen, senden Sie einen Delegaten, der dem FBDialogDelegate entsprechen sollte, der eine Methode hat, die aufgerufen wird, wenn der Dialog aufgrund eines Fehlers nicht geladen werden kann. Wenn die App jedoch nicht autorisiert wurde, zeigt der Dialog dem Benutzer einen Anmeldebildschirm an, aber nach der Eingabe von Benutzer und Passwort erscheint ein zweites Formular, das den Benutzer darüber informiert, dass ein Fehler aufgetreten ist. Der Delegat wird ebenfalls aufgerufen, aber die erhaltene Fehlermeldung besagt nur, dass die Methode fehlgeschlagen ist, ohne genauen Grund oder gar eine Fehlernummer. Diese Methode sollte zunächst mit dem richtigen Fehler aufgerufen werden, damit die Anwendung entsprechend reagieren kann.

Ich habe also eine Lösung gefunden, die vielleicht nicht die beste ist, aber auf jeden Fall funktioniert. Jeder Aufruf, den Sie tun, um die Facebook-Graph-Api über eine Anforderung, wird fehlschlagen, wenn die App vom Benutzer nicht autorisiert wurde. Also, was ich tat, war zu überprüfen, dass vor dem Aufruf der Feed-Dialog-Methode.

Fügen Sie die folgende Zeile an der Stelle ein, an der Sie testen müssen, ob die Anwendung noch autorisiert ist:

if ([facebook isSessionValid])
    //isSessionValid only checks if the access token is set, and the expiration date is still valid. Lets make a call and see if we really are authorized to post to this user from this app.     
    [facebook requestWithGraphPath:@"me" andDelegate:self];
else
    //authorize Facebook connect

Dadurch wird lediglich die Methode aufgerufen, die die grundlegenden Informationen vom Benutzer zurückgibt. Wenn alles in Ordnung ist, wird die folgende Methode vom Delegaten aufgerufen:

- (void)request:(FBRequest *)request didLoad:(id)result
{
   //Everything is ok. You can call the dialog method. It should work.
}

Wenn die App vom Benutzer nicht autorisiert wurde, wird die folgende Methode des Delegaten aufgerufen:

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;
{        
    NSString *type = [[[error userInfo] objectForKey:@"error"] objectForKey:@"type"];

    if (type)
    {
        if ([type isEqualToString:@"OAuthException"]) //aha! 
        {
            //user has unauthorized the app, lets logout from Facebook connect. Also clear the access and expiration date tokens
            [facebook logout:self];

            //Call the authorize method again. Or let the user know they need to authorize the app again.
        }
    }
}

Wie ich bereits sagte, ist das nicht die beste Methode, aber sie erfüllt ihren Zweck. Hoffentlich wird Facebook eine Methode hinzufügen, um dieses spezielle Szenario zu überprüfen, oder eine neue Methode zum Delegaten hinzufügen, die sich mit dem Problem der nicht autorisierten App befasst.

0voto

Anomie Punkte 89467

Ich bin mir nicht sicher, wie man das mit dem SDK von Facebook genau macht, aber Sie können Folgendes verwenden FQL zur Abfrage der Berechtigungen . Die Abfrage-URL würde etwa so aussehen

https://api.facebook.com/method/fql.query?query=SELECT+uid,+read_stream,+offline_access+FROM+permissions+WHERE+uid=me()&access_token=...

Es sieht so aus requestWithMethodName:andParams:andHttpMethod:andDelegate: vorbei an fql.query als Methode ist der richtige Weg, sofern Sie die Möglichkeit haben isSessionValid um wahr zu sein (oder irgendwie zu liefern access_token in den Parametern selbst).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X