Facebook SDK FBLoginView获得EXC_BAD_ACCESS

时间:2013-04-19 21:28:52

标签: iphone ios objective-c facebook facebook-login

我正在关注与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 个答案:

答案 0 :(得分:2)

我有什么问题似乎是确切的问题,但我的应用程序沙盒模式已经被禁用了。这个应用程序之前一直运行良好,但我刚刚升级了SDK,现在发生这种情况。

如果我在iOs中配置了facebook帐户,它会正常工作,但如果没有,它会崩溃。 值得一提的是,如果我删除网址方案,那么应用程序无法访问网络浏览器或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,现在一切都运行良好。

值得一提的是,我已将SDK从2.0升级为已弃用,并且设置页面中有一些参数已过时(没有客户端令牌集,授权为本机/桌面而非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];
}

}

答案 1 :(得分:1)

有人在另一个帖子上找到答案。在Facebook开发人员中心,该应用程序设置为沙盒模式,这是导致此错误的原因。看起来它毕竟不是代码的问题。

答案 2 :(得分:1)

Facebook修复了一个服务器错误,导致很多开发人员错误。但是,服务器修复只会使无限循环问题不太可能发生。它仍然存在。我创建了一个新bug来跟踪无限循环问题。

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

答案 3 :(得分: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];