我正在关注与 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/