2013-03-27 2 views
1

Я хочу написать одноэлемент для интеграции facebook с iOS 6. Я использую социальные и учетные системы.Facebook интеграция iOS 6 Социальные/учетные системы

Это мой FacebookData.h:

@class FacebookData; 

@protocol FacebookDataDelegate <NSObject> 
@optional 
- (void)FacebookDataDidLoadRequest:(NSDictionary *)result; 
- (void)FacebookDataDidFailToLoadRequest:(NSError *)error; 
@end 

@interface FacebookData : NSObject{ 
    NSString *facebookAppID; 
    ACAccountStore *facebookAccountStore; 
    ACAccountType *facebookAccountType; 
    ACAccount *facebookAccount; 
    BOOL readPermissionsGranted; 
    BOOL RequestPermissionsGranted; 
} 

@property (nonatomic) id delegate; 

+ (FacebookData*)sharedFacebookData; 

- (void)setAppID:(NSString *)appID; 
- (NSString *)currentAppID; 
- (void)requestPermissions:(NSArray*)Permissions andLoadRequest:(NSString*)theRequest; 
- (void)loadRequest:(NSString*)theRequest; 

@end 

Наиболее важные методы моего FacebookData.m:

- (void)requestPermissions:(NSArray*)Permissions andLoadRequest:(NSString*)theRequest{ 

    if(!readPermissionsGranted){ 

    __block NSArray *facebookPermissions = @[@"read_stream", @"email"]; 

    __block NSDictionary *facebookOptions = @{ ACFacebookAppIdKey : facebookAppID, 
             ACFacebookAudienceKey : ACFacebookAudienceFriends, 
             ACFacebookPermissionsKey : facebookPermissions}; 

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

      readPermissionsGranted = YES; 
      [self requestPermissions:Permissions andLoadRequest:theRequest]; 

     } 

     // If permission are not granted to read. 
     if (!granted) 
     { 
      NSLog(@"Read permission error: %@", [error localizedDescription]); 
      [self.delegate FacebookDataDidFailToLoadRequest:error]; 
      readPermissionsGranted = NO; 

      if ([[error localizedDescription] isEqualToString:@"The operation couldn’t be completed. (com.apple.accounts error 6.)"]) 
      { 
       [self performSelectorOnMainThread:@selector(showError) withObject:error waitUntilDone:NO]; 
      } 
     } 

    }]; 

    }else{ 

     __block NSArray *facebookPermissions = [NSArray arrayWithArray:Permissions];   
     __block NSDictionary *facebookOptions = @{ ACFacebookAppIdKey : facebookAppID, 
                ACFacebookAudienceKey : ACFacebookAudienceFriends, 
                ACFacebookPermissionsKey : facebookPermissions}; 

     [facebookAccountStore requestAccessToAccountsWithType:facebookAccountType options:facebookOptions completion:^(BOOL granted2, NSError *error) 
     { 
      if (granted2) 
      { 
       RequestPermissionsGranted = YES; 
       // Create the facebook account 
       facebookAccount = [[ACAccount alloc] initWithAccountType:facebookAccountType]; 
       NSArray *arrayOfAccounts = [facebookAccountStore accountsWithAccountType:facebookAccountType]; 
       facebookAccount = [arrayOfAccounts lastObject]; 
       [self loadRequest:theRequest]; 
       NSLog(@"Permission granted"); 
      } 

      if (!granted2) 
      { 
       NSLog(@"Request permission error: %@", [error localizedDescription]); 
       [self.delegate FacebookDataDidFailToLoadRequest:error]; 
       RequestPermissionsGranted = NO; 
      } 

     }]; 

    } 
} 

- (void)loadRequest:(NSString*)theRequest{ 

    __block NSDictionary *result= [[NSDictionary alloc]init]; 
    // Create the URL to the end point 
    NSURL *theURL = [NSURL URLWithString:theRequest]; 

    // Create the SLReqeust 
    SLRequest *slRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:theURL parameters:nil]; 

    // Set the account 
    [slRequest setAccount:facebookAccount]; 

    // Perform the request 
    [slRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
     if (error) 
     { 
      // If there is an error we populate the error string with error 
      __block NSString *errorString = [NSString stringWithFormat:@"%@", [error localizedDescription]]; 
      NSLog(@"Error: %@", errorString); 
      [self.delegate FacebookDataDidFailToLoadRequest:error]; 

     } else 
     { 
      NSLog(@"HTTP Response: %i", [urlResponse statusCode]); 
      NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil]; 
      result = jsonResponse; 
      [self.delegate FacebookDataDidLoadRequest:jsonResponse]; 
     } 

    }]; 
} 

Я использую этот синглтон так:

FacebookData *data = [FacebookData sharedFacebookData]; 
data.delegate = self; 
[data setAppID:APPIDKEY]; 
[data requestPermissions:@[@"friends_location"]  andLoadRequest:@"https://graph.facebook.com/me/friends?fields=id,name,location"]; 

Этот запрос с такими отказами, тогда как тот же метод с разрешениями: @ [@ "email"] и запрос: https://graph.facebook.com/me/friends отлично работает.

Это ошибка, которую я вижу в консоли:

error =  { 
     code = 2500; 
     message = "An active access token must be used to query information about the current user."; 
     type = OAuthException; 
    }; 

Я не могу найти, где ошибка, я не знаю, как использовать маркеры с этими рамками.

Благодарим за помощь!

ответ

4

IMO ваш LoadRequest URL не является правильным

andLoadRequest: @ "https://graph.facebook.com/me/friends?fields=id,name,location"];

SLRequest дает ошибку oauth, даже несмотря на его реальную проблему с URL-адресом. SLRequest не поддерживает «? Fields = id, name, location» прямо в URL. Вы должны передать их в качестве параметра в SLRequest

Смотрите пример ниже:

NSString* queryString = NULL; 
queryString = [NSString stringWithFormat:@"https://graph.facebook.com/me/friends", nil]; 
NSURL *friendsRequestURL = [NSURL URLWithString:queryString]; 
    SLRequest *friendsRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook 
                 requestMethod:SLRequestMethodGET URL:friendsRequestURL 
                  parameters:@{@"fields":@"id,name,location"}]; 

PS: Я столкнулся с аналогичной проблемой прошлой ночью, и проклиная фейсбук для данного неправильного заявления об ошибке. Но, наконец, удалось решить его в конце. :)

 Смежные вопросы

  • Нет связанных вопросов^_^