我正在关注与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");
}];
}
这有帮助吗?
答案 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来跟踪无限循环问题。
答案 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];