Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to authorize user through a DIALOG with the NEW Facebook Connect iOS API?

I understand - http://developers.facebook.com/docs/guides/mobile/#ios -, seems really useful, but my app won't support multitasking, so this "cross safari" method won't work for me.

Is there a brief example somewhere (or can someone please copy here) an authentication process trough FBDialogs (with this so called "new" API)? I'm just getting know this SDK, so please as basic as you can.

like image 300
Geri Borbás Avatar asked Apr 05 '11 21:04

Geri Borbás


2 Answers

Struggled to figure this out for a couple of hours...

Here is the solution to bypass fb app|background-safari authentication, and it is just to change in Facebook.m:

[self authorizeWithFBAppAuth:YES safariAuth:YES]

to

[self authorizeWithFBAppAuth:NO safariAuth:NO]

in the method:

- (void)authorize:(NSArray *)permissions
     delegate:(id<FBSessionDelegate>)delegate

.

Verified it with the sample code without changing anything else (of course set kAppId to yours)

I was quite mad why on earth FB doesn't document this...

Hope it helps,

Cheers

like image 64
Khiet Avatar answered Oct 14 '22 03:10

Khiet


All the magic is in

- (void)authorize:(NSArray *)permissions
     delegate:(id<FBSessionDelegate>)delegate

which call [self authorizeWithFBAppAuth:YES safariAuth:YES] :

  • FBAppAuth:YES will try to authenticate using Facebook app if installed
  • safariAuth:YES will try to authenticate using Safari if device supports multitasking

So what you want is [self authorizeWithFBAppAuth:NO safariAuth:NO]

If you want to leave unmodified the Facebook SDK you can simply "expose" their private api :

@interface Facebook (Private)
- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth
                    safariAuth:(BOOL)trySafariAuth;
@end

And then extend if with a category:

@interface Facebook (MyApp)
- (void)myAuthorize:(id<FBSessionDelegate>)delegate;
@end

@implementation Facebook (MyApp)

- (void)myAuthorize:(id<FBSessionDelegate>)delegate {
  _permissions = [[NSArray arrayWithObjects:@"email", *(whatever you need)*, nil] retain];
  _sessionDelegate = delegate;
  [self authorizeWithFBAppAuth:NO safariAuth:NO]; // force in app auth
}

@end

Then use it almost normally :

 Facebook *facebook = [[Facebook alloc] initWithAppId:MY_APP_FB_ID];
 [facebook myAuthorize:self];

That's a popular request they didn't implemented, there are even pull requests with solutions...

like image 20
Vincent Guerci Avatar answered Oct 14 '22 03:10

Vincent Guerci