6

iOS6 ネイティブ機能と他の Facebook 機能を使用するために、アプリケーションを古い Facebook SDK から新しい Facebook SDK 3.1 に変換していますが、シミュレーターで一貫して発生し、デバイスではめったに発生しない問題があります。

Facebook にログインしようとすると、アプリのバックグラウンド化と Safari または Facebook アプリによる認証の代わりに、ログイン用のアプリの上にモーダル ウィンドウが表示されます (Facebook SDK 3.0 に切り替える前であっても、これは iOS6 で始まったと思います) /3.1)。このウィンドウでは、ユーザー名とパスワードを入力できますが、認証のために右上の [OK] をクリックしても何も起こりません。AppDelegate 内の application:openURL:sourceApplication:annotation: へのコールバックは発生しません。

フェイスブックログイン

私の共有 FacebookController コード (複数のプロジェクトで使用しています) では、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 キャンセル ボタンをクリックしない限り、完了ハンドラのコードは実行されません (この場合、期待どおりにエラーが発生します)。

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

私のコードと Facebook のサンプル コードの唯一の違いは、アプリの無料バージョンと有料バージョンがあるため、URL スキーム サフィックスを使用していることです。

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

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

4

1 に答える 1

1

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

いくつかのデバッグ セッションの後、FBDialog の webView:shouldStartLoadWithRequest:navigationType: メソッドが、access_token を運ぶ URL を処理していないことがわかりました。Facebook が access_token を渡すと、認証されたことになります。それで、私はそこに何かが欠けていると考えました。

処理されていない URL の形状は次のとおりです。

fb122222222222222 ://authorize/# access_token =...& expires_in =5102464&コード=...

URL スキームは、アプリの Info.plist ファイルで構成した fb+API キーと同じであることに注意してください。

この問題を解決するために私がしたことは次のとおりです。新しい else-if ブランチを追加したことに注意してください。このブランチでは、アクセス トークンがある場合にダイアログを成功と呼びます。

- (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 ログイン プロセスは期待どおりに機能します。

これが役立つことを願っています!

于 2012-10-23T13:27:52.353 に答える