Facebook Api可以在iOS应用中签入用户 [英] Facebook Api to check in users in an iOS app
问题描述
我希望使用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屋!