3

试图让我的应用使用 SLRequest 向 Facebook 发布一个简单的帖子,但遇到了问题。权限被授予很好,它只是不会发布。

-(void)requestPermissions
{
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    __block ACAccount *facebookAccount = nil;

    ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    // Specify App ID and permissions
    NSDictionary *options = @{
ACFacebookAppIdKey: @"MYAPPID",
ACFacebookPermissionsKey: @[@"email", @"user_about_me", @"user_likes"],
ACFacebookAudienceKey: ACFacebookAudienceFriends
    };

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

             NSDictionary *options2 = @{
         ACFacebookAppIdKey: @"MYAPPID",
         ACFacebookPermissionsKey: @[@"publish_stream", @"publish_actions"],
         ACFacebookAudienceKey: ACFacebookAudienceFriends
             };
             [accountStore requestAccessToAccountsWithType:facebookAccountType options:options2 completion:^(BOOL granted, NSError *error) {
                 if (granted) {
                     NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];

                     facebookAccount = [accounts lastObject];                 }
                 else {
                     NSLog(@"Access denied 2");
                     NSLog(@"%@", [error description]);
                 }
             }];
         } else {
             NSLog(@"Error: %@", [e description]);
             NSLog(@"Access denied");
         }
     }];

    NSDictionary *parameters = @{@"message": @"This is a test"};

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

    SLRequest *feedRequest = [SLRequest
                              requestForServiceType:SLServiceTypeFacebook
                              requestMethod:SLRequestMethodPOST
                              URL:feedURL
                              parameters:parameters];
    NSLog(@"AnythingHere?");
    feedRequest.account = facebookAccount;

    [feedRequest performRequestWithHandler:^(NSData *responseData,
                                             NSHTTPURLResponse *urlResponse, NSError *error)
     {
         // Handle response
         NSLog(@"%@%@%@", error, responseData, urlResponse);
     }];
}

日志中的错误在最后部分返回 null。对此有什么想法吗?

更新:所以问题是 HTTP 响应返回 400。

4

3 回答 3

2

也许有点晚了......但是,看起来您必须将 feedRequest 放入您请求发布权限的块中。像这样的东西:

ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    __block ACAccount *facebookAccount = nil;

    ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    // Specify App ID and permissions
    NSDictionary *options = @{
                              ACFacebookAppIdKey: @"yourAppId",

                              ACFacebookPermissionsKey: @[@"email"]
                              ACFacebookAudienceKey: ACFacebookAudienceEveryone
                              }; // basic read permissions

    [accountStore requestAccessToAccountsWithType:facebookAccountType
                                          options:options completion:^(BOOL granted, NSError *e)
     {
         if (granted) {
             // Now that you have publish permissions execute the request 
             NSDictionary *options2 = @{
                                        ACFacebookAppIdKey: @"yourAppId",
                                        ACFacebookPermissionsKey: @[@"publish_stream", @"publish_actions"],
                                        ACFacebookAudienceKey: ACFacebookAudienceFriends
                                        };
             [accountStore requestAccessToAccountsWithType:facebookAccountType options:options2 completion:^(BOOL granted, NSError *error) {
                 if (granted) {
                     NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];

                     facebookAccount = [accounts lastObject];

                     NSDictionary *parameters = @{@"message": @"This is a test"};

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

                     SLRequest *feedRequest = [SLRequest
                                               requestForServiceType:SLServiceTypeFacebook
                                               requestMethod:SLRequestMethodPOST
                                               URL:feedURL
                                               parameters:parameters];
                     NSLog(@"AnythingHere?");

                     [feedRequest setAccount:facebookAccount];

                     [feedRequest performRequestWithHandler:^(NSData *responseData,
                                                              NSHTTPURLResponse *urlResponse, NSError *error)
                      {
                          // Handle response
                          NSLog(@"%@%@", error,urlResponse);

                          NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];

                          NSLog(@"Facebook Response : %@",response);

                      }];



                 }
                 else {
                     NSLog(@"Access denied 2");
                     NSLog(@"%@", [error description]);
                 }
             }];
         } else {
             NSLog(@"Error: %@", [e description]);
             NSLog(@"Access denied");
         }
     }];
于 2013-06-28T10:22:11.053 回答
2

您应该犯了复制/粘贴错误。

选项已经实例化了两次以及requestAccessToAccountsWithType您联锁的两种方法。

这看起来非常频繁且不太可能:

NSDictionary *options = @{...};
[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *e) {
    if (granted) {
         NSDictionary *options2 = @{...};
         [accountStore requestAccessToAccountsWithType:facebookAccountType options:options2 completion:^(BOOL granted, NSError *error) {
             if (granted)
                 ...
             else
                ...
        }];
    } else {
        ...
    }
}];

你应该从头再来

于 2013-01-08T18:15:45.567 回答
0

斯威夫特 3

let account = ACAccountStore()
let accountType = account.accountType(withAccountTypeIdentifier: ACAccountTypeIdentifierFacebook)
let options: [AnyHashable : Any] = [ACFacebookAppIdKey: "Your App ID on FB", ACFacebookPermissionsKey: ["publish_stream", "publish_actions"], ACFacebookAudienceKey: ACFacebookAudienceEveryone]

account.requestAccessToAccounts(with: accountType, options: options) { (success, error)  in
  if success {
    if let accounts = account.accounts(with: accountType) {
      if accounts.isEmpty {
        print("No facebook account found, please add your facebook account in phone settings")
      } else {
        let facebookAccount = accounts.first as! ACAccount

        let message = ["status": "My first Facebook posting "]
        let requestURL = URL(string: "https://graph.facebook.com/me/feed")

        let postRequest = SLRequest(forServiceType: SLServiceTypeFacebook,
                                    requestMethod: SLRequestMethod.POST,
                                    url: requestURL,
                                    parameters: message)
        postRequest?.account = facebookAccount

        postRequest?.perform(handler: {(_, urlResponse,
          error) in

          if let err = error {
            print("Error : \(err.localizedDescription)")
          }
          print("Facebook HTTP response \(String(describing: urlResponse?.statusCode))")
        })
      }
    }
  } else {
    print("Facebook account error: \(String(describing: error))")
  }
}
于 2017-08-04T13:42:54.383 回答