首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Facebook集成iOS 6社交/帐户框架

Facebook集成iOS 6社交/帐户框架
EN

Stack Overflow用户
提问于 2013-03-28 00:47:23
回答 1查看 1.6K关注 0票数 1

我想为facebook与iOS 6的集成编写一个单例代码。我使用社交和账户框架。

这是我的FacebookData.h:

代码语言:javascript
复制
@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最重要的方法是:

代码语言:javascript
复制
    - (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];
        }

    }];
}

我像这样使用这个单例:

代码语言:javascript
复制
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“和request:https://graph.facebook.com/me/friends工作得很好。

这是我在控制台中看到的错误:

代码语言:javascript
复制
error =     {
        code = 2500;
        message = "An active access token must be used to query information about the current user.";
        type = OAuthException;
    };

我找不到bug在哪里,我不知道如何在这些框架中使用令牌。

感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-23 22:23:48

IMO您的LoadRequest地址不正确

andLoadRequest:@""];

SLRequest会给出一个oauth错误,即使它的网址存在真正的问题。SLRequest不支持直接在URL中使用"?fields=id,name,location"。您需要将它们作为SLRequest中的参数进行传递

如下例所示:

代码语言:javascript
复制
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"}];

附言:我昨晚也遇到了类似的问题,并且咒骂facebook给出了错误的声明。但最终还是能够解决这个问题。:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15664538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档