2013-11-08 3 views
6

Я пытаюсь использовать собственные (iOS 6-7x) библиотеки, чтобы авторизовать пользователя с Facebook из моего приложения. Я хотел бы передать токен авторизации на мой сервер, когда логин будет успешным.iOS Facebook родной логин (без Facebook SDK)

Код ниже отлично работает, если пользователь не установил учетную запись Facebook в ОС. Я получаю следующее сообщение об ошибке в этом случае:.

Ошибка Доменные = com.apple.accounts Код = 6 «Операция не может быть завершена (com.apple.accounts ошибка 6.)

-(void) initFacebookLogin 
{ 
    LRAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 

    if (appDelegate.accountStore == nil) 
     appDelegate.accountStore = [[ACAccountStore alloc] init]; 

    __block ACAccount *facebookAccount = nil; 

    ACAccountType *facebookAccountType = [appDelegate.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 

    NSArray * permissions = @[@"publish_stream", @"publish_actions", @"email"]; 

    NSMutableDictionary *options = [[NSMutableDictionary alloc] initWithObjectsAndKeys:FACEBOOK_APP_ID, ACFacebookAppIdKey, permissions, ACFacebookPermissionsKey, ACFacebookAudienceOnlyMe, ACFacebookAudienceKey, nil]; 

    [appDelegate.accountStore requestAccessToAccountsWithType:facebookAccountType 
     options: options 
     completion: ^(BOOL granted, NSError *error) { 

      if (granted) 
      { 
       NSArray *accounts = [appDelegate.accountStore accountsWithAccountType:facebookAccountType]; 

       facebookAccount = [accounts lastObject]; 

       ACAccountCredential* accountCredential = [facebookAccount credential]; 

       NSString* token = [accountCredential oauthToken]; 

       NSLog(@"token=%@", token); 
      } 
      else { 
       // WHAT DO I DO HERE??? 
       // Error Domain=com.apple.accounts Code=6 "The operation couldn’t be completed. (com.apple.accounts error 6.)" 
       NSLog(@"%@", [error description]); 
      } 
     }]; 
} 

мне еще нужно использовать Facebook SDK, чтобы попросить пользователя войти в систему делать? есть еще один родной библиотеки IOS я мог бы использовать, чтобы предложить пользователю настроить Facebook доступ в прошивкой?

Или есть лучший способ сделать оптимизированную проверку подлинности в Facebook (не спрашивая пользователя о входе в систему, если у него есть уже сделано в ОС)?

ответ

0

Вы должны смотреть на Facebook Docs здесь (есть простой пример Войти):

https://developers.facebook.com/docs/ios/ios-sdk-tutorial/authenticate/

На мой взгляд, я хотел бы использовать Facebook SDK для выполнения входа, вы можете сделать что-то вроде это:

/* Constants */ 
#define K_FACEBOOK_REQUEST_CREDENTIALSURL @"me/?fields=id,location,name,username,bio,picture,gender,website,birthday,email" 
#define K_FACEBOOK_PERMISSIONS @[@"user_about_me",@"user_birthday",@"email"] 

/* Facebook Keys */ 
#define K_FACEBOOK_REQUEST_ID @"id" 
#define K_FACEBOOK_REQUEST_USERNAME @"username" 
#define K_FACEBOOK_REQUEST_LOCATION @"location" 
#define K_FACEBOOK_REQUEST_FULLNAME @"name" 
#define K_FACEBOOK_REQUEST_BIO @"bio" 
#define K_FACEBOOK_REQUEST_WEBSITE @"website" 
#define K_FACEBOOK_REQUEST_EMAIL @"email" 
#define K_FACEBOOK_REQUEST_BIRTHDAY @"birthday" 
#define K_FACEBOOK_REQUEST_GENDER @"gender" 

- (void)initWithLoginFacebook 
{ 
    [PFFacebookUtils logInWithPermissions:K_FACEBOOK_PERMISSIONS block:^(PFUser *user, NSError *error) { 
    if (!user) { 
     if (!error) 
      NSLog("ERROR_CAUSE_AUTH_USERCANCELLED"); 
     else 
      NSLog("ERROR_CAUSE_AUTH_FAILEDLOGIN"); 
    } else if (user.isNew) { 
     FBRequest *request = [FBRequest requestForMe]; 
     [request startWithCompletionHandler:^(FBRequestConnection *connection,id result,NSError *error) { 
      if (error) 
       NSLog("ERROR_CAUSE_AUTH_FAILEDLOGIN"); 
      else 
       [self requestLoginFacebook:result]; 
     }]; 
    } else 
     NSLog("User logged and not new!"); 
    }]; 
} 

- (void)requestLoginFacebook:(id)result 
{ 
    NSDictionary *userData = (NSDictionary *)result; 
    // Do something with the data... For example 
    NSString *facebookId = userData[K_FACEBOOK_REQUEST_ID]; 
    NSString *name = userData[K_FACEBOOK_REQUEST_FULLNAME]; 
    NSString *username = [userData[K_FACEBOOK_REQUEST_USERNAME] lowercaseString]; 
    NSString *bio = userData[K_FACEBOOK_REQUEST_BIO]; 
    NSString *website = userData[K_FACEBOOK_REQUEST_WEBSITE]; 
    NSString *location = userData[K_FACEBOOK_REQUEST_LOCATION][@"name"]; 
    NSString *gender = userData[K_FACEBOOK_REQUEST_GENDER]; 
    NSString *birthday = userData[K_FACEBOOK_REQUEST_BIRTHDAY]; 
    NSString *email = userData[K_FACEBOOK_REQUEST_EMAIL]; 
    NSString *profileImage = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?width=180&height=180",userData[@"id"]]; 

} 

Вы должны настроить SDK для Facebook в appDelegate и в файле .plist.

Ваш код будет работать нормально, если у пользователя есть учетная запись Facebook, установленная в настройках устройства.

I.

+0

спасибо. Это не заставляет пользователя вводить учетные данные, если они уже сделали это в Facebook или другом приложении, используя собственный вход в FB? Это то, что я ищу. – dixkin