2012-09-30 16 views
16

この質問はFacebook SDK for iOS , on iOS 4.0 deviceとよく似ていますが、そこにコメントできないので、私は新しい質問を開きます。ios6 facebook integration login常にFBSessionStateClosedLoginFailedは開けません

私のアプリのFacebookブックへの統合を更新しようとすると、facebookセッションを開くことができません。sessionStateChangedコールバックを開くことは常にFBSessionStateClosedLoginFailedで終わります。私のセットアップで私は私の控除のコールバックを持っています

- (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のマニュアルを参照して、その後、私はまた後でpublish_actions許可を再承認する意思を持つFacebookのチュートリアルの例のように、アクセス権のためnil

openActiveSessionWithReadPermissionsを試してみました

- (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]; 
             }]; 
} 

を呼び出します。同じ結果:FBSessionStateClosedLoginが再び失敗しました。

私もセッションを開こうとする前に、

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状態を持っているので何も起こりません!セッション状態のための私のコールバックは、私のFacebookアプリが正しく設定されているので、私は問題がなかったIOS 5 Facebookで3.0と

- (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); 
    } 
} 

です。 wchichがfacebookのセッションを開くだけで、facebook 3.1でこれらの問題に遭遇するとは思っていなかったので、本当に助けていただければ幸いです。

+0

注意:Xcodeのios6およびios5シミュレータでは完全に機能します。実際のデバイス上でのみ説明されているようには開きません。デバイスにはFacebookが有効になっており、Facebookがインストールされており、Facebookアカウントに接続されています。 – robscure

+0

私はあなたよりも怪しい問題を抱えています。同じコード、普遍的なアプリですが、fbロジックに条件はありません。 –

+0

私は同じ問題があります。あなたはすでにそれを解決しましたか? – edward

答えて

1

私はコメントできませんそれを答えとして書く。 私は確信していません、潜在的な理由を分析させてください 1)あなたは言った: "しかし、それは呼ばれることはありません! - > ITEM0 - - > URLスキーム--->項目0ここで値Info.plistファイルには、URLスキームを正しくすなわち設定する必要があります

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

と呼ばれる取得するには、用URLタイプに行きますfbAPPIDでなければなりません。つまり、あなたの実際のfacebookappIDでfbを追加する必要があります。[FacebookAppIDはinfo.plistに存在するか、ハードコードされたコードでも存在する可能性があります]。

2)あなたが言った: は「sessionStateChangedコールバックは常にFBSessionStateClosedLoginFailedで終わる」sessionStateChangedスイッチ方式セッションの状態を確認するには

、それが作成または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; 
+0

thx ravi!幸運にも私自身の質問にコメントすることが許されています;)openURLへの呼び出しに関しては、info.plist内の私のURLスキームは正しく設定されています、私はそれを再チェックし、3.0 sdkの下でそれに問題はなかった!私は、FBSessionStateCreatedとFBSessionStateCreatedTokenLoadedをopenWithCompletionHandlerを使ってsessionStateChangedのswitch文に追加しようとしましたが、残念ながらまだ唯一の値状態取得は常にFBSessionStateClosedLoginFailedなのでopenWithCompletionHandlerブロックは決して呼び出されません:( – robscure

+0

openURLはいつも正常に呼び出されますか?同じコードがios6シミュレータ(同じfacebookアカウントと同じ設定でfacebookフレームワークを設定したもの)でうまく動作する理由を教えてください。 – robscure

+0

OpenURLは、他のアプリがurlスキームを使用してアプリケーションを呼び出そうとしたときに呼び出されます(fbappid:// ... in info。plist、あなたのアプリがiOSでスキームを登録しています).i推測シミュレータにネイティブアプリがなく、認証にサファリまたはウェブビューを使用しています。これは、デバイスとシミュレータの動作が異なるためです。また、あなたがバックグラウンドに送信する際にセッションを閉じていないことも確認してください。 – ravi

40

私は同じ問題を抱えていた、そしてそれは私が私のAppDelegate

+1

私のために働いた:) –

+0

あなたは英雄です! –

+0

それは私が必要とした修正でした。見逃しすぎる。ありがとう! – gstjohn

0

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

を実装するのを忘れたので、私は追加の注意点と、JohnGに同意した:

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

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

私は変わったですが、私はsourceApplicationが複数のデバイスで "Facebook"と "facebook"として戻ってくることができました。

+1

[sourceApplication lowercaseString] isEqualToString:@ "com.facebook.facebook"]は、ジョブを実行します –

19

JohnGの回答は正しいが、その特定の委任方法は今やdeprecatedになっている。 is thisを使用する正しいデリゲートメソッド:

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

私のアプリケーションデリゲートで私のために問題を解決することを置きます。これがなければ、iOS 6.0ネイティブログインは機能しますが、Facebookアプリのログインは失敗します。 FB SDK 3.5で

+0

ありがとうございます@jzn、私の場合は、代理メソッドuは言及されていません。何か案は?ありがとう。 – dredful

+1

@dredfulそのコールバックは、Facebook App/webビューフォールバックログインにのみ使用されます。 iOS 6のログインを使用している場合は、アプリがバックグラウンドに置かれないため、決して呼び出されません。どちらの方法でログインしていますか? – jzn

+0

ありがとう@jzn。私たちのアプリはFacebookのAppログインを使用していました。ユーザーにFacebookがインストールされていない場合、Webビューが起動されてから起動します。奇妙なこと:ユーザーがiOS6 SettingsのFacebookにログインしている場合、他のシナリオに関係なく、SDKはログインしません。私は今日それに投稿します。 – dredful

0

、あなたはこれでトークンを殺すことができます:私は同じ問題を抱えていた

[[FBSessionTokenCachingStrategy defaultInstance] clearToken]; 
+0

あなたはFacebookの開発者アカウントにログインし、このページのトークンを抹消することができます。テストには本当に便利です: [リンク] https://developers.facebook.com/tools/explorer/ グラフAPIエクスプローラ –

2

。ユーザーがシステム環境設定でFacebookアカウントを設定していない場合、Facebookのログインダイアログが現れ、すべて正常に機能しました。しかし、ユーザーがデバイスに設定されたアカウントを持っていた場合、私はいつもFBSessionStateClosedLoginFailedエラーが発生していました。

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

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