Facebook SDK FBLoginView 获取 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】Facebook SDK FBLoginView 获取 EXC_BAD_ACCESS【英文标题】:Facebook SDK FBLoginView getting EXC_BAD_ACCESS 【发布时间】:2013-04-19 21:28:52 【问题描述】:

我正在关注与 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");
                ];

这有帮助吗?

【问题讨论】:

【参考方案1】:

我遇到的问题似乎是确切的问题,但我的应用程序沙盒模式已被禁用。这个应用程序之前一直运行良好,但我刚刚升级了 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];

【讨论】:

有意思,你说的 URL 方案在哪里?看看它如何在 Web 视图中授权会很有趣。我猜你失去了 Facebook 应用程序的授权。 寻求帮助。尝试将您的代码与 HelloFacebookSample 进行比较,然后报告。 嗨,我的代码没有问题。经过大量调试后,我得出结论,问题在于无法访问我的应用程序。我将编辑我的帖子,提供我找到的所有信息。 我遇到了与您类似的另一个问题,如果应用程序无法连接到互联网,它将以完全相同的方式崩溃。错误处理有问题吗?这是 3 次类似的崩溃,原因有 3 个! 好的,干得好!您能否更详细地解释一下您是如何获得解决方法的?另外,您对为什么 FBUtility 无法从 Facebook 获取我们的应用设置有任何想法吗?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

是内存访问错误,因为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];

【讨论】:

您能详细说明一下这个解决方案吗?不清楚。 嗨@Hooman,我爬进了facebook代码,我看到loginview是在__block内存空间中声明的。这对应于静态内存分配。将 Loginview 委托声明为静态可避免内存访问错误。那是两个月前的事了,所以如果你想了解更多细节,我必须再次检查我的代码。至少,这对我来说非常有效。

以上是关于Facebook SDK FBLoginView 获取 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

如果我们从设置中有 Facebook 会话,FBLoginView 不会发出警报

Facebook SDK FBSession 无限循环和崩溃

iOS Facebook SDK 权限未经审查

iOS Facebook SDK 本地化

如何从 FBLoginView 获取头像?

Facebook FBLoginView 自定义 loginView 按钮互联网问题