带embedded式UIWebView的Facebook-ios-sdk

我正在使用新的facebook-ios-sdk,并已成功将api集成到我的原生应用程序中。 我能够通过使用popup式对话框与ios-sdk类来validation用户并正确设置权限。

对于我的应用程序的一部分,我需要使用UIWebView内的Facebook连接,使用JavaScript和HTML来处理web视图中的数据。 鉴于用户已经login并通过上述例程进行身份validation,我会假定UIWebView将共享这些凭据,或至less有一些方法来传递或分配凭据到web视图。

不幸的是,我发现这个早期的post,似乎表明这个scheme并不完美 ( iOS – 在loginSDK后在webView中login )。 有没有其他人遇到这个问题和/或find解决办法? 这似乎是一个相当简单的用例,因为我没有尝试启动移动Safari或类似的东西 – 这一切都在相同的本机应用程序。

这似乎是必须有某种简单的伎俩或设置,我失踪了。 也许以某种方式在新的UIWebView设置cookie? 或者类似的东西?

– 这样Facebook-ios-sdk

@属性(非primefaces,保留)NSString * CHK;

 @end @implementation SettingsViewController @synthesize chk,viewFbLogin; static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell; AppDelegate *appDelegate; UIViewController *tweetComposer; ACAccount *twitterAccount; ACAccountStore *account; ACAccountType *accountType; NSArray *arrayOfAccounts ; int arr_row_num; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)storeAccountWithAccessToken:(NSString *)token secret:(NSString *)secret { // Each account has a credential, which is comprised of a verified token and secret ACAccountCredential *credential = [[ACAccountCredential alloc] initWithOAuthToken:token tokenSecret:secret]; // Obtain the Twitter account type from the store accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // Create a new account of the intended type twitterAccount = [[ACAccount alloc] initWithAccountType:accountType]; // Attach the credential for this user twitterAccount.credential = credential; // Finally, ask the account store instance to save the account // Note: that the completion handler is not guaranteed to be executed // on any thread, so care should be taken if you wish to update the UI, etc. [account saveAccount:twitterAccount withCompletionHandler:^(BOOL success, NSError *error) { if (success) { // we've stored the account! NSLog(@"the account was saved!"); } else { //something went wrong, check value of error NSLog(@"the account was NOT saved"); // see the note below regarding errors... // this is only for demonstration purposes if ([[error domain] isEqualToString:ACErrorDomain]) { // The following error codes and descriptions are found in ACError.h switch ([error code]) { case ACErrorAccountMissingRequiredProperty: NSLog(@"Account wasn't saved because " "it is missing a required property."); break; case ACErrorAccountAuthenticationFailed: NSLog(@"Account wasn't saved because " "authentication of the supplied " "credential failed."); break; case ACErrorAccountTypeInvalid: NSLog(@"Account wasn't saved because " "the account type is invalid."); break; case ACErrorAccountAlreadyExists: NSLog(@"Account wasn't added because " "it already exists."); break; case ACErrorAccountNotFound: NSLog(@"Account wasn't deleted because" "it could not be found."); break; case ACErrorPermissionDenied: NSLog(@"Permission Denied"); break; case ACErrorUnknown: default: // fall through for any unknown errors... NSLog(@"An unknown error occurred."); break; } } else { // handle other error domains and their associated response codes... NSLog(@"%@", [error localizedDescription]); } } }]; } - (void)viewDidLoad { [super viewDidLoad]; account = [[ACAccountStore alloc] init]; accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; arrayOfAccounts = [account accountsWithAccountType:accountType]; // [self storeAccountWithAccessToken:@"119745010-g6YqvIdpyvBvYuaweR5oI1V1h9ugIqlj0toetlqg" secret:@"ysBO2E6dgOWj2vKEFoC3PCEypMaPrpycy5WIeodUNro"]; appDelegate= (AppDelegate *)[[UIApplication sharedApplication] delegate]; chk=appDelegate.chk_login; if (!appDelegate.session.isOpen) { // create a fresh session object appDelegate.session = [[FBSession alloc] init]; if (appDelegate.session.state == FBSessionStateCreatedTokenLoaded) { // even though we had a cached token, we need to login to make the session usable [appDelegate.session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) { // we recurse here, in order to update buttons and labels }]; } } if ([chk isEqualToString:@"YES"] && (appDelegate.setting_flag==FALSE)) { appDelegate.arr=[NSMutableArray arrayWithObjects:@"Change Password",@"Facebook Login",@"Twitter Login",nil]; } else { if(appDelegate.setting_flag==FALSE) appDelegate.arr=[NSMutableArray arrayWithObjects:@"Facebook Login",@"Twitter Login",nil]; } } -(void) updateView { } - (void)viewWillAppear:(BOOL)animated { } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [appDelegate.arr count]; } - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = [self.SettingsTable dequeueReusableCellWithIdentifier:CellIdentifier]; if(!cell) cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; if([[appDelegate.arr objectAtIndex:indexPath.row] isEqualToString:@"Twitter Login"]) { twitterAccount = [arrayOfAccounts objectAtIndex:0]; NSLog(@"array=%@",[arrayOfAccounts objectAtIndex:0]); NSDictionary *tempDict = [[NSDictionary alloc] initWithDictionary: [twitterAccount dictionaryWithValuesForKeys:[NSArray arrayWithObject:@"properties"]]]; NSString *tempUserID = [[tempDict objectForKey:@"properties"] objectForKey:@"user_id"]; NSLog(@"temp=%@",tempUserID); if (!IsEmpty(tempUserID)) { [appDelegate.arr replaceObjectAtIndex:indexPath.row withObject:@"Twitter Logout"]; cell.textLabel.text=@"Twitter Logout"; } else { cell.textLabel.text=[appDelegate.arr objectAtIndex:indexPath.row]; } } else if([[appDelegate.arr objectAtIndex:indexPath.row] isEqualToString:@"Facebook Login"]) { if (appDelegate.session.isOpen) { [appDelegate.arr replaceObjectAtIndex:indexPath.row withObject:@"Facebook Logout"]; cell.textLabel.text=[appDelegate.arr objectAtIndex:indexPath.row]; } else { cell.textLabel.text=[appDelegate.arr objectAtIndex:indexPath.row]; } } else { cell.textLabel.text=[appDelegate.arr objectAtIndex:indexPath.row]; } return cell; } - (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if([[appDelegate.arr objectAtIndex:indexPath.row]isEqualToString:@"Change Password"] && [chk isEqualToString:@"YES"]) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:0.75]; ForgetPasswordViewController *forgetPassView=[[ ForgetPasswordViewController alloc] initWithNibName:@"ForgetPasswordViewController" bundle:[NSBundle mainBundle]]; NSLog(@"Working table"); [self.navigationController pushViewController:forgetPassView animated:YES]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO]; [UIView commitAnimations]; } else if([[appDelegate.arr objectAtIndex:indexPath.row]isEqualToString:@"Facebook Login"]) { if (appDelegate.session.state != FBSessionStateCreated) { // Create a new, logged out session. appDelegate.session = [[FBSession alloc] init]; } [appDelegate.session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) { // and here we make sure to update our UX according to the new session state if (appDelegate.session.isOpen) { [appDelegate.arr replaceObjectAtIndex:indexPath.row withObject:@"Facebook Logout"]; [self.SettingsTable reloadData]; } }]; 

我可能会在这个方法中获得访问令牌

 func loginViewFetchedUserInfo(loginView: FBLoginView, user:FBGraphUser ) { println(FBSession.activeSession().accessTokenData.accessToken) } 

这个代码是在Swift中,但是这个方法也存在于Obj C中。 然后,您将使用Web视图中的访问令牌,如Sandy和Steve所build议的

获得FB access令牌后,您应该可以在Web视图中使用Faceboook JavaScript API。 有关官方文档,请参阅http://developers.facebook.com/docs/reference/javascript/ 。 这个SOpost给出了一个合理的解释: 使用JavaScript API检索访问令牌 。 正如该文章所描述的,您可以直接在AJAX调用中使用访问令牌。 我不会乱用cookies – 只是传递访问令牌。

你没有在网页视图中完全解释你想用Facebook做什么,所以我不确定这个答案是100%。 我认为你知道如何将访问令牌传递给Web视图( UIWebView's stringByEvaluatingJavaScriptFromString )。