2013-09-09 4 views
0

после того, как я прочитал несколько ссылок в Интернете, я решил использовать Facebook SDK for iOS вместо XCode Social Framework.Facebook iOS SDK: Ошибка входа с Facebook

Потому что то, что мне нужно в моем приложении, - это 'login with facebook' сеанс, и я следую его примеру кода с именем SessionLoginSample в папке Sample, но он не работает, когда я накладываю свой код. Этот код был успешно создан на 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 

UPDATE: Я добавить FacebookSDK.framework под Framework папку на моем проекте, а также модифицированный файл Plist, основанный на this introduction тоже:

+0

Проверьте устройство, предоставили ли вы разрешение на использование приложения, над которым работаете, и уже зарегистрировались ли вы с приложением facebook на устройстве. Проверьте все этапы, а затем запустите приложение. device.i думаю, тогда он будет обучать страницу входа для входа в facebook. – sac

+0

Я устанавливаю/запускаю это приложение на своем iPad, поэтому считаю, что у моего устройства уже есть разрешение. Я также создал приложение в своей учетной записи Facebook. И поскольку это новое приложение, и поскольку кнопка не работает, я не авторизуюсь на своем устройстве. –

+0

Надеясь, что вы выполнили все шаги, указанные в примере приложения. Вы можете проверить разрешения, предоставленные для использования настроек facebook для приложения, над которым вы работаете в ipad, путем перехода к настройкам. Я столкнулся с той же проблемой, и именно по этой причине он ничего не делал при нажатии кнопки facebook. Пожалуйста, проверьте это первым. В то же время я предоставил бы вам некоторые ссылки, которые у меня есть. – sac

ответ

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]; 
    } 

вместо self.session, вы должны использовать FBSession.activeSession только для того, чтобы FBAppCall получает тот же экземпляр FBSession, для которого он получил результат ,

Надеюсь, что это поможет.