2010-12-26 25 views
15

Pracuję z nowym facebook-ios-sdk iz powodzeniem zintegrowałem api z moją natywną aplikacją. Jestem w stanie uwierzytelnić użytkownika i poprawnie skonfigurować uprawnienia przy użyciu wyskakującego okna z klasami ios-sdk.Facebook-ios-sdk z wbudowanym UIWebView

Dla części mojej aplikacji muszę użyć połączenia z Facebookiem w ramach UIWebView, używając javascript i html do przetwarzania danych w widoku internetowym. Biorąc pod uwagę, że użytkownik jest już zalogowany i uwierzytelniony za pomocą powyższej procedury, założyłbym, że UIWebView podzieliłoby się tymi poświadczeniami lub że przynajmniej byłby jakiś sposób przekazania lub przypisania poświadczeń do widoku WWW.

Niestety, znalazłem ten wcześniejszy post, który wydaje się sugerować, że ten schemat nie działa (iOS - being logged-in in a webView after logging in with the SDK). Czy ktoś inny napotkał to i/lub znalazł pracę? Wydaje się, że byłby to dość prosty przypadek użycia, biorąc pod uwagę, że nie próbuję uruchomić mobilnego safari lub czegoś w tym stylu - wszystko to w tej samej natywnej aplikacji.

Po prostu wydaje się, że musi istnieć jakiś łatwy trick lub ustawienie, którego mi brakuje. Może w jakiś sposób ustawić ciasteczka w nowym UIWebView? lub coś w tym stylu?

+0

To jest również mój problem, ale wygląda na to, że nie ma żadnej nadziei na odpowiedź :( –

+4

prawie 2 lata później, mam Jakiekolwiek rozwiązanie w międzyczasie? – Claus

Odpowiedz

0

Gdy masz już token FB access, powinieneś być w stanie używać interfejsu API FaceboookJavaScript w swoim widoku internetowym. Zobacz oficjalną dokumentację: http://developers.facebook.com/docs/reference/javascript/. Ten wpis SO daje uzasadnione wyjaśnienie: Retrieve Access Token Using Javascript API. Jak opisuje ten post, możesz użyć tokena dostępu bezpośrednio w rozmowie telefonicznej AJAX. Nie bałam się ciasteczek - wystarczy przekazać token dostępu.

Nie wyjaśniłeś dokładnie, co chcesz zrobić z Facebook w widoku internetowym, więc nie jestem pewien, czy to odpowie na twoje pytanie w 100%. Zakładam, że wiesz, jak przekazać token dostępu do widoku internetowego (UIWebView'sstringByEvaluatingJavaScriptFromString).

+2

W przypadku wbudowanej strony internetowej, w jaki sposób przekażesz token access_token do FB.getLoginStatus(), ponieważ nie przyjmuje on żadnego parametru poza wywołaniem zwrotnym? – jAckOdE

+2

czy możliwe jest posiadanie fragmentu kodu? – Claus

+0

Właściwie to zrobiłeś? Teoretycznie ma to sens, ale tak jak w @Clausie, bardzo by mi się podobało próbka kodu. – bogardon

1

--BY ten sposób Facebook-ios-sdk

@property (nonatomic, zachowują) 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"]; 
      [email protected]"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

I prawdopodobnie uzyskać tokenu dostępu w tej metodzie

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

Ten kod jest w Swift, ale metoda istnieje Obj C, jak również. Następnie należy użyć tokena dostępu w widoku sieci Web, jak sugerują Sandy i Steve

Powiązane problemy