Facebook iOS SDKlogin本地和UIWebViewlogin

对于我正在开发的应用程序,我需要用户能够使用本地SDKlogin到Facebook,但是在web视图中也有一个使用FB注释小部件的应用程序的单独部分。 问题出在用户使用原生SDKlogin后,他们没有login到webview注释部件中。 有没有办法让用户login使用本机iOS SDK,然后也login到UIWebView中的Facebook。 我尝试使用openAccessTokenFromData:completionHandler:在用户login后的FBSession类中,但不能得到这个工作,就像下面

- (void)didLogin { FBAccessTokenData *data = [FBAccessTokenData createTokenFromString:[FBSession activeSession].accessTokenData.accessToken permissions:[FBSession activeSession].accessTokenData.permissions expirationDate:[FBSession activeSession].accessTokenData.expirationDate loginType:FBSessionLoginTypeWebView refreshDate:nil]; [[FBSession activeSession] closeAndClearTokenInformation]; FBSession *session = [[FBSession alloc] init]; [session openFromAccessTokenData:data completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { }]; } 

我使用下面的代码在我的本地应用程序中打开Webview中的Facebook iOs SDKlogin,其工作正常。

 -(void)openFacebookAuthentication { NSArray *permission = [NSArray arrayWithObjects:kFBEmailPermission,kFBUserPhotosPermission, nil]; FBSession *session = [[FBSession alloc] initWithPermissions:permission]; [FBSession setActiveSession: [[FBSession alloc] initWithPermissions:permission] ]; [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorForcingWebView completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { switch (status) { case FBSessionStateOpen: [self getMyData]; break; case FBSessionStateClosedLoginFailed: { // prefer to keep decls near to their use // unpack the error code and reason in order to compute cancel bool NSString *errorCode = [[error userInfo] objectForKey:FBErrorLoginFailedOriginalErrorCode]; NSString *errorReason = [[error userInfo] objectForKey:FBErrorLoginFailedReason]; BOOL userDidCancel = !errorCode && (!errorReason || [errorReason isEqualToString:FBErrorLoginFailedReasonInlineCancelledValue]); if(error.code == 2 && ![errorReason isEqualToString:@"com.facebook.sdk:UserLoginCancelled"]) { UIAlertView *errorMessage = [[UIAlertView alloc] initWithTitle:kFBAlertTitle message:kFBAuthenticationErrorMessage delegate:nil cancelButtonTitle:kOk otherButtonTitles:nil]; [errorMessage performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; errorMessage = nil; } } break; // presently extension, log-out and invalidation are being implemented in the Facebook class default: break; // so we do nothing in response to those state transitions } }]; permission = nil; } 

创buildfacebook Appid Facebook Appid创build链接创build时间遵循facebook指南行,您必须在注册时间内提供捆绑标识符 在** plist **给Facebook的appid信息像吹的形象

然后使用这个代码

 @interface LoginViewController : UIViewController<UIWebViewDelegate> @property(nonatomic,retain)UIWebView *webview; @property (nonatomic, retain) NSString *accessToken; @property(nonatomic,retain)UIActivityIndicatorView *FbActive; @end @interface LoginViewController () @end @implementation LoginViewController @synthesize accessToken,webview,FbActive; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //Removeing the UIWebview Cookies NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (cookie in [storage cookies]) { [storage deleteCookie:cookie]; } [[NSUserDefaults standardUserDefaults] synchronize]; } -(IBAction)fbLoginPage:(UIButton *)sender1 { NSString *facebookClientID =facebookAppId; NSString *redirectUri = @"http://www.facebook.com/connect/login_success.html"; NSString *extended_permissions=@"user_photos,user_videos,publish_stream,offline_access,user_checkins,friends_checkins,email"; NSString *url_string = [NSString stringWithFormat:@"https://graph.facebook.com/oauth/authorize?client_id=%@&redirect_uri=%@&scope=%@&type=user_agent&display=touch", facebookClientID, redirectUri, extended_permissions]; NSURL *url = [NSURL URLWithString:url_string]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; CGRect webFrame =[self.view frame]; webFrame.origin.y = 0; UIWebView *aWebView = [[UIWebView alloc] initWithFrame:webFrame]; [aWebView setDelegate:self]; self.webview = aWebView; self.FbActive = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; self.FbActive.color=[UIColor darkGrayColor]; self.FbActive.center = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2); [self.FbActive startAnimating]; [webview loadRequest:request]; [self.webview addSubview:self.FbActive]; [self.view addSubview:webview]; } - (void)webViewDidFinishLoad:(UIWebView *)_webView { /** * Since there's some server side redirecting involved, this method/function will be called several times * we're only interested when we see a url like: http://www.facebook.com/connect/login_success.html#access_token=.......... */ //get the url string [self.FbActive stopAnimating]; NSString *url_string = [((_webView.request).URL) absoluteString]; //looking for "access_token=" NSRange access_token_range = [url_string rangeOfString:@"access_token="]; //looking for "error_reason=user_denied" NSRange cancel_range = [url_string rangeOfString:@"error_reason=user_denied"]; //it exists? coolio, we have a token, now let's parse it out.... if (access_token_range.length > 0) { //we want everything after the 'access_token=' thus the position where it starts + it's length int from_index = access_token_range.location + access_token_range.length; NSString *access_token = [url_string substringFromIndex:from_index]; //finally we have to url decode the access token access_token = [access_token stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //remove everything '&' (inclusive) onward... NSRange period_range = [access_token rangeOfString:@"&"]; //move beyond the . access_token = [access_token substringToIndex:period_range.location]; //store our request token.... self.accessToken = access_token; //remove our window // UIWindow* window = [UIApplication sharedApplication].keyWindow; // if (!window) { // window = [[UIApplication sharedApplication].windows objectAtIndex:0]; // } [self.webview removeFromSuperview]; self.webview=nil; //tell our callback function that we're done logging in :) // if ( (callbackObject != nil) && (callbackSelector != nil) ) { // [callbackObject performSelector:callbackSelector]; // } //the user pressed cancel } else if (cancel_range.length > 0) { //remove our window // UIWindow* window = [UIApplication sharedApplication].keyWindow; // if (!window) { // window = [[UIApplication sharedApplication].windows objectAtIndex:0]; // } [self.webview removeFromSuperview]; self.webview=nil; //tell our callback function that we're done logging in :) // if ( (callbackObject != nil) && (callbackSelector != nil) ) { // [callbackObject performSelector:callbackSelector]; // } } [self getuserdetailes]; } -(void)getuserdetailes { NSString *action=@"me"; NSString *url_string = [NSString stringWithFormat:@"https://graph.facebook.com/%@?", action]; //tack on any get vars we have... NSDictionary *get_vars=nil; if ( (get_vars != nil) && ([get_vars count] > 0) ) { NSEnumerator *enumerator = [get_vars keyEnumerator]; NSString *key; NSString *value; while ((key = (NSString *)[enumerator nextObject])) { value = (NSString *)[get_vars objectForKey:key]; url_string = [NSString stringWithFormat:@"%@%@=%@&", url_string, key, value]; }//end while }//end if if (accessToken != nil) { //now that any variables have been appended, let's attach the access token.... url_string = [NSString stringWithFormat:@"%@access_token=%@", url_string, self.accessToken]; url_string = [url_string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"%@",url_string); NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url_string]]; NSError *err; NSURLResponse *resp; NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&resp error:&err]; NSString *stringResponse = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; NSLog(@"%@",stringResponse); NSError* error; NSDictionary *FBResResjson = [NSJSONSerialization JSONObjectWithData:response//1 options:kNilOptions error:&error]; NSLog(@"%@",FBResResjson); } } 

感谢Divya Bhalodiya回答。 这是Facebook SDK 4.x的swift 3版本。 如果代码有任何问题,请随时编辑和评论。 希望这会有所帮助。

 func verifyFromWebView() { let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() fbLoginManager.loginBehavior = FBSDKLoginBehavior.web fbLoginManager.logIn(withReadPermissions: ["email"], from: self) { (result, error) in if error != nil { print(error!.localizedDescription) self.dismiss(animated: true, completion: nil) }else if (result?.isCancelled)!{ print("Cancelled") self.dismiss(animated: true, completion: nil) }else{ if let fbLoginResult = result { if fbLoginResult.grantedPermissions != nil && fbLoginResult.grantedPermissions.contains("email"){ self.getFBData() } } } } }