带有嵌入式UIWebView的Facebook-ios-sdk

时间:2010-12-26 21:22:31

标签: facebook ios uiwebview

我正在使用新的facebook-ios-sdk并成功将api集成到我的原生应用中。我可以使用带有ios-sdk类的弹出对话框对用户进行身份验证并正确设置权限。

对于我的应用程序的一部分,我需要在UIWebView内使用facebook连接,使用javascript和html处理webview中的数据。鉴于用户已经通过上述例程登录并进行了身份验证,我假设UIWebView将共享这些凭据,或者至少会有某种方式将凭据传递或分配给webview。

不幸的是,我发现这篇早期帖子似乎暗示这个方案不太有效(iOS - being logged-in in a webView after logging in with the SDK)。有没有其他人遇到这个和/或找到了解决方法?这似乎是一个相当简单的用例,因为我不是要尝试推出移动游猎或类似的东西 - 它都在同一个本机应用程序中。

看起来似乎必须有一些我想念的简单技巧或设置。也许以某种方式在新UIWebView中设置cookie?或类似的东西?

3 个答案:

答案 0 :(得分:1)

- 以这种方式Facebook-ios-sdk

@property(nonatomic,retain)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];
            }

        }];

答案 1 :(得分:1)

我可能会在此方法中获得Access令牌

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

此代码在Swift中,但该方法也适用于Obj C. 然后,您将按照Sandy和Steve

的建议在Web视图中使用访问令牌

答案 2 :(得分:0)

获得FB access令牌后,您应该可以在网络视图中使用Faceboook JavaScript API。有关官方文档,请参阅http://developers.facebook.com/docs/reference/javascript/。这篇SO帖子给出了一个合理的解释:Retrieve Access Token Using Javascript API。如该帖子所述,您可以直接在AJAX电话中使用访问令牌。我不会乱用饼干 - 只需传递访问令牌。

您没有在网络视图中准确解释您想要对Facebook做什么,所以我不确定这会100%回答您的问题。我假设您知道如何将访问令牌传递到网络视图(UIWebView's stringByEvaluatingJavaScriptFromString)。