16

この質問はiOS 4.0 デバイスの Facebook SDK for iOSと非常によく似ていますが、そこではコメントできないので、新しい質問を開きます。質問は同じではないと思います:

アプリの facebook 統合を facebook 3.1 に更新しようとすると、facebook セッションで sessionStateChanged コールバックを開くことができず、常に FBSessionStateClosedLoginFailed になります。私のセットアップでは、 appdelegate にコールバックがあります

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
    //    return [self.session handleOpenURL:url]; 
    return [FBSession.activeSession handleOpenURL:url];
}

しかし、それは決して呼び出されません! 呼ばれるべきではないですか?Facebookのドキュメントに従って、電話をかけました

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    return [FBSession openActiveSessionWithPublishPermissions:permissions
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) {
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         }];
}

私も試しました

openActiveSessionWithReadPermissionsfacebook チュートリアルの例のようにパーミッションを使用しnilて、後で publish_actions パーミッションを再承認することを意図しています。同じ結果: FBSessionStateClosedLoginFailed が再び発生しました。

電話もしてみた

ACAccountStore *accountStore;
    ACAccountType *accountTypeFB;
    if ((accountStore = [[ACAccountStore alloc] init]) &&
        (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

        NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
        id account;
        if (fbAccounts && [fbAccounts count] > 0 &&
            (account = [fbAccounts objectAtIndex:0])){

            [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
                //we don't actually need to inspect renewResult or error.
                if (error){

                }
            }];
        }
    }

セッションを開こうとする前に、ios6デバイス(iphone 4s)で開くことはありません。アプリで許可を求められますが、セッションの状態が常に FBSessionStateClosedLoginFailed! であるため、何も進みません。セッション状態のコールバックは

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
            NSLog(@"FBSessionStateClosed");
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed");
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];

    if (error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"facebook Hinweis"
                                                        message:@"facebook Login nicht möglich, bitte versuchen Sie es erneut."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        NSLog(@"Facebook session error: %@", error.localizedDescription);
    }
}

iOS 5 の facebook 3.0 では問題が発生したことがないので、facebook アプリは正しく設定されています。Facebookセッションを開くだけで、Facebook 3.1でこれらの問題に遭遇するとは思わなかったので、ドキュメントはこの時点で私を助けてくれません.thx

4

6 に答える 6

40

私は同じ問題を抱えていましたが、それは実装を忘れたためでした

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [FBSession.activeSession handleOpenURL:url];
}

私のAppDelegateで

于 2012-12-30T22:43:07.537 に答える
19

JohnG の答えは正しいですが、その特定のデリゲート メソッドは非推奨になりました。使用する正しいデリゲート メソッドは次のとおりです。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [FBSession.activeSession handleOpenURL:url];
}

それをアプリケーションデリゲートに配置すると、問題が解決しました。これがないと、iOS 6.0 のネイティブ ログインは機能しますが、Facebook アプリのログインは失敗します。

于 2013-03-19T19:19:29.180 に答える
2

私も同じ問題を抱えていました。ユーザーがシステム環境設定で設定された Facebook アカウントを持っていなかった場合、Facebook ログイン ダイアログが表示され、すべて正常に機能しました。しかし、ユーザーがデバイスでアカウントを構成していた場合、常にFBSessionStateClosedLoginFailedエラーが発生していました。

handleOpenURL:urliOS 6 以降の「ネイティブ ログイン フロー」には高速アプリ変更がないため、これとは関係ありません。したがって、アプリがバックグラウンドになることはなく、URL リダイレクトは必要ありません。

問題は、Facebook アプリの構成で解決されました。「ネイティブ iOS ログイン」セクションを有効にして、アプリのバンドル ID を入力する必要があります。アプリがまだ Apple Store にない場合は、残念ながらサンドボックス モードをオンに設定する必要があります。アプリが Apple Store に公開されたら、サンドボックス モードをオフにして、Facebook 構成で Apple Store ID を設定する必要があると思います。

于 2013-08-23T09:05:36.930 に答える
1

コメントできないので答えとして書いてください。よくわかりません。考えられる理由を分析させてください。1)「しかし、呼び出されることはありません。呼び出されるべきではありませんか?」 - にとって

- (BOOL)application:(UIApplication *)application 
        openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation

呼び出されるには、info.plistファイルでURLスキームを適切に設定する必要があります。つまり、URLタイプ->Item0->URLスキーム--->Item0に移動します。ここでの値はfbAPPIDである必要があります。つまり、fbに実際のfacebookappIDを追加します。 [FacebookAppIDは、info.plistに存在するか、コードにハードコードされている可能性もあります]。

2)あなたは言った:「sessionStateChangedコールバックは常にFBSessionStateClosedLoginFailedで終わる」

sessionStateChangedスイッチメソッドでセッションの状態を確認し、それがcreatedまたはcreatedTokenLoadedである場合は、セッションを開こうとします。

注:静的メソッドである[FBSession openActiveSessionWithPublishPermissions ....]は、新しいセッションを作成し、FBSession.activeSessionに設定されます。ここで、openWithCompletionHandlerは、セッションが既に作成されている場合にのみ機能するインスタンスメソッドです。

    case FBSessionStateCreated:
    case FBSessionStateCreatedTokenLoaded:{
        [session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            //handle the updating of views according to the sate of session 
        }];
        break;
于 2012-10-01T20:34:42.653 に答える
0

FB SDK 3.5 では、次のようにしてトークンを強制終了できます。

    [[FBSessionTokenCachingStrategy defaultInstance] clearToken];
于 2013-06-03T18:32:51.380 に答える
0

私は JohnG に同意しますが、次の追加の注意事項があります。

内に複数のケースがある場合は、次のhandleOpenURL:ようにフィルタリングできます。

if ([sourceApplication isEqualToString:@"com.facebook.facebook"] ||
    [sourceApplication isEqualToString:@"com.facebook.Facebook"]){
  //Do Stuff
}

奇妙ですが、sourceApplication「Facebook」と「facebook」として戻ってきて、複数のデバイスで複製できました。

于 2013-03-19T00:18:43.670 に答える