简体   繁体   English

Facebook iOS SDK:使用Facebook登录失败

[英]Facebook iOS SDK : Login with Facebook failed

after I read few references on the internet, I decided to use Facebook SDK for iOS instead of XCode Social Framework . 在网上阅读了一些参考文献之后,我决定使用Facebook SDK for iOS代替XCode Social Framework

Because what I need on my app is 'login with facebook' session and I'm following its sample code named SessionLoginSample under Sample folder but it doesn't work when I put on my code. 因为我需要在应用程序上执行“使用facebook登录”会话,并且正在遵循Sample文件夹下名为SessionLoginSample的示例代码,但是在我放置代码时它不起作用。 These code was build successfully on iPad simulator but when I click the button, nothing happen. 这些代码已在iPad模拟器上成功构建,但是当我单击按钮时,什么也没有发生。

Could you please show me where did I miss here... thank you... 你能告诉我我在哪里想念...谢谢...

I have this AppDelegate.h : 我有这个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

and here's my AppDelegate.m : 这是我的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

my ViewController.h : 我的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

my ViewController.m : 我的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

UPDATE : I have add FacebookSDK.framework under Framework folder on my project, also modified the plist file based on this introduction too : 更新:我在我的项目的Framework文件夹下添加了FacebookSDK.framework,也基于此介绍修改了plist文件:

In my view you are mission a call like -setActiveSession in 在我看来,您的使命是像-setActiveSession这样的调用

if (appDelegate.session.state != FBSessionStateCreated) 
{
   appDelegate.session = [[FBSession alloc] init];
   [FBSession setActiveSession:appDelegate.session];
}

I had the same problem integrating iOS Facebook sdk 3.5 a month ago, And I found out that your current active session doesn't set automatically. 一个月前,我在集成iOS Facebook sdk 3.5时遇到了同样的问题,并且发现您当前的活动会话不会自动设置。 So I have this call wherever there is a chance of getting a different session instance. 因此,只要有机会获得不同的会话实例,我都会拨打此电话。

Also, 也,

inside

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

instead of self.session, you should use FBSession.activeSession just to ensure that the FBAppCall gets the same instance of FBSession, for which it has got the result. 您应该使用FBSession.activeSession而不是self.session来确保FBAppCall获得与FBSession相同的实例,并为其获取结果。

Hope that helps. 希望能有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM