2013-01-08 3 views
3

내 앱이 SLRequest를 사용하지만 문제가있는 페이스 북에 간단한 게시물을 올리려고합니다. 권한은 괜찮습니다. 그냥 게시하지 않습니다.iOS 6에서 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

+0

나는이 같은 문제가 발생하고 스위프트,하지만 특정 페이스 북 계정. 해결책을 찾으면 업데이트하십시오. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

답변

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 { 
     ... 
    } 
}]; 

당신은 the beginning부터 다시 시작해야합니다

이 매우 재발 및 황당한 보인다.

+0

첫 번째 것은 벽에 게시하기 전에 필요한 기본 정보에 대한 액세스 권한을 부여합니다. 그것은 제 2의 것이하는 것입니다. – user717452

+0

마지막으로이 오류를 검색 할 수있었습니다 : '현재 사용자에 대한 정보를 쿼리하는 데 활성 액세스 토큰을 사용해야합니다.', "type": "OAuthException", "code": 2500}}' – user717452

+0

* 기본 정보 * 당신은'/ me/feed' 쿼리를 사용하기위한 추가 전제 조건이 필요하지 않습니다. 어떻게 생각하는지 설명 할 수 있습니까? –

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"); 
     } 
    }]; 
+0

예, 맞습니다 .ACAccountStore를 사용하여 앱에 로그인하더라도 피드에 게시하는 즉시 자격증 명을 다시 받아야합니다 ACAccountStore에 ACAccount를 요청하여 다시 요청합니다. 물론 이전에 권한을 얻은 경우 다시 요청하지 않으므로 사용자는 작업이 투명합니다. – viggio24

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))") 
    } 
}