Facebook Api可以在iOS应用中签入用户 [英] Facebook Api to check in users in an iOS app

查看:54
本文介绍了Facebook Api可以在iOS应用中签入用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望使用Facebook Api在iOS应用中签入用户.

I'm looking to use the Facebook Api to check in users in an iOS app.

我想知道我是否在AppDelegate中设置了权限,但希望用户从其他视图控制器中签入,是否必须在每个视图控制器中声明Facebook实例以及FBRequestDelegate,FBSessionDelegate,FBDialogDelegate委托方法?还是AppDelegate中的一回事?

I was wondering if I have the permissions set in the AppDelegate but want the user to checkin from a different view controller do I have to declare the Facebook instance in every view controller along with the FBRequestDelegate, FBSessionDelegate, FBDialogDelegate delegate methods? or is it a one time thing in the AppDelegate?

感谢您的帮助.

推荐答案

我只是处理了完全相同的问题.这是我的解决方案:

I just dealt with the exact same problem. Here is my solution:

我创建了一个 FBRequestWrapper ,其中基本上包含以下方法:

I Created a FBRequestWrapper which basically contains the following methods:

#import <Foundation/Foundation.h>
#import "Facebook.h"

#define FB_APP_ID @"xx"
#define FB_APP_SECRET @"xx"

@interface FBRequestWrapper : NSObject <FBRequestDelegate, FBSessionDelegate>
{
    Facebook *facebook;
    BOOL isLoggedIn;
}

@property (nonatomic, retain) Facebook *facebook;
@property (nonatomic, assign) BOOL isLoggedIn;

+ (id) defaultManager;
- (void) setIsLoggedIn:(BOOL) _loggedIn;
- (void) FBSessionBegin:(id) _delegate;
- (void) FBLogout;
- (void) getFBRequestWithGraphPath:(NSString*) _path andDelegate:(id) _delegate;
- (void) sendFBRequestWithGraphPath:(NSString*) _path params:(NSMutableDictionary*) _params andDelegate:(id) _delegate;

@end

因此所有Facebook内容都在此Singleton类中进行管理.

So all the Facebook stuff is managed in this Singleton class.

在我的 AppDelegate中,调用身份验证.因为我认为必须在加载所有控制器之前进行身份验证.

In my AppDelegate I invoke the authentication. Because in my opinion the authentication has to be done before loading all the controllers.

// FACEBOOK
requestWrapper = [FBRequestWrapper defaultManager];

BOOL loggedIn = [requestWrapper isLoggedIn];

// if the user is not currently logged in begin the session
if (!loggedIn) {
    [requestWrapper FBSessionBegin:(id)self];
} else {
    NSLog(@"Is already logged in!");
}

// Check if the access token is already there. In that case the user is already authenticated with facebook.
// Directly load the controllers and do not wait till facebook has returned back the access_token
if([[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"] != nil &&
   [[NSUserDefaults standardUserDefaults] objectForKey:@"exp_date"] != nil) {
    [self loadControllers];
}

您可以看到,我还将accessToken存储在NSUserDefaults空间中.因为我们正在使用accessToken作为对我们的Web服务的身份验证.

You can see that I also store the accessToken in the NSUserDefaults space. Because we are using the accessToken as authentication to our webservice.

我的AppDelegate方法委派了FBSessionDelegate方法:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate, FBSessionDelegate>

这是最重要的方法 fbDidLogin 的实现:

And here is the implementation of the most important method, fbDidLogin:

- (void) fbDidLogin {
    NSLog(@"AccessToken: %@", requestWrapper.facebook.accessToken);

    [[NSUserDefaults standardUserDefaults] setObject:requestWrapper.facebook.accessToken forKey:@"access_token"];
    [[NSUserDefaults standardUserDefaults] setObject:requestWrapper.facebook.expirationDate forKey:@"exp_date"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [self loadControllers];
}

在这里,我将访问令牌存储在NSUserDefaults中,并在一切正常的情况下加载所有Controller.

Here I store the accesstoken in the NSUserDefaults and load all the Controllers if everything was fine.

现在,如果您想从AppDelegate外部的任何控制器访问Facebook Graph Api,您还可以使用FBRequestWrapper,如下所示:

Now if you want to access the Facebook Graph Api from any controller outside the AppDelegate you can also use the FBRequestWrapper like that:

- (IBAction)test:(id)sender {
   // FBRequestWrapper
   NSString *graphPath = @"me/friends";

   [[FBRequestWrapper defaultManager] getFBRequestWithGraphPath:graphPath andDelegate:self];
}

这是FBRequestWrapper.m中的代码:

Here the code from the FBRequestWrapper.m:

#import "FBRequestWrapper.h"

static FBRequestWrapper *defaultWrapper = nil;

@implementation FBRequestWrapper
@synthesize isLoggedIn, facebook;

+ (id) defaultManager {

    if (!defaultWrapper)
        defaultWrapper = [[FBRequestWrapper alloc] init];

    return defaultWrapper;
}

- (void) setIsLoggedIn:(BOOL) _loggedIn {
    isLoggedIn = _loggedIn;

    if (isLoggedIn) {
        [[NSUserDefaults standardUserDefaults] setObject:facebook.accessToken forKey:@"access_token"];
        [[NSUserDefaults standardUserDefaults] setObject:facebook.expirationDate forKey:@"exp_date"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    else {
        [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"access_token"];
        [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"exp_date"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
}

- (void) FBSessionBegin:(id) _delegate {

    if (facebook == nil) {
        facebook = [[Facebook alloc] initWithAppId:FB_APP_ID andDelegate:_delegate];
        [facebook setSessionDelegate:_delegate];

        NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"];
        NSDate *exp = [[NSUserDefaults standardUserDefaults] objectForKey:@"exp_date"];

        if (token != nil && exp != nil && [token length] > 2) {
            isLoggedIn = YES;
            facebook.accessToken = token;
            facebook.expirationDate = [NSDate distantFuture];

            [self setIsLoggedIn:isLoggedIn];

            NSLog(@"Access token: %@", facebook.accessToken);
        } 
    }

    if(![facebook isSessionValid]) {
        NSArray *permissions = [NSArray arrayWithObjects:@"offline_access", @"read_friendlists", @"user_about_me", nil];

        // if no session is available login
        [facebook authorize:permissions];
    }
}
- (void) FBLogout {
    [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"access_token"];
    [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"exp_date"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [facebook logout:self];
}

// Make simple requests
- (void) getFBRequestWithGraphPath:(NSString*) _path andDelegate:(id) _delegate {
    if (_path != nil) {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

        if (_delegate == nil)
            _delegate = self;

        if(isLoggedIn) {
            NSLog(@"is logged in in the get method");
        } else {
            NSLog(@"Is NOT logged in the get metthod");
        }

        [facebook requestWithGraphPath:_path andDelegate:_delegate];
    }
}

// Used for publishing
- (void) sendFBRequestWithGraphPath:(NSString*) _path params:(NSMutableDictionary*) _params andDelegate:(id) _delegate {

    if (_delegate == nil)
        _delegate = self;

    if (_params != nil && _path != nil) {

        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
        [facebook requestWithGraphPath:_path andParams:_params andHttpMethod:@"POST" andDelegate:_delegate];
    }
}

#pragma mark -
#pragma mark FacebookSessionDelegate

- (void)fbDidLogin {
    isLoggedIn = YES;

    [[NSUserDefaults standardUserDefaults] setObject:facebook.accessToken forKey:@"access_token"];
    [[NSUserDefaults standardUserDefaults] setObject:facebook.expirationDate forKey:@"exp_date"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (void)fbDidNotLogin:(BOOL)cancelled {
    isLoggedIn = NO;
}

- (void)fbDidLogout {
    [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"access_token"];
    [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"exp_date"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    isLoggedIn = NO;
}


#pragma mark -
#pragma mark FBRequestDelegate

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    //NSLog(@"ResponseFailed: %@", error);
}

- (void)request:(FBRequest *)request didLoad:(id)result {
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    //NSLog(@"Parsed Response: %@", result);
}


/**
 * Called after the access token was extended. If your application has any
 * references to the previous access token (for example, if your application
 * stores the previous access token in persistent storage), your application
 * should overwrite the old access token with the new one in this method.
 * See extendAccessToken for more details.
 */
- (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt {
    NSLog(@"Fb did extend token.. NOT IMPLEMENTED YET!");
}

/**
 * Called when the current session has expired. This might happen when:
 *  - the access token expired
 *  - the app has been disabled
 *  - the user revoked the app's permissions
 *  - the user changed his or her password
 */
- (void)fbSessionInvalidated {
    NSLog(@"Fb session invalidated.. NOT IMPLEMENTED YET!");
}

@end

这篇关于Facebook Api可以在iOS应用中签入用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆