iphone - Facebook SDK FBLoginView 获取 EXC_BAD_ACCESS

标签 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];

至于委托(delegate)方法,我已经一字不漏地实现了它们。为什么应用程序会崩溃?当我的应用程序和示例应用程序之间的所有代码几乎相同时,没有正当理由导致崩溃。即使启用了 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");
                }];
}

这有什么帮助吗?

最佳答案

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

如果我在 iOs 中配置了 facebook 帐户,它会工作正常,但如果没有,它会崩溃。 值得一提的是,如果我删除了 url scheme,那么该应用程序将无法访问网络浏览器或 facebook 应用程序,它将使用 WebView 进行登录,这也有效

编辑:据我所知,我的问题在于无法访问我在 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,设置页面中有一些参数已过时(未设置客户端 token ,授权为 native /桌面而不是 Web,没有应用 key 在应用程序中),但我已经设置好了..

编辑 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];
}

关于iphone - Facebook SDK FBLoginView 获取 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16113756/

相关文章:

ios - 除了使用 GSEvent 来伪造 iOS 7 设备上的触摸事件之外,还有其他方法吗?

iOS webview 连接错误处理

ios - Swift 中从 Dictionary 获取 JSON 对象

ios - 不使用 dispatch_async 和重复 NSTimer 调用的方法

ios - UIWebView 中 PDF 周围的黑色边框,如何使用 Swift 删除

android - 作为 Web 服务的 SIP API

ios - Objective-C 方法与可选要求方法 Swift 冲突

objective-c - 如果我在使用 ARC 时未能初始化变量,clang 如何警告我?

ios - iOS应用程序不适合iPhone 5屏幕

iphone - iTunes文件共享-如何上传不同的文件夹?