Skip to content

Commit

Permalink
Support calling the successCallback of login() from handleOpenURL cal…
Browse files Browse the repository at this point in the history
…l (after UI login from Mobile Safari/Facebook app). Note: this only works if the PhoneGap app supports multi-tasking. Also, the FB.Login callback must NOT call any interactive UI like alert()
  • Loading branch information
shazron committed Jul 12, 2011
1 parent e0a7337 commit cf2a115
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
2 changes: 1 addition & 1 deletion native/ios/FacebookConnectPlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
}

@property (nonatomic, retain) Facebook *facebook;

@property (nonatomic, copy) NSString* loginCallbackId;

@end
17 changes: 12 additions & 5 deletions native/ios/FacebookConnectPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

@implementation FacebookConnectPlugin

@synthesize facebook;
@synthesize facebook, loginCallbackId;

/* This overrides PGPlugin's method, which receives a notification when handleOpenURL is called on the main app delegate */
- (void) handleOpenURL:(NSNotification*)notification
Expand All @@ -32,11 +32,17 @@ - (void) handleOpenURL:(NSNotification*)notification
BOOL ok = [facebook handleOpenURL:url];
if (ok) {


NSDictionary* session = [NSDictionary
dictionaryWithObjects:[NSArray arrayWithObjects:self.facebook.accessToken, [self.facebook.expirationDate description], APP_SECRET, [NSNumber numberWithBool:YES], @"...", @"...", nil]
forKeys:[NSArray arrayWithObjects:@"access_token", @"expires", @"secret", @"session_key", @"sig", @"uid", nil]];
NSDictionary* status = [NSDictionary
dictionaryWithObjects:[NSArray arrayWithObjects:@"connected", session, nil]
forKeys:[NSArray arrayWithObjects:@"status", @"session", nil]];


[super writeJavascript:[NSString stringWithFormat:@"FB.Auth.setSession(%@);", [session JSONRepresentation]]];
PluginResult* result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary:status];
[super writeJavascript:[result toSuccessCallbackString:self.loginCallbackId]];
}
}

Expand Down Expand Up @@ -83,10 +89,11 @@ - (void) login:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
NSMutableArray* marray = [NSMutableArray arrayWithArray:arguments];
[marray removeObjectAtIndex:0]; // first item is the callbackId

[facebook authorize:marray delegate:self];
// save the callbackId for handleOpenURL return (only works if the app is multi-tasked!)
self.loginCallbackId = callbackId;

return [facebook authorize:marray delegate:self];

result = [PluginResult resultWithStatus:PGCommandStatus_ERROR messageAsString:@"Must call FB.init before FB.login"];
jsString = [result toErrorCallbackString:callbackId];
}

[super writeJavascript:jsString];
Expand Down

0 comments on commit cf2a115

Please sign in to comment.