facebook fbDidLogin在appdelegate之外

And*_*ryn 1 delegates facebook login objective-c facebook-graph-api

我已经阅读了很多关于facebook登录的问题,但直到没有我没有成功解决我的问题.到目前为止我已经制作了一些应用程序,但我之前从未搞过appDelegate.

问题是我想调用除了委托之外的类内部的fbDidLogin方法.

到目前为止,fbDidLogin正在appDelegate中调用,但我希望能够在登录发生后更改视图并询问用户信息.

我的代码到目前为止:AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];

    facebook = [[Facebook alloc] initWithAppId:SHKCONFIG(facebookAppId) andDelegate:self];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{
    return [facebook handleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{
    return [facebook handleOpenURL:url];
}

// This one is called correctly
- (void)fbDidLogin {
    NSLog(@"[DELEGATE] Deu login!");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}
Run Code Online (Sandbox Code Playgroud)

我自己上课的facebook登录按钮:

- (void)loginFacebook {

    if (![facebook isSessionValid]) {
        NSLog(@"[LOGIN] Facebook session invalid");
        NSArray * permissions =  [[NSArray alloc] initWithObjects:
                                 @"email",
                                 @"user_birthday",
                                 nil];
        [facebook authorize:permissions];   
        [permissions release];
    } else {
        NSLog(@"[LOGIN] Facebook session valid");
        [facebook requestWithGraphPath:@"me" andDelegate:self];
    }
}
// I want this one to work so I can ask for user info at the end of it
- (void)fbDidLogin {
    NSLog(@"[LOGIN][FB] Deu login!");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
    [facebook requestWithGraphPath:@"me" andDelegate:self];
}
Run Code Online (Sandbox Code Playgroud)

对不起,如果不清楚,如果您需要更多信息,请告诉我.

ros*_*eau 5

您可以从App Delegate发布通知,如下所示:

- (void)fbDidLogin {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidLoginCalled" object:nil];
}
Run Code Online (Sandbox Code Playgroud)

然后在你的其他课堂上:

- (void)loginFacebook {

    if (![facebook isSessionValid]) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fbDidLoginNotificationFired) name:@"FBDidLoginCalled" object:nil]
        NSLog(@"[LOGIN] Facebook session invalid");
        NSArray * permissions =  [[NSArray alloc] initWithObjects:
                             @"email",
                             @"user_birthday",
                             nil];
        [facebook authorize:permissions];   
        [permissions release];
    } else {
        NSLog(@"[LOGIN] Facebook session valid");
        [facebook requestWithGraphPath:@"me" andDelegate:self];
    }
}
// I want this one to work so I can ask for user info at the end of it
- (void)fbDidLoginNotificationFired {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"FBDidLoginCalled" object:nil];

    NSLog(@"[LOGIN][FB] Deu login!");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
    [facebook requestWithGraphPath:@"me" andDelegate:self];
}
Run Code Online (Sandbox Code Playgroud)