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

11,093

Solution 1

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

Solution 2

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...

Share:
11,093
Geri Borbás
Author by

Geri Borbás

I love this industry. In the past 10 years I made numerous Apps and Games from zero to market, both teamed and solo. I've been doing remote consultancy for the past 7 years. Built a tutoring app with a UK edtech startup, made a gamified fintech solution for a London studio, developed augmented reality experience for a Dutch game publisher, created smaller UI/UX design projects across the globe, and more. I also worked full-time for a global agency for years, collaborated on various products, early-phase start-ups in close-knit agile teams. Besides, I released several self-published products throughout the years embracing every responsibility from ideating through every phase of production to customer support.

Updated on June 21, 2022

Comments

  • Geri Borbás
    Geri Borbás almost 2 years

    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.

  • Oli
    Oli over 12 years
    This worked. Thanks! One alternative would be to check the launchOtions (application:didFinishLaunchingWithOptions:). The options would contain the launch URL including the tokens so they could be assigned either to the NSUserDefaults (if present of course) or directly to the facebook.accessToken and facebook.expirationDate fields.
  • Illep
    Illep about 12 years
    Will Apple reject this, since we are trying to use a Private API ?
  • Vincent Guerci
    Vincent Guerci about 12 years
    @Illep This is Facebook code, not Apple one... Nothing is private, or even an api, and not from Apple. This answer might be obsolete with latest facebook sdk btw...
  • Jimmy
    Jimmy almost 12 years
    @VincentG Are you able to expand on your suggested code? I'm unclear how to use the category you've mentioned.