6

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

更新 2:我最终实现了此处找到的解决方案:如何使用新的 Facebook Connect iOS API 通过 DIALOG 授权用户?并避免使用 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)。

4

2 回答 2

3

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

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

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

   [facebook authorizeWithFBAppAuth:NO safariAuth:NO];
}

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

于 2012-03-22T19:44:50.223 回答
1

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

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

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

于 2012-03-26T03:09:43.147 回答