4

非推奨の Facebook クラスをまだ使用して Facebook に接続しているアプリがあります。拡張アクセス許可なしで承認すると、すべて正常に動作します。しかし、パーミッションを含めた場合、承認するための最初のラウンドトリップは常に失敗します (有効なトークンを取得しても!)。手順がありませんか?

アプリの Facebook 認証を開始するコードは次のとおりです。

- (IBAction) doConnect:(id)sender
{
    NSArray* permissions = [NSArray arrayWithObjects:
                            @"email",@"publish_actions",nil];
    [self.facebook authorize:permissions];
}

ユーザーがアクセス許可を付与し、制御がアプリに戻った後に呼び出されるコードを次に示します。URL には、初めてでも、見栄えの良いトークンが常に含まれています。

// handle the incoming url from app switching
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [self.facebook handleOpenURL:url];
}

そして、接続が成功した後に呼び出される FBSessionDelegate メソッドを次に示します。上記の URL にはトークンが含まれていましたが、最初にここにアクセスしたときにはトークンがありません。しかし、上記の doConnect メソッドを呼び出すと、ここに到達した時点でトークンが存在します。

// FBSessionDelegate
- (void)fbDidLogin
{
    if( [self.facebook accessToken] == nil )
    {
        NSLog(@"Had an access token above, but not now!");

        // If I reinvade the doConnect: method again, it will work!!!
    }
    // ...

}

FBSession.m の sdk コードを詳しく調べると、要求されたアクセス許可が最初から新しいトークンに関連付けられていないため、セッションが新しいトークンを無視しているようです。最初は、cachedPermissions は常に空のリストです

    // get the cached permissions, and do a subset check
    NSArray *cachedPermissions = [tokenInfo objectForKey:FBTokenInformationPermissionsKey];
    BOOL isSubset = [FBSession areRequiredPermissions:permissions
                                 aSubsetOfPermissions:cachedPermissions];
4

3 に答える 3

3

読み取りタイプ (メール) と書き込みタイプ (publish_actions) の 2 種類のアクセス許可を求めています。

最新の Facebook SDK v3.1.1 を使用する必要があり、特に iOS6 をサポートする場合は、読み取りと書き込みを別々に分割する必要があります。最初は読み取りのみを要求できます。https://developers.facebook.com/docs/tutorial/iossdk/upgrading-from-3.0-to-3.1/のメモと、読み取りと書き込みを個別に要求するセクションを参照してください。

于 2012-12-15T01:58:35.510 に答える
0

Facebook SDK 3.1 の場合、[FBSession activeSession] の

reauthorizeWithPublishPermissions: defaultAudience:completionHandler:

Facebook SDK 3.2 の場合、[FBSession activeSession] の

requestNewPublishPermissions: defaultAudience:completionHandler:
于 2014-03-18T07:51:23.270 に答える
0

単一のリクエストでユーザーを承認できます。2 回試行する必要はありません。これを達成するために必要なことは、「まず公開許可を求める必要がある」ことです。以下のメソッドを呼び出します

let fbLoginMngr =  FBSDKLoginManager();
fbLoginMngr.logOut()
fbLoginMngr.logInWithPublishPermissions

最初にプロファイルの詳細を尋ね、次に要求された公開許可を求めます。コールバックを取得したら、Graph API にクエリを実行して、以下のようなプロファイル データを抽出します。

let fbRequest = FBSDKGraphRequest(graphPath:"me",    parameters:self.FB_REQ_PARAMS);
                fbRequest.startWithCompletionHandler { (connection : FBSDKGraphRequestConnection!, result : AnyObject!, error : NSError!) -> Void in
                    if error == nil {
                        debugPrint(result)
                    } else {
                        handleError(error)
                    }
                }
于 2016-07-22T05:08:10.203 に答える