2013-05-15 13 views
11

Znalazłem interesujący problem.Prośba FBSessionNewPublishPermissions, jak obsługiwać akcję "Pomiń" użytkownika

Gdy żądam nowych uprawnień do publikowania, fb sdk wyświetla okno dialogowe z przyciskiem "Pomiń". mam posługiwaniu się nim jak ten

 

     [[[appDelegate facebook] session] requestNewPublishPermissions:permissions 
                 defaultAudience:FBSessionDefaultAudienceEveryone 
                completionHandler:^(FBSession *session, NSError *error) 
     { 
      if (!error) 
      { 
        //do smth if there is no error 
      } 
     }]; 

Ale gdy użytkownik nacisnął „Pomiń” wewnątrz okna - błąd jest zerowa.

Jak sobie z tym poradzić? Może nie rozumiem czegoś. Thx.

+0

wiem kto frack downvoted to ... uratowałeś mi tyłek. –

+0

znaleziono ten sam problem. Okno dialogowe Facebook pokazuje przycisk "pomiń" znikąd –

Odpowiedz

8

to samo dla mnie, wygląda na to, że to błąd w pakiecie SDK Facebooka, ale nie jestem pewien. Dodałem dodatkowe sprawdzenie, czy sesja ma nowe uprawnienia.

- (void)postToFacebookWithMessage:(NSString *)message completionBlock:(void (^)(NSError *))completionBlock 
    { 
     NSArray *permissions = @[@"publish_actions"]; 

     void (^completionHandler)(FBSession *session, NSError *error) = ^(FBSession *session, NSError *error) { 
      if (error != nil) 
      { 
       if (completionBlock != nil) 
       { 
        completionBlock(error); 
       } 
      } 
      else if(![self activeSessionHasPermissions:permissions]) 
      { 
       NSError *error = [NSError errorWithDomain:@"Facebook" code:FBAccessDisabledCode userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Facebook access disabled", @"Facebook access disabled")}]; 
       if (completionBlock != nil) 
       { 
        completionBlock(error); 
       } 
      } 
      else 
      { 
       NSMutableDictionary<FBGraphObject> *action = [FBGraphObject graphObject]; 
       action[@"message"] = message; 

       [FBRequestConnection startForPostWithGraphPath:@"me/og.posts" graphObject:action completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
        // internal error 1611231 means that this was already posted 
        if (error.code == 5) 
        { 
         error = [NSError errorWithDomain:@"Facebook" code:FBDuplicateActionErrorCode userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Already posted to Facebook", @"Already posted to Facebook")}]; 
        } 

        if (completionBlock != nil) 
        { 
         completionBlock(error); 
        } 
       }]; 
      } 
     }; 

     if ([self activeSessionHasPermissions:permissions]) 
     { 
      completionHandler([FBSession activeSession], nil); 
     } 
     else 
     { 
      [[FBSession activeSession] requestNewPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone completionHandler:completionHandler]; 
     } 
    } 

    - (BOOL)activeSessionHasPermissions:(NSArray *)permissions 
    { 
     __block BOOL hasPermissions = YES; 
     for (NSString *permission in permissions) 
     { 
      NSInteger index = [[FBSession activeSession].permissions indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
       if ([obj isEqualToString:permission]) 
       { 
        *stop = YES; 
       } 
       return *stop; 
      }]; 

      if (index == NSNotFound) 
      { 
       hasPermissions = NO; 
      } 
     } 
     return hasPermissions; 
    } 

nadzieję, że pomoże

+2

jesteś mężczyzną koleś. Nie wiem, kto to zrobił, biorąc pod uwagę, że nawet przykładowa aplikacja Scrumptious z Facebooka cierpi z tego powodu. Nie spodziewałem się takiego poziomu plebeju w przykładowej aplikacji. –

+5

Możesz po prostu sprawdzić [[FBSession activeSession] .permissions zawieraObject: @ "publish_actions"] dla true, zamiast używać metody activeSessionHasPermissions: napisano metodę @evfemist. –