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

Dar*_*ren 6 facebook facebook-wall ios ios5 facebook-login

更新:我已经意识到,如果用户已经授予Facebook访问我的应用程序,然后重新安装我的应用程序,则只会出现以下问题.用户第一次在我的应用程序中选择Facebook按钮时,会转到Facebook应用程序进行身份验证,但由于身份验证状态仍保存在Facebook应用程序中,因此会立即返回到我的应用程序而无需向用户解释,并且postToFacebookWall方法失败.

更新2:我最终实现了这里找到的解决方案:如何使用新的Facebook Connect iOS API通过DIALOG授权用户?并避免使用Facebook应用程序.Safari更好,因为至少用户会收到一条消息,告知他们将登录.但Feed对话仍然是第一次失败.


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

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

这适用于模拟器,如果未安装Facebook应用程序,则可在我的设备上使用.如果安装了Facebook应用程序,用户将被带到Facebook应用程序,但随后立即返回到原始应用程序,而不允许用户执行任何操作.弹出Feed对话框,但它完全空白并自动关闭.再次按下Facebook按钮将显示"订阅源"对话框视图,因为一旦用户授权应用程序发布到他们的墙上,它就应该显示.

我几乎遵循了这里的说明: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]; 
}
Run Code Online (Sandbox Code Playgroud)

这和示例代码之间的唯一区别是我添加了一个由我的视图控制器拾取的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];
    }
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决我的问题?(另外,如果不清楚,我的代码中的YOUR_APP_ID将替换为我的应用ID).

Dar*_*ren 1

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

/sf/answers/397841811/

/sf/answers/639652121/