Aus irgendeinem seltsamen Grund hat Facebook beschlossen, Abschlussbehandler zu erstellen, die tatsächlich nur Benachrichtigungsbeobachter sind. Unabhängig davon, warum sie das tun, brauche ich eine Möglichkeit, eine Anfrage zum Öffnen einer FBSession zu stellen und nur einmal einen Callback auszulösen, weil die Objekte im Callback NICHT beibehalten werden dürfen.
Wenn der Benutzer eine Schaltfläche drückt und keine Facebook-Sitzung mit den Berechtigungen "publish_actions" geöffnet ist, sollte ein Aktivitätsindikator angezeigt und die Interaktion mit der Benutzeroberfläche verhindert werden, während eine Facebook-Sitzung geöffnet ist.
Hier ist die Methode, die verwendet wird, um sich bei Facebook anzumelden:
- (void)beiFacebookAnmeldenVonViewController:(UIViewController *)viewController completion:(void (^)(NSString *facebookAccountName))completion
{
if([self istBeiFacebookAngemeldet] == NO)
{
[viewController startLoadingAnimation];
[FBSession openActiveSessionWithPublishPermissions: @[ @"publish_actions" ] defaultAudience:FBSessionDefaultAudienceFriends allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
{
if(error == nil)
{
[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id user, NSError *error)
{
NSString *accountName = [user name];
if(error == nil)
{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
[standardUserDefaults setObject:accountName forKey:TSFacebookAccountName];
[standardUserDefaults synchronize];
}
[viewController stopLoadingAnimation];
if(completion != nil)
completion(accountName);
}];
}
else
{
[viewController stopLoadingAnimation];
if(completion != nil)
completion(nil);
}
}];
}
else
{
if(completion != nil)
completion([self facebookAccountName]);
}
}
Wenn der Abschlussbehandler nicht beibehalten wurde (wieder aus Gründen, die absolut keinen Sinn ergeben, weil NSNotifications gepostet werden, wenn sich die Sitzungszustände ändern), dann würde diese Methode perfekt funktionieren.
Weil die App nicht um Facebook dreht, habe ich kein Interesse daran, wann sich der Sitzungszustand ändert. Wenn der Benutzer versucht, etwas auf Facebook zu teilen und die aktive Sitzung nicht geöffnet ist, wird der Anmeldevorgang ausgelöst, und wenn eine Sitzung geöffnet ist, wird der Freigabevorgang fortgesetzt. Andernfalls wird eine Fehlermeldung dem Benutzer angezeigt.
Könnte mir jemand erklären, wie Facebook erwartet, dass diese Art von Funktionalität implementiert wird, denn es scheint sich um einen recht häufigen Anwendungsfall zu handeln, und bevor jemand fragt "warum verwenden Sie nicht die Standard-Facebook-Dialoge", liegt das daran, dass eine benutzerdefinierte Benutzeroberfläche präsentiert werden muss, um spezifische Informationen zur Verwendung bei Open Graph-Beiträgen zu sammeln.