我是iOS开发的新手。我遇到一个问题,在我的应用程序中集成facebook API时没有调用fbDidLogin。当我从主视图控制器(即app委托调用的那个)调用API时,一切都很完美,但在我的情况下,它在设置视图控制器下。我从字面上复制粘贴代码从主视图控制器(它工作的地方)到设置视图控制器,它不起作用。
我确实将此方法添加到应用代理中,我理解这是大多数人的问题,但就我而言,我认为问题出在其他地方......任何帮助都会很棒。
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[settingsvc facebook] handleOpenURL:url];
}
app委托标题中的位置:
@property (strong, nonatomic) Settings *settingsvc;
答案 0 :(得分:6)
一些事情。
- 您只需要在整个应用程序的一个位置实现fbDidLogin。您不会在使用Facebook的每个视图控制器上实现它。
- 假设您按照Facebook的iOS文档中的“入门”步骤操作,您的Facebook对象将作为您的应用代表的属性。并且您的fbDidLogin方法仅在您的app委托中 。这也应该是代码中声明Facebook变量的唯一位置。这意味着无论何时从代码中的任何其他位置访问Facebook,您都会执行以下操作:
ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate.facebook someMethod];
- 您的app委托中的handleOpenURL和openURL方法应该与Facebook的示例文档完全相同,而不是您发布的代码。
- 我个人更喜欢将Facebook对象从app委托移到单一帮助程序类中,但如果你是初学者,那么这可能比你需要的更高级。
更新信息回复评论:
-someMethod是你想要调用的任何Facebook方法(发布在墙上,验证,等等)
- 您应该将所有FBSessionDelegate方法放在您的app委托
中- 您需要在发布到Facebook的视图控制器上实现FBDialogDelegate
- 当您想要发布到用户的墙上时,在视图控制器中执行以下操作:
- (void)postToWall {
ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
if (appDelegate.facebook.isSessionValid) {
//we're logged in so call the post dialog
[self doPost:nil];
} else {
//we're not logged in so call the login and then do the post when it's done
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doPost:) name:@"FBLoginComplete" object:nil];
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"offline_access",
@"publish_stream",
nil];
[appDelegate.facebook authorize:permissions];
[permissions release];
}
}
-(void)doPost:(NSNotification *) notification {
ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
if (appDelegate.facebook.isSessionValid) {
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
something, @"app_id",
something, @"link",
something, @"picture",
something, @"name",
something, @"caption",
something, @"description",
nil];
[appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self];
[params release];
}
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- 为了使上述工作正常,您需要在登录完成(成功或失败)时发布NSNotificationCenter消息“FBLoginComplete”。
注意:我编写了上面的代码而没有编译或测试它所以它可能不完美(但它通常是:)
- 请注意:如果没有弹出dailog,你不能直接发布到用户的墙上。用户始终可以在帖子到达墙壁之前对其进行编辑。
答案 1 :(得分:1)
您是否已在FBRequestDelegate
上实施了不是MainViewController的委托yourViewController.h
?
FBRequestDelegate
包含许多有用的facebook请求处理程序,例如。
//Called just before the request is sent to the server.
- (void)requestLoading:(FBRequest *)request;
//Called when the server responds and begins to send back data
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response;
//Called when an error prevents the request from completing successfully.
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;
/**
*Called when a request returns and its response has been parsed into
*an object.
*The resulting object may be a dictionary, an array, a string, or a number,
*depending on thee format of the API response.
*/
- (void)request:(FBRequest *)request didLoad:(id)result;
/**
*Called when a request returns a response.
*The result object is the raw response from the server of type NSData
*/
- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data;
希望它可以帮到你!