1

我想编写一个用于 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

1 回答 1

4

IMO 您的 LoadRequest URL 不正确

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

SLRequest 给出了一个 oauth 错误,即使它的 URL 确实存在问题。SLRequest 不直接在 URL中支持"?fields=id,name,location" 。您需要将它们作为参数传递给 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:昨晚我遇到了类似的问题,并诅咒Facebook给出了错误的错误声明。但最后终于能够解决它。:)

于 2013-05-23T14:23:48.010 回答