2012-06-30 13 views
8

Próbuję przesłać zapytanie o informacje o użytkowniku za pomocą nowego interfejsu API integracji z systemem iOS 6. Jest to kod używam, która jest w zasadzie identyczna co demoed na WWDC:Wywoływanie danych użytkownika Facebooka za pośrednictwem nowego środowiska społecznościowego iOS6

{ 
NSDictionary *parameters = @{}; 
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"]; 
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook 
             requestMethod:SLRequestMethodGET 
                URL:url 
              parameters:parameters]; 
request.account = self.account; 
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
    NSLog(@"Facebook request received, status code %d", urlResponse.statusCode); 
    NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Response data: %@", response); 
    dispatch_async(dispatch_get_main_queue(), ^{ 

    }); 
}]; 
} 

Problem jest Dostaję kod błędu 2500 z Facebooka: „Aktywna token dostępu musi być użyty do uzyskania informacji o bieżący użytkownik. " Jeśli zmienię zapytanie na https://graph.facebook.com/[facebook id], to działa dobrze. Zakładam, że problem polega na tym, że iOS przekazuje token dostępu aplikacji zamiast tokenu dostępu użytkownika podczas wysyłania żądania przez requestForServiceType. Po prostu nie wiem, jak to naprawić. Oczywiście przewidywanie i kodowanie identyfikatorów Facebooka moich użytkowników nie wchodzi w grę. Jakieś sugestie?

+0

Otrzymałeś odpowiedź? Po zwolnieniu iOS 6. –

Odpowiedz

5

dodać swoją aktywną token dostępu w Parametrów jak

NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"PUT_ACCESS_TOKEN_HERE" forKey:@"access_token"]; 
+0

Jak uzyskać ten klucz dostępu w kodzie? Czy proponujesz wprowadzenie rzeczywistego kodu dostępu? Wygląda na to, że kody dostępu wygasają, więc nie byłoby to dobrym rozwiązaniem. – zeeple

0

miałem ten sam komunikat o błędzie, naprawiłem go zapisując moje konto po odnowienie poświadczeń.

2

I w obliczu tego samego problemu i znaleźć rozwiązania:

NSString *uid = [NSString stringWithFormat:@"%@", [[self.account valueForKey:@"properties"] valueForKey:@"uid"]] ;     
NSURL *url = [NSURL URLWithString:[@"https://graph.facebook.com" stringByAppendingPathComponent:uid]]; 
+0

Problem dotyczył nieprawidłowych ustawień aplikacji na FB. Zmieniłem ustawienia zgodnie z tym postem http://stackoverflow.com/questions/12644229/ios-6-facebook-posting-procedure-ends-up-w-remote-app-id-does-not-match-stor/12687305 # 12687305 i rozwiązało problem. – gareg

0

upewnić się, że (ACAccount *) facebookAccount (lub w danym przypadku self.account) obiekt jest silny i go ustawić prawidłowo podczas uzyskiwania uprawnień.

1

OK oto jak zrobić to integrację z systemem iOS 6 i dostać to, czego chcę od Facebooku:

W AppDelegate to zrobić:

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 
    return [FBSession.activeSession handleOpenURL:url]; 
} 
- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [FBSession.activeSession handleDidBecomeActive]; 
} 

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    [FBSession.activeSession close]; 
} 

iw moim ViewController gdzie chcę pobrać informacji o mnie i moich znajomych zrobić to (uwaga: jest to test, więc jest dużo uprawnień!):

NSArray *permissions = 
    [NSArray arrayWithObjects:@"email", @"user_location", 
    @"user_birthday", 
    @"user_likes", @"user_interests",@"friends_interests",@"friends_birthday",@"friends_location",@"friends_hometown",@"friends_photos",@"friends_status", 
    @"friends_about_me", @"friends_birthday", @"friends_hometown", @"friends_interests", @"friends_likes", @"friends_location", nil]; 

    [FBSession openActiveSessionWithReadPermissions:permissions 
             allowLoginUI:YES 
            completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
             /* handle success + failure in block */ 
             if (status) { 
              NSLog(@"Facebook Read Permission is successful!"); 
              [self presentPostOptions]; 

              // [self presentPostOptions]; 


             } 
            }]; 

Następnie w „presentPostOptions” mogę to zrobić (w tym przykładzie staram odzyskać coś z moim przyjacielem):

- (void)presentPostOptions 
{ 

    [[FBRequest requestForMyFriends] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) 

    { 

     if (!error) { 

NSArray *data = [user objectForKey:@"data"]; 
      NSLog(@"%d", [data count]); 
      for (FBGraphObject<FBGraphUser> *friend in data) { 
       NSLog(@"%@", [friend first_name]); 
       NSLog(@"%@", [friend last_name]); 
       NSLog(@"%@", [friend id]); 
       //make sure you have FBProfilePictureView outlet in your view 
       //otherwise skip the profile picture! 
       self.fbProfilePic.profileID = @"you'r friend's profile.id"; 

      } 
     } 
     else 
     { 
      NSLog(@"error"); 
      // [self didFailWithError:error]; 
     } 
    }]; 

nie wiem co jeszcze chcesz zrobić, bo w swoim pytaniu po prostu starał się nawiązać połączenie, ale w ten sposób można zrobić to, co kiedykolwiek chcesz, gdy jesteś zintegrowany z iOS 6.

Jeszcze jedno, sprawdź ustawienia aplikacji na Facebooku i konfiguracje tam, jak włącz aplikację na iOS i identyfikator na iPhone'a/iPada. Również FacebookAppID w Twoim plist.

Daj mi znać, jeśli działa dla ciebie,

EDIT: BTW mój Facebook SDK 3.1.1.

0

Odpowiedź jest prosta

w viewDidLoad() użyć:

accountStore= [[ACAccountStore alloc]init]; 
facebookAccountType= [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

NSDictionary *options= @{ 
ACFacebookAudienceKey: ACFacebookAudienceEveryone, 
ACFacebookAppIdKey: @"<YOUR FACEBOOK APP ID>", 
ACFacebookPermissionsKey: @[@"public_profile"] 

          };  

[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) { 

    if (granted) { 
     NSLog(@"Permission has been granted to the app"); 
     NSArray *accounts= [accountStore accountsWithAccountType:facebookAccountType]; 
     facebookAccount= [accounts firstObject]; 
     [self performSelectorOnMainThread:@selector(facebookProfile) withObject:nil waitUntilDone:NO]; 

    } else { 
     NSLog(@"Permission denied to the app"); 
    } 
}]; 

I funk- (void) facebookProfile

NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"]; 

zauważy params potrzebne są dodawane jako słowniku Poniżej znajduje się pełna lista https://developers.facebook.com/docs/graph-api/reference/user

NSDictionary *param=[NSDictionary dictionaryWithObjectsAndKeys:@"picture,id,name",@"fields", nil]; 

SLRequest *profileInfoRequest= [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:param]; 
profileInfoRequest.account= facebookAccount; 


[profileInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
    NSLog(@"Facebook status code is : %ld", (long)[urlResponse statusCode]); 

    if ([urlResponse statusCode]==200) { 

     NSDictionary *dictionaryData= [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error]; 



    } else { 

    } 
}]; 


} 
Powiązane problemy