2012-10-03 7 views
6

iOS6のネイティブ機能や他のFacebook機能を使用するために、以前のFacebook SDKから新しいFacebook SDK 3.1にアプリケーションを変換していましたが、問題が発生していますシミュレータ上では一貫して起こり、デバイス上ではほとんど発生しません。FacebookログインダイアログがiOS6シミュレータで動作しない

私がFacebookにログインすると、SafariやFacebookアプリからのバックグラウンド認証と認証の代わりに、私のアプリの上にモーダルウィンドウが表示されます(これはiOS6で始まりましたFacebook SDK 3.0/3.1へ)。このウィンドウではユーザー名とパスワードを入力できますが、右上の「OK」をクリックして認証すると何も起こりません。コールバックはアプリケーションには発生しません:openURL:sourceApplication:annotation:AppDelegateにあります。

(私は複数のプロジェクトのために使用します)私の共有FacebookControllerコードで

Facebook Login

Facebookのサンプルコードごとに認可しようとしたとき、私はFBSessionを初期化しています:

FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:readPermissions defaultAudience:FBSessionDefaultAudienceNone urlSchemeSuffix:self.fbUrlSchemeSuffix tokenCacheStrategy:nil]; 

if(session.state == FBSessionStateCreated || session.state == FBSessionStateCreatedTokenLoaded) 
{ 
    [FBSession setActiveSession:session]; 

    // we open after the fact, in order to avoid overlapping close 
    // and open handler calls for blocks 
    [session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
... 

完了のためのコードハンドラは、ダイアログのx cancelボタンをクリックしない限り実行されません(この場合、予期したとおりにエラーが発生します)。

iOSのターゲットプロパティ(info.plist)にFacebookAppIDを設定しており、fb ### [url_scheme_suffix]で設定したURLスキームも持っています。

私のコードとFacebookのサンプルコードとの唯一の違いは、私のアプリの無料版と有料版があるため、URLスキームの接尾辞を使用していることです。

アプリがSafariを使用してログインすると、指定されたコードで動作します。それがFacebookアプリに速く切り替わると、それも機能する。さらに、共有facebook ios6アカウント設定が機能します。アプリでは、アプリ内モーダルを使用する場合にのみ失敗します。

他に誰かがこれに遭遇しましたか?

+0

あなたのアプリとFacebook Appの両方の設定でバンドルIDを指定しましたか? –

+0

Bundle IDはFacebookのAppの設定で設定されています(2つのバージョンのアプリケーションがあるため実際には2つあります)、Bundle IDはアプリのplistに設定されています。 –

+0

'-initWithAppID:permissions ... 'に実際に' nil'をアプリIDとして提供していませんか? –

答えて

1

同じことが私に起こっています。これはシミュレータ(iphone5 4インチ、ios6)でのみ発生するので、この問題が実際のデバイスに存在するかどうかはわかりません。

いくつかのデバッグセッションの後、私はFBDialogのwebView:shouldStartLoadWithRequest:navigationType:メソッドがaccess_tokenを運んでいたURLを処理していないことがわかりました。 facebookがaccess_tokenを渡すとき、それはあなたが認証されていることを意味します。だから、そこには何かがないことが分かった。ここで

は処理されていないURLの形状である:

fb122222222222222://認可/#access_tokenは = ... & expires_in = 5102464 & コード = ..

urlスキームは、アプリのInfo.plistファイルで設定したfb + APIキーと同じです。

これは私がを修正した理由です。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType { 
    NSURL* url = request.URL; 

    if ([url.scheme isEqualToString:@"fbconnect"]) { 
     if ([[url.resourceSpecifier substringToIndex:8] isEqualToString:@"//cancel"]) { 
      NSString * errorCode = [self getStringFromUrl:[url absoluteString] needle:@"error_code="]; 
      NSString * errorStr = [self getStringFromUrl:[url absoluteString] needle:@"error_msg="]; 
      if (errorCode) { 
       NSDictionary * errorData = [NSDictionary dictionaryWithObject:errorStr forKey:@"error_msg"]; 
       NSError * error = [NSError errorWithDomain:@"facebookErrDomain" 
                 code:[errorCode intValue] 
                userInfo:errorData]; 
       [self dismissWithError:error animated:YES]; 
      } else { 
       [self dialogDidCancel:url]; 
      } 
     } else { 
      if (_frictionlessSettings.enabled) { 
       [self dialogSuccessHandleFrictionlessResponses:url]; 
      } 
      [self dialogDidSucceed:url]; 
     } 
     return NO; 
    } 
//THIS IS WHAT I'VE ADDED>>>> 
     else if ([[[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"] firstObject] objectForKey:@"CFBundleURLSchemes"] firstObject] isEqual:url.scheme]) 
     { 
      [self dialogDidSucceed:url]; 
      return NO; 
     } 
//<<<<< 
    else if ([_loadingURL isEqual:url]) { 
     return YES; 
    } else if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     if ([_delegate respondsToSelector:@selector(dialog:shouldOpenURLInExternalBrowser:)]) { 
      if (![_delegate dialog:self shouldOpenURLInExternalBrowser:url]) { 
       return NO; 
      } 
     } 

     [[UIApplication sharedApplication] openURL:request.URL]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 

私はすべてのFB SDKのガイドライン(3.1)とを、次の午前あることを言及する価値がある:私は支店、ここで私は場合には、ダイアログの成功を呼び出す場合、他の-我々はアクセストークンを持って新たな付加ことに注意してください私はsrcコードにそれ以上の変更を加えなかった。

これらの変更により、fbログインプロセスは正常に動作します。

こちらがお役に立てば幸いです。

+0

これに関してFacebookにプルリクエストまたはバグレポートを開いたことがありますか? – yonix

+0

とありがとう...それは私のために完璧に働いた:) – yonix

+0

いいえ、私はバグレポートを開かなかった。あなたがしたい場合は自由に感じてください – Lio

関連する問題