4

我正在关注与 Facebook SDK 3.5 捆绑的 HelloFacebookSample 项目。我实际上已将所有内容复制并粘贴到我自己的应用程序中,甚至是来自 AppDelegate 的内容,但由于某种原因,单击登录按钮会冻结我的应用程序。只是为了记录,当连接到 iOS 6 中的集成框架时,一切都正确验证,无论如何都是通过 FB SDK 完成的。只有当我尝试使用网络登录时,即点击 FBLoginView 网站打开,获得身份验证,返回应用程序。这是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];

至于委托方法,我已经一字不差地实现了它们。为什么应用程序崩溃?当我的应用程序和示例应用程序之间的所有代码几乎相同时,没有正当的崩溃理由。即使启用了 Zombie Objects,调试器也无济于事。实际的错误是: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 帐户,它可以正常工作,但如果没有,它会崩溃。值得一提的是,如果我删除了 url 方案,那么该应用程序就无法访问网络浏览器或 facebook 应用程序,它将使用一个网络视图来登录,这也可以

编辑:据我所知,我的问题在于无法访问我在 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 开发者中心,该应用程序被设置为沙盒模式,这就是导致此错误的原因。看来这毕竟不是代码的问题。

于 2013-04-22T09:35:31.960 回答
1

Facebook 已修复导致许多开发人员出现此问题的服务器错误。但是,服务器修复只会降低无限循环问题发生的可能性。它仍然存在。我创建了一个新错误来跟踪无限循环问题。

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

于 2013-04-23T21:49:34.740 回答
1

这是内存访问错误,因为 loginView 在 __block 空间中。

只需在此区域中移动您的控制器( loginView 委托),它应该可以工作。

FBLoginView *loginview = [[FBLoginView alloc] init];
static id staticDelegateInstance = self;

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

[self.view addSubview:loginview];

[loginview sizeToFit];
于 2014-07-31T13:28:19.510 回答