4

Facebook SDK 3.5 にバンドルされている HelloFacebookSample プロジェクトをフォローしています。AppDelegate からのものも含め、すべてを仮想的に自分のアプリにコピーして貼り付けましたが、何らかの理由で [ログイン] ボタンをクリックするとアプリがフリーズします。記録として、iOS 6 の統合フレームワークに接続すると、すべてが正しく認証されます。これはいずれにせよ、FB SDK を介して行われます。Web を使用してログインしようとしたときのみです。つまり、FBLoginView Web サイトを開き、認証を受けて、アプリに戻ります。これが samepl プロジェクトのコードで、私のコードと比較します。

FBLoginView *loginview = [[FBLoginView alloc] init];

loginview.frame = CGRectOffset(loginview.frame, 5, 5);
loginview.delegate = self;

[self.view addSubview:loginview];

[loginview sizeToFit];

私のは少し違います:

loginview = [[FBLoginView alloc] init];
loginview.delegate = self;

[self.facebookCell addSubview:loginview];

[loginview sizeToFit];

デリゲート メソッドに関しては、すべてそのまま実装しました。アプリがクラッシュするのはなぜですか? 私のアプリとサンプル アプリの間ですべてのコードがほとんど同じである場合、クラッシュの正当な理由はありません。ゾンビ オブジェクトがオンになっていても、デバッガーはあまり役に立ちません。実際のエラーは次のとおりThread 1: EXC_BAD_ACCESS (code=2, address=somethingoranother)です。なぜこれが起こっているのか、誰か考えがありますか?

よろしく、
マイク

更新:何かがループで無限に繰り返されているためにクラッシュが発生したようです。FB SDK によって 100,000 を超えるプロセスがメイン スレッドに配置されたようです。どのように?!

更新 2:サンプル AppDelegate から直接コピーしたにもかかわらず、エラーがここにあると思い始めています。

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {
// attempt to extract a token from the url
return [FBAppCall handleOpenURL:url
              sourceApplication:sourceApplication
                fallbackHandler:^(FBAppCall *call) {
                    NSLog(@"In fallback handler");
                }];
}

これはまったく役に立ちますか?

4

4 に答える 4

2

正確な問題と思われるものがありますが、アプリケーションのサンドボックス モードは既に無効になっています。このアプリは以前は問題なく動作していましたが、SDK をアップグレードしたところ、この問題が発生しました。

iOS で Facebook アカウントを構成していれば問題なく動作しますが、そうでなければクラッシュします。言及する価値のあることの 1 つは、URL スキームを削除すると、アプリが Web ブラウザーまたは Facebook アプリにアクセスできなくなり、Web ビューを使用してログインし、これも機能することです。

編集:私が知る限り、私の問題は、Facebook のアプリケーション設定にアクセスできないことに依存しています。facebook SDK は [FBUtility fetchAppSettings:callback:] 呼び出しを行います。より具体的には、

https://graph.facebook.com/267496536695242?fields=supports_attribution,supports_implicit_sdk_logging,suppress_native_ios_gdp,name,

私のアプリの場合、次のように失敗します:

{
   "error": {
      "message": "Unsupported get request.",
      "type": "GraphMethodException",
      "code": 100
   }
}

比較すると、サンプルアプリのいずれか、たとえばこれ、SessionLoginSample

https://graph.facebook.com/380615018626574?fields=supports_attribution,supports_implicit_sdk_logging,suppress_native_ios_gdp,name

これを正しく返します:

{
   "supports_attribution": true,
   "supports_implicit_sdk_logging": true,
   "suppress_native_ios_gdp": 0,
   "name": "SessionLoginSample",
   "id": "380615018626574"
}

SDK は何かを予期しているため、同じ要求を出し続け、シミュレーターがクラッシュするまでループに陥ります。

これを確認するために、必要なパラメーターをコールバックに手動で挿入し、facebook SDK を変更したところ、すべてが完全に機能するようになりました。

非推奨の 2.0 から SDK をアップグレードしたことに言及する価値があります。また、設定ページに古いパラメーターがいくつかありました (クライアント トークンが設定されておらず、Web ではなくネイティブ/デスクトップとして承認され、アプリにアプリの秘密鍵がありません)。 )しかし、私はすでにそれらを大丈夫に設定しています..

編集 2: これは、私が変更した Facebook SDK (FBUtility.m 内) のメソッドです。「悪いこと」のif節だけを追加しました。

+ (void)fetchAppSettings:(NSString *)appID
            callback:(void (^)(FBFetchedAppSettings *, NSError *))callback {

if (!g_fetchedAppSettingsError && !g_fetchedAppSettings) {

    NSString *pingPath = [NSString stringWithFormat:@"%@?fields=supports_attribution,supports_implicit_sdk_logging,suppress_native_ios_gdp,name", appID, nil];
    FBRequest *pingRequest = [[[FBRequest alloc] initWithSession:nil graphPath:pingPath] autorelease];
    if ([pingRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

        // Bad stuff
        if (error) {
            error = nil;
            result = [NSDictionary dictionaryWithObjectsAndKeys:@"true", @"supports_attribution",
                                                                @"true", @"supports_implicit_sdk_logging",
                                                                @"0", @"suppress_native_ios_gdp",
                                                                @"Your_App_Display_Name", @"name",  nil];
        }

        if (error) {
            g_fetchedAppSettingsError = error;
            [g_fetchedAppSettingsError retain];
        } else {

            g_fetchedAppSettings = [[[FBFetchedAppSettings alloc] init] retain];

            if ([result respondsToSelector:@selector(objectForKey:)]) {

                g_fetchedAppSettings.serverAppName = [result objectForKey:@"name"];
                g_fetchedAppSettings.supportsAttribution = [[result objectForKey:@"supports_attribution"] boolValue];
                g_fetchedAppSettings.supportsImplicitSdkLogging = [[result objectForKey:@"supports_implicit_sdk_logging"] boolValue];
                g_fetchedAppSettings.suppressNativeGdp = [[result objectForKey:@"suppress_native_ios_gdp"] boolValue];
            }
        }
        [FBUtility callTheFetchAppSettingsCallback:callback];
    }
         ]
        );
} else {
    [FBUtility callTheFetchAppSettingsCallback:callback];
}

}

于 2013-04-22T13:42:54.170 に答える
1

Facebook は、多くの開発者にこの問題を引き起こしていたサーバー エラーを修正しました。ただし、サーバーの修正により、無限ループの問題が発生する可能性が低くなるだけです。それはまだそこにあります。無限ループの問題を追跡するために、新しいバグを作成しました。

https://developers.facebook.com/bugs/446010282155033

于 2013-04-23T21:49:34.740 に答える
1

誰かが別のスレッドで答えを見つけました。Facebook デベロッパー センターで、アプリがサンドボックス モードに設定されていたため、このエラーが発生しました。結局、コードの問題ではなかったようです。

于 2013-04-22T09:35:31.960 に答える