已安装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)。

我最终通过实现在这里发现了两种解决方案解决我的问题:

https://*.com/a/5683454/472344

https://*.com/a/9137887/472344

这听起来像是一种情况,因为这是'只有当应用程序安装,验证,然后卸载,然后重新安装'的情况。

当发生这种特殊情况时,您应该能够回退到“经典网络视图身份验证”。

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

然后,你也可以使用safari auth我也想。

+0

这听起来像它可能是可行的。我会试一试。 – Darren 2012-03-23 10:49:17