简体   繁体   English

iOS Facebook登录-链接器错误

[英]iOS Facebook login - Linker errors

I am trying to implement facebook login in my app, i have followed these two guides to the letter: 我正在尝试在我的应用程序中实现Facebook登录,我已遵循这封信的这两个指南:

http://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ https://developers.facebook.com/docs/howtos/login-with-facebook-using-ios-sdk/ http://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ https://developers.facebook.com/docs/howtos/login-with-facebook-using-ios-sdk/

But i get a linker error when i try to compile the app for iPhone emulator. 但是,当我尝试为iPhone模拟器编译应用程序时,出现链接器错误。

Undefined symbols for architecture i386:
  "_FBSessionStateChangedNotification", referenced from:
      -[AppDelegate sessionStateChanged:state:error:] in AppDelegate.o
      -[LoginViewController viewDidLoad] in LoginViewController.o
      -[AppDelegate sessionStateChanged:state:error:] in AppDelegate.o
      -[LoginViewController viewDidLoad] in LoginViewController.o
ld: symbol(s) not found for architecture i386

I have made sure all the necessary frameworks and files is in the right place. 我确保所有必要的框架和文件都在正确的位置。 Also, i get no code errors in Xcode, so i really don't know whats wrong here. 另外,我在Xcode中没有任何代码错误,所以我真的不知道这里出了什么问题。

Please, any help is greatly appriciated. 请帮助您。


EDIT: 编辑:

//AppDelegate.h

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

@interface AppDelegate : UIResponder <UIApplicationDelegate> {

}

@property (strong, nonatomic) UIWindow *window;

extern NSString *const FBSessionStateChangedNotification;
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI;
- (void)closeSession;
@end

- --

//  AppDelegate.m

#import "AppDelegate.h"
#import "NetworkCheck.h"


@implementation AppDelegate

- (void)dealloc
{
    [_window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    NSLog(@"Application launch");

    NetworkCheck *netCheck = [[NetworkCheck alloc] init];
    [netCheck startCheck];

    NSString *const FBSessionStateChangedNotification =     @"com.example.Login:FBSessionStateChangedNotification";


    return YES;
}

/*
 * If we have a valid session at the time of openURL call, we handle
 * Facebook transitions by passing the url argument to handleOpenURL
 */
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
    return [FBSession.activeSession handleOpenURL:url];
}

/*
 * Callback for session changes.
 */
- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:[FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

[[NSNotificationCenter defaultCenter]
 postNotificationName:FBSessionStateChangedNotification
 object:session];

if (error) {
    UIAlertView *alertView = [[UIAlertView alloc]
                              initWithTitle:@"Error"
                              message:error.localizedDescription
                              delegate:nil
                              cancelButtonTitle:@"OK"
                              otherButtonTitles:nil];
    [alertView show];
}
}

/*
 * Opens a Facebook session and optionally shows the login UX.
 */
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
return [FBSession openActiveSessionWithReadPermissions:nil
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,
                                                         FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session
                                                             state:state
                                                             error:error];
                                     }];
}

- (void) closeSession {
[FBSession.activeSession closeAndClearTokenInformation];
}

- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
// Called as part of the transition from the background to the inactive state; here you     can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

// We need to properly handle activation of the application with regards to Facebook Login
// (e.g., returning from iOS 6.0 Login Dialog or from fast app switching).
[FBSession.activeSession handleDidBecomeActive];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
[FBSession.activeSession close];
}

@end

FBSessionStateChangedNotification is an extern definition that's supposed to be visible within any header file you're importing in order to be accessible to the code you write in your appDelegate. FBSessionStateChangedNotification是一个extern定义,应该在要导入的任何头文件中可见,以便您在appDelegate中编写的代码可以访问。

You need to transfer this line: 您需要转移这一行:

NSString *const FBSessionStateChangedNotification = @"com.example.Login:FBSessionStateChangedNotification";

To a file that will make it visible for other classes (not only the app delegate). 到将使其在其他类(不仅是应用程序委托)中可见的文件。

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

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