Z jakiegoś dziwnego powodu Facebook zdecydował się na tworzenie programów obsługi zakończeń, które w rzeczywistości są tylko obserwatorami powiadomień. Ignorując, dlaczego to robią, potrzebuję jakiegoś sposobu, aby złożyć wniosek o otwarcie sesji FBS i mieć wywołanie zwrotne tylko raz, ponieważ obiekty wewnątrz wywołania zwrotnego NIE mogą zostać zachowane.Jak otworzyć FBSession z procedurą obsługi zakończenia, która nie zostanie zachowana i wywołana przy każdej zmianie stanu sesji?
Jeśli użytkownik naciśnie przycisk, a sesja na Facebooku z opcjami "publish_actions" nie jest otwarta, powinien zostać wyświetlony wskaźnik aktywności i uniemożliwić interakcję z interfejsem użytkownika podczas otwierania sesji Facebook.
Oto metoda, która jest używana do logowania na Facebooku:
- (void)loginToFacebookFromViewController:(UIViewController *)viewController completion:(void (^)(NSString *facebookAccountName))completion
{
if([self isLoggedIntoFacebook] == 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<FBGraphUser> 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]);
}
}
Jeśli procedura obsługi zakończenie nie była zachowana (ponownie z powodów, które sprawiają, że nie niecodzienna sens, ponieważ NSNotifications są księgowane po zmianie stany sesja) wtedy ta metoda doskonale by działała.
Ponieważ aplikacja nie krąży wokół Facebooka, nie interesuje mnie, kiedy zmienia się stan sesji. Jeśli użytkownik spróbuje udostępnić coś na Facebooku, a aktywna sesja nie zostanie otwarta, proces logowania zostanie uruchomiony, a jeśli sesja zostanie otwarta, proces udostępniania będzie kontynuowany. W przeciwnym razie użytkownikowi zostanie wyświetlony komunikat o błędzie.
Czy ktoś mógłby wyjaśnić, w jaki sposób Facebook spodziewa się, że tego rodzaju funkcjonalność zostanie zaimplementowana, ponieważ wydaje się być dość powszechnym przypadkiem użycia i zanim ktoś wspomina "dlaczego nie używasz domyślnych okien dialogowych na Facebooku", to dlatego, że niestandardowy interfejs użytkownika musi być przedstawiane użytkownikowi w celu zebrania konkretnych informacji używanych dla postów Open Graph.
Wolałbym rozwiązanie, które nie wymagałoby wielu deklaracji metod i dodawania/usuwania wywołań obserwatora. Dla uproszczenia szukam sposobu na obsłużenie całej mojej logiki wewnątrz metody someActionRequiringFacebookAuth. –