安装了 Facebook 应用程序的 Facebook SDK iOS 登录

Posted

技术标签:

【中文标题】安装了 Facebook 应用程序的 Facebook SDK iOS 登录【英文标题】:Facebook SDK iOS login with Facebook app installed 【发布时间】:2012-03-19 20:37:20 【问题描述】:

更新:我意识到只有当用户已经授予 Facebook 访问我的应用程序的权限,然后重新安装我的应用程序时,才会出现以下问题。用户第一次在我的应用程序中选择Facebook按钮时,它会去Facebook应用程序进行认证,但是由于认证状态仍然保存在Facebook应用程序中,所以它立即返回到我的应用程序而不向用户解释,并且postToFacebookWall 方法失败。

更新 2:我最终实施了此处找到的解决方案:How to authorize user through a DIALOG with the NEW Facebook Connect ios API? 并避免使用 Facebook 应用程序。 Safari 更好,因为至少用户会收到一条消息说他们将登录。但是,Feed 对话仍然像以前一样第一次失败。


我遇到了一定是常见问题,但我还没有找到解决方案。请注意,我的应用仅限于 iOS 5 及更高版本。

我有一个带有 Facebook 按钮的应用程序,用于发布到用户墙上。按下按钮时,应用程序将检查用户是否已授予应用程序发布到墙上的权限。如果有,则会弹出一个带有墙帖信息的提要对话框的视图。如果他们没有,Safari 将被打开并允许用户登录。登录后,他们将被带回应用程序,并弹出 Feed Dialog 视图。

如果未安装 Facebook 应用程序,这适用于模拟器和我的设备。如果安装了 Facebook 应用程序,用户将被带到 Facebook 应用程序,但随后立即返回到原始应用程序,不允许用户做任何事情。提要对话框弹出,但它完全空白并自动关闭。再次按下 Facebook 按钮将调出 Feed Dialog 视图,一旦用户授予应用程序发布到他们的墙上的权限,它就应该如此。

我几乎按照此处的说明进行操作: 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)。

【问题讨论】:

【参考方案1】:

这听起来像是一个例外情况,因为它是“仅当应用程序被安装、验证、然后卸载、然后重新安装时”的场景。

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

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

   [facebook authorizeWithFBAppAuth:NO safariAuth:NO];

再说一次,我想你也可以使用 safari auth。

【讨论】:

这听起来像是可行的。我试试看。【参考方案2】:

我最终通过实施此处找到的两个解决方案解决了我的问题:

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

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

【讨论】:

以上是关于安装了 Facebook 应用程序的 Facebook SDK iOS 登录的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 开发者登录错误

iOS Facebook 登录停止工作

Facebook Phonegap 插件 - 能够登录(似乎)但无法获取访问令牌

Grails - Spring Security / Social - Facebook 插件 setAccessToken 和 getAccessToken

Cordova SocialSharing 插件 - Facebook 回调错误

Facebook 集成到 iPhone 应用程序中