iOS 应用程序中的 Facebook 连接
Posted
技术标签:
【中文标题】iOS 应用程序中的 Facebook 连接【英文标题】:Facebook Connection in iOS App 【发布时间】:2013-07-23 12:00:00 【问题描述】:在我的新 ios 应用程序中,我必须登录 Facebook 并获取用户详细信息。我在这里阅读了教程 - http://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/authenticate/ 并研究了 Scrumptious 和其他示例。但我无法理解流程。
我创建了一个示例项目来进行 Facebook 登录(代码如下)-但主要问题如下:
为什么当我再次点击登录按钮时应用程序要求授权 - 在我点击 Facebook 上的“确定”一次之后下面是我的代码-
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// See if the app has a valid token for the current state.
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded)
// To-do, show logged in view --- LOGGED IN : Already Login
// Yes, so just open the session (this won't display any UX).
UIWindow *window = [UIApplication sharedApplication].keyWindow;
ViewController *rootViewController = (ViewController *)window.rootViewController;
[rootViewController openSession];
return YES;
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
return [FBSession.activeSession handleOpenURL:url];
- (void)applicationDidBecomeActive:(UIApplication *)application
[FBSession.activeSession handleDidBecomeActive];
@implementation ViewController
@synthesize lblStatus;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
lblStatus.text = @"Login Now";
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)login:(id)sender
[self openSession];
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
switch (state)
case FBSessionStateOpen:
// Connection is Open
lblStatus.text = @"FBSessionStateOpen";
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[FBSession.activeSession closeAndClearTokenInformation];
// Connection is Closed / Login Failed
lblStatus.text = @"FBSessionStateClosed";
break;
default:
break;
- (void)openSession
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error)
[self sessionStateChanged:session state:state error:error];
];
回答---->
感谢 nerowolfe 的建议。
以下是我连接到 Facebook 的完整解决方案。我的下一个任务是现在获取用户数据。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
return [FBSession.activeSession handleOpenURL:url];
- (void)applicationDidBecomeActive:(UIApplication *)application
[FBSession.activeSession handleDidBecomeActive];
--------------------------
@implementation ViewController
@synthesize lblStatus;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
lblStatus.text = @"Login Now";
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)login:(id)sender
[self openSession];
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
switch (state)
case FBSessionStateOpen:
// Connection is Open
lblStatus.text = @"FBSessionStateOpen";
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[FBSession.activeSession closeAndClearTokenInformation];
// Connection is Closed / Login Failed
lblStatus.text = @"FBSessionStateClosed";
break;
default:
break;
- (void)openSession
if(FBSession.activeSession.isOpen)
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:NO
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error)
[self sessionStateChanged:session state:state error:error];
];
else
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:YES
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error)
[self sessionStateChanged:session state:state error:error];
];
- (IBAction)logout:(id)sender
[FBSession.activeSession closeAndClearTokenInformation];
if(FBSession.activeSession.isOpen)
lblStatus.text = @"Open Still";
else
lblStatus.text = @"Close";
【问题讨论】:
【参考方案1】:只是不显示 LoginUI。
- (void)openSession
if(FBSession.activeSession.isOpen)
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:NO
completionHandler:
^(FBSession *session,
FBSessionState state, NSError *error)
[self sessionStateChanged:session state:state error:error];
];
【讨论】:
是的,这有帮助。现在,当会话打开时,我不再获得登录屏幕/授权屏幕。另一件事是 - 如果我想使用其他用户登录怎么办 - 我如何注销或终止当前会话 您发布的代码有两点 - 1. FBSession.activeSession.isOpen :这意味着我们正在检查会话是否处于活动状态,然后只进入内部。我们不应该检查“会话是否处于活动状态”吗? 2. "allowLoginUI:YES" 和 "allowLoginUI:NO" - 这有什么影响? 当然如你所愿。我刚刚向您展示了方式...顺便说一句,当然要使用 facebook sdk 方法,您需要在 FBRequest *postLocRequest = [FBRequest requestForPlacesSearchAtCoordinate:currentLocation radiusInMeters:1000 resultsLimit:1 searchText:self.location.name 之前分配活动会话]; postLocRequest.session = FBSession.activeSession;以上是关于iOS 应用程序中的 Facebook 连接的主要内容,如果未能解决你的问题,请参考以下文章
当我在 Safari 中将应用程序切换到 Facebook 时,防止 IOS 重新启动应用程序