已安装Facebook应用程序的Facebook SDK iOS登录
更新:我已经意识到,如果用户已将Facebook访问权限授予我的应用程序,然后重新安装我的应用程序,则只会发生以下问题。用户第一次在我的应用程序中选择Facebook按钮时,它会转到Facebook应用程序以获取身份验证,但由于身份验证状态仍保存在Facebook应用程序中,它会立即返回到我的应用程序,而不会向用户解释, postToFacebookWall方法失败。已安装Facebook应用程序的Facebook SDK iOS登录
更新2:我最终实现了这里找到的解决方案:How to authorize user through a DIALOG with the NEW Facebook Connect iOS API?并避免了Facebook应用。 Safari更好,因为至少用户会收到一条消息,表示他们将登录。但是,Feed对话仍然像以前一样第一次失败。
我有什么必须是常见问题,但我还没有找到解决方案呢。请注意,我的应用仅限于iOS 5及以上版本。
我有一个Facebook按钮的应用程序张贴到用户墙上。当按钮被按下时,应用程序将检查用户是否已经允许应用程序张贴到墙上。如果他们有,一个视图会弹出一个包含墙贴信息的Feed对话框。如果他们没有,Safari将被打开,用户将被允许登录。登录后,他们将被带回应用程序,并会弹出Feed对话框视图。
这适用于模拟器和我的设备上,如果未安装Facebook应用程序。如果Facebook应用程序已安装,用户将被带到Facebook应用程序,但随后会立即返回到原始应用程序,而不允许用户执行任何操作。 Feed对话框弹出,但它是完全空白的并自动关闭。再次按下Facebook按钮将弹出Feed对话框视图,因为一旦用户允许应用程序发布到墙上时,它应该是这样。
我几乎跟着这个网址的指示: http://developers.facebook.com/docs/mobile/ios/build/#implementsso
这里: http://developers.facebook.com/docs/reference/dialogs/feed/
在AppDelegate中,我有以下代码:
- (void)loginToFacebook
{
// Set up facebook
self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"]) {
self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![self.facebook isSessionValid]) {
[self.facebook authorize:nil];
}
}
// This is an FBSessionDelegate protocol method
// that gets called after a successful login
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil];
}
// This is a UIApplicationDelegate protocol method
// It is called when safari is dismissed
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [self.facebook handleOpenURL:url];
}
这之间唯一的区别和示例代码是我添加了由我的视图控制器拾取的NSNotification,其中我有以下代码:
- (void)facebookButtonPressed:(UIControl*)sender
{
Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook];
if (![facebook isSessionValid])
{
// Login to facebook if not already logged in
[(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook];
}
else
{
[self postToFacebookWall];
}
}
- (void)postToFacebookWall
{
Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook];
/*Facebook Application ID*/
// TODO: Get this either from the AppDelegate facebook property or the info plist
NSString *client_id = @"YOUR_APP_ID";
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
kAppId, @"app_id",
@"http://developers.facebook.com/docs/reference/dialogs/", @"link",
@"http://fbrell.com/f8.jpg", @"picture",
@"Facebook Dialogs", @"name",
@"Reference Documentation", @"caption",
@"Using Dialogs to interact with users.", @"description",
nil];
[facebook dialog:@"feed" andParams:params andDelegate:self];
}
有谁知道如何解决我的问题? (另外,如果不清楚,我的代码中的YOUR_APP_ID将替换为我的应用程序ID)。
这听起来像是一种情况,因为这是'只有当应用程序安装,验证,然后卸载,然后重新安装'的情况。
当发生这种特殊情况时,您应该能够回退到“经典网络视图身份验证”。
if (facebookAppDidNotReturnProperly) {
// therefore I must have been re-installed
// fallback to UIWebView
[facebook authorizeWithFBAppAuth:NO safariAuth:NO];
}
然后,你也可以使用safari auth我也想。
这听起来像它可能是可行的。我会试一试。 – Darren 2012-03-23 10:49:17