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.