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