1

困惑する難問: 1 つの URL で友達リストを取得すると、同じ URL を使用して正常にリストが返されますが、クエリ文字列 (?fields=id,name,picture) とまったく同じ権限を使用すると、次のエラーが表示されます。 「現在のユーザーに関する情報を照会するには、アクティブなアクセス トークンを使用する必要があります。」何を与える?

現在有効な権限は、publish_stream、email、および read_stream です。そのクエリ文字列を追加すると、なぜ台無しになるのでしょうか? 私が考えられる唯一のことは、私が持っているアクセスキーが私が考えているものではないということです. 実際のアクセス キーを取り出して NSLog に公開し、グラフ エクスプローラーでテストする方法はありますか?

機能する URL は次のとおりです。

https://graph.facebook.com/me/friends

そうでない URL は次のとおりです。

https://graph.facebook.com/me/friends?fields=id,name,picture

これは、実際にアクセス許可を取得するコードです。実際、これは Stuart Breckenridge が GitHub で自由に提供したのと同じコードです (ありがとう!) API 呼び出しの最後に '?fields=name,id,picture' を追加しない限り、うまく動作するようです:

-(void)requestPermissions
{
    if (debugF) NSLog(@"FAM: requestPermissions");
    // Specify the Facebook App ID.
    _facebookAppID = @"123456789123456"; // You Must Specify Your App ID Here.

    // Submit the first "read" request.
    // Note the format of the facebookOptions dictionary. You are required to pass these three keys: ACFacebookAppIdKey, ACFacebookAudienceKey, and ACFacebookPermissionsKey
    // Specify the read permission
    _facebookPermissions = @[@"email"];

    // Create & populate the dictionary the dictionary
    _facebookOptions = @{   ACFacebookAppIdKey : _facebookAppID,
                         ACFacebookAudienceKey : ACFacebookAudienceFriends,
                      ACFacebookPermissionsKey : _facebookPermissions};

    _facebookAccountType = [_facebookAccountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    [_facebookAccountStore requestAccessToAccountsWithType:_facebookAccountType options:_facebookOptions completion:^(BOOL granted, NSError *error)
     {
         // If read permission are granted, we then ask for write permissions
         if (granted) {

             _readPermissionsGranted = YES;

             // We change the _facebookOptions dictionary to have a publish permission request
             _facebookPermissions =  @[@"publish_stream", @"read_stream", @"friends_photos"];

             _facebookOptions = @{         ACFacebookAppIdKey : _facebookAppID,
                                        ACFacebookAudienceKey : ACFacebookAudienceFriends,
                                     ACFacebookPermissionsKey : _facebookPermissions};


             [_facebookAccountStore requestAccessToAccountsWithType:_facebookAccountType options:_facebookOptions completion:^(BOOL granted2, NSError *error)
              {
                  if (granted2)
                  {
                      _publishPermissionsGranted = YES;
                      // Create the facebook account
                      _facebookAccount = [[ACAccount alloc] initWithAccountType:_facebookAccountType];
                      _arrayOfAccounts = [_facebookAccountStore accountsWithAccountType:_facebookAccountType];
                      _facebookAccount = [_arrayOfAccounts lastObject];
                  }

                  // If permissions are not granted to publish.
                  if (!granted2)
                  {
                      if (debugF) NSLog(@"Publish permission error: %@", [error localizedDescription]);
                      _publishPermissionsGranted = NO;
                  }

              }];
         }

         // If permission are not granted to read.
         if (!granted)
         {
             if (debugF) NSLog(@"Read permission error: %@", [error localizedDescription]);
             _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];
             }
         }
     }];
}
4

1 に答える 1

2

結局のところ、私の最初の質問に対する答えは、私が思っていたよりも簡単でした。

NSString *acessToken = [NSString stringWithFormat:@"%@", self.facebookAccount.credential.oauthToken];

ただし、会話に貢献したすべての人に敬意を表します。

于 2013-05-09T05:19:15.713 に答える