Facebook iOS SDK:使用 Facebook 登录失败

Posted

技术标签:

【中文标题】Facebook iOS SDK:使用 Facebook 登录失败【英文标题】:Facebook iOS SDK : Login with Facebook failed 【发布时间】:2013-09-09 06:55:29 【问题描述】:

在网上阅读了一些参考资料后,我决定使用Facebook SDK for ios 而不是XCode Social Framework

因为我的应用程序需要的是 'login with facebook' 会话,并且我在 Sample 文件夹下遵循其名为 SessionLoginSample 的示例代码,但是当我输入代码时它不起作用。这些代码在 iPad 模拟器上构建成功,但是当我点击按钮时,什么也没有发生。

你能告诉我我错过了哪里吗...谢谢...

我有这个 AppDelegate.h

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;

@property (strong, nonatomic) FBSession *session;

@end

这是我的 AppDelegate.m

#import "AppDelegate.h"
#import "ViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;
@synthesize session = _session;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;


- (void)applicationWillResignActive:(UIApplication *)application



- (void)applicationDidEnterBackground:(UIApplication *)application



- (void)applicationWillEnterForeground:(UIApplication *)application



- (void)applicationDidBecomeActive:(UIApplication *)application

    [FBAppEvents activateApp];
    [FBAppCall handleDidBecomeActiveWithSession:self.session];


- (void)applicationWillTerminate:(UIApplication *)application

    [self.session close];



- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation 
    // attempt to extract a token from the url
    return [FBAppCall handleOpenURL:url
                  sourceApplication:sourceApplication
                        withSession:self.session];


#pragma mark Template generated code

@end

我的 ViewController.h

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>

@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UITextField *fieldEmail;
@property (strong, nonatomic) IBOutlet UITextField *fieldPassword;
@property (strong, nonatomic) IBOutlet UILabel *titleLogin;
@property (strong, nonatomic) IBOutlet UILabel *labelOutput;

- (IBAction)buttonRegister;
- (IBAction)buttonLogin;
- (IBAction)loginFacebook;
- (IBAction)loginTwitter;

@end

我的 ViewController.m

#import "ViewController.h"
#import "AppDelegate.h"

@interface ViewController ()

@property (strong, nonatomic) UINavigationController* navController;

@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


- (void) alertWithTitle:(NSString *)title andMessage:(NSString *)msg

    UIAlertView *message = [[UIAlertView alloc] initWithTitle:title
                                                      message:msg
                                                     delegate:nil
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [message show];


- (IBAction)loginFacebook 
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];

    if (appDelegate.session.isOpen) 
        [appDelegate.session closeAndClearTokenInformation];

     else 
        if (appDelegate.session.state != FBSessionStateCreated) 
            appDelegate.session = [[FBSession alloc] init];
        

        [appDelegate.session openWithCompletionHandler:^(FBSession *session,
                                                         FBSessionState status,
                                                         NSError *error) 
            [self alertWithTitle:(@"FB Login") andMessage:(@"It works!!")];
        ];
     

@end

更新:我在项目的Framework文件夹下添加了FacebookSDK.framework,还修改了基于this introduction的plist文件:

【问题讨论】:

检查设备您是否已授予使用您正在处理的应用程序的权限以及您是否已经在设备上注册了 facebook 应用程序.....检查步骤和然后在设备上运行该应用程序。我认为它会为 Facebook 登录提供登录页面。 我已经在我的 iPad 上安装/运行了这个应用程序,所以我相信我的设备已经获得了许可。我还在我的 Facebook 帐户上创建了一个应用程序。而且由于它是新应用,而且按钮不起作用,我还没有在我的设备上授权。 希望您已按照示例应用程序中提供的所有步骤进行操作。您可以通过进入设置来检查授予您在 ipad 中使用的应用程序的 Facebook 设置的权限。我遇到了同样的问题,正是这个原因在点击 facebook 按钮时什么也没做。请先检查一下。与此同时,我会为您提供一些我拥有的链接。 查看他的链接并浏览所有答案一次 -***.com/questions/14159965/… .. 可能对您有帮助。谢谢 【参考方案1】:

在我看来,你的使命是像 -setActiveSession 这样的调用

if (appDelegate.session.state != FBSessionStateCreated) 

   appDelegate.session = [[FBSession alloc] init];
   [FBSession setActiveSession:appDelegate.session];

一个月前我在集成 iOS Facebook sdk 3.5 时遇到了同样的问题,我发现您当前的活动会话没有自动设置。因此,只要有机会获得不同的会话实例,我就会进行此调用。

还有,

里面

    - (void)applicationDidBecomeActive:(UIApplication *)application
   
      [FBAppEvents activateApp];
      [FBAppCall handleDidBecomeActiveWithSession:self.session];
   

你应该使用 FBSession.activeSession 而不是 self.session,只是为了确保 FBAppCall 获得相同的 FBSession 实例,它已经获得了结果。

希望对您有所帮助。

【讨论】:

以上是关于Facebook iOS SDK:使用 Facebook 登录失败的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 [FBDialogs presentOSIntegratedShareDialogModallyFrom] 通过 SDK 3.5 将图像发布到 facebook 吗?

Facebook Android SDK 4.0:newGraphPathRequest 返回“必须使用活动访问令牌来查询有关当前用户的信息。”

从 facebook API 保存用户的个人资料图片 - PHP SDK V.5

无法在 Xcode Swift Facebook 登录 SDK 中获取访问令牌

如果目标 iPhone 应用在 App Store 上不可用,如何测试 Facebook SDK 的 apprequest?

iOS:通过自动登录获取 Facebook 访问令牌