Вход в Facebook через социальную структуру в ios

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


person Arun    schedule 26.12.2013    source источник
comment
@Facebbok SDK — лучшее решение для доступа ко всем элементам управления Facebook. я предложу это.   -  person ChenSmile    schedule 26.12.2013
comment
но разве это не плохая практика? вроде размер sdk почти 10-11MB   -  person Arun    schedule 26.12.2013
comment
но из-за различных проблем с безопасностью вы не могли использовать социальную структуру в качестве полноценного Facebook SDK.   -  person ChenSmile    schedule 26.12.2013
comment
Если вы хотите получить информацию о пользователе, вам нужно использовать API графа в сочетании с социальной сетью и инфраструктурой учетных записей (для входа в систему), как описано ниже @iSuman.   -  person dispatchMain    schedule 26.12.2013
comment
вы можете использовать fbconnect для входа в систему и получения всей информации о пользователе. Я сделал ту же функциональность с этим github.com/twotoasters /fbconnect-iphone   -  person Shehbaz Khan    schedule 26.12.2013
comment
@ShehbazKhan довольно старый материал с большим количеством устаревших API. Я бы не стал использовать. Официальный SDK FB — это то, что нужно, мы можем жаловаться на это, но это единственный способ иметь полную интеграцию с графическим API. Social iOS API требует, чтобы вы установили учетную запись в настройках. Официальный SDK может также работать, запрашивая имя пользователя и пароль на лету.   -  person Andrea    schedule 26.12.2013


Ответы (3)


Импорт социальных сетей и учетных записей

поместите этот код в свой файл .m

-(void)facebook
{
    self.accountStore = [[ACAccountStore alloc]init];
    ACAccountType *FBaccountType= [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    NSString *key = @"451805654875339";
    NSDictionary *dictFB = [NSDictionary dictionaryWithObjectsAndKeys:key,ACFacebookAppIdKey,@[@"email"],ACFacebookPermissionsKey, nil];

    [self.accountStore requestAccessToAccountsWithType:FBaccountType options:dictFB completion:
     ^(BOOL granted, NSError *e) {
         if (granted)
         {
             NSArray *accounts = [self.accountStore accountsWithAccountType:FBaccountType];
             //it will always be the last object with single sign on
             self.facebookAccount = [accounts lastObject];


             ACAccountCredential *facebookCredential = [self.facebookAccount credential];
             NSString *accessToken = [facebookCredential oauthToken];
             NSLog(@"Facebook Access Token: %@", accessToken);


             NSLog(@"facebook account =%@",self.facebookAccount);

             [self get];

             [self getFBFriends];

             isFacebookAvailable = 1;
         } else
         {
             //Fail gracefully...
             NSLog(@"error getting permission yupeeeeeee %@",e);
             sleep(10);
             NSLog(@"awake from sleep");
             isFacebookAvailable = 0;

         }
     }];



}

-(void)checkfacebookstatus
{
    if (isFacebookAvailable == 0)
    {
        [self checkFacebook];
        isFacebookAvailable = 1;
    }
    else
    {
        printf("Get out from our game");
    }
}


-(void)get
{

    NSURL *requestURL = [NSURL URLWithString:@"https://graph.facebook.com/me"];

    SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:requestURL parameters:nil];
    request.account = self.facebookAccount;

    [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *error) {

        if(!error)
        {

            NSDictionary *list =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

            NSLog(@"Dictionary contains: %@", list );




            self.globalmailID   = [NSString stringWithFormat:@"%@",[list objectForKey:@"email"]];
            NSLog(@"global mail ID : %@",globalmailID);


            fbname = [NSString stringWithFormat:@"%@",[list objectForKey:@"name"]];
            NSLog(@"faceboooookkkk name %@",fbname);




            if([list objectForKey:@"error"]!=nil)
            {
                [self attemptRenewCredentials];
            }
            dispatch_async(dispatch_get_main_queue(),^{

            });
        }
        else
        {
            //handle error gracefully
            NSLog(@"error from get%@",error);
            //attempt to revalidate credentials
        }

    }];

    self.accountStore = [[ACAccountStore alloc]init];
    ACAccountType *FBaccountType= [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

    NSString *key = @"451805654875339";
    NSDictionary *dictFB = [NSDictionary dictionaryWithObjectsAndKeys:key,ACFacebookAppIdKey,@[@"friends_videos"],ACFacebookPermissionsKey, nil];


    [self.accountStore requestAccessToAccountsWithType:FBaccountType options:dictFB completion:
     ^(BOOL granted, NSError *e) {}];

}




-(void)accountChanged:(NSNotification *)notification
{
    [self attemptRenewCredentials];
}

-(void)attemptRenewCredentials
{
    [self.accountStore renewCredentialsForAccount:(ACAccount *)self.facebookAccount completion:^(ACAccountCredentialRenewResult renewResult, NSError *error){
        if(!error)
        {
            switch (renewResult) {
                case ACAccountCredentialRenewResultRenewed:
                    NSLog(@"Good to go");
                    [self get];
                    break;
                case ACAccountCredentialRenewResultRejected:
                    NSLog(@"User declined permission");
                    break;
                case ACAccountCredentialRenewResultFailed:
                    NSLog(@"non-user-initiated cancel, you may attempt to retry");
                    break;
                default:
                    break;
            }

        }
        else{
            //handle error gracefully
            NSLog(@"error from renew credentials%@",error);
        }
    }];
}

Также вы вошли в собственное приложение Facebook на своем устройстве/симуляторе

person Gajendra Rawat    schedule 26.12.2013
comment
Для этого вам нужно иметь приложение facebook, ключ которого вы должны указать вместе с аудиторией и разрешениями в словаре параметров входа. - person dispatchMain; 26.12.2013
comment
@Maximus, не могли бы вы рассказать мне, как сделать то же самое для Twitter? - person Abhishek Gupta; 17.04.2014
comment
на самом деле я не реализовал это для твиттера, проверьте это, надеюсь, это поможет вам dev.twitter.com/docs/ ios @AbhishekGupta - person Gajendra Rawat; 18.04.2014
comment
Вам нужно requestAccessToAccountsWithType каждый раз? Конечно, как только пользователь предоставил доступ, вам не нужно продолжать его проверять. Во всяком случае вокруг этого? - person Supertecnoboff; 18.11.2015
comment
есть ли проблема с системой входа в социальные сети с более ранними версиями 10.2? - person jeff ayan; 03.08.2017

Swift 3 Версия решения @reena

@IBAction func loginButtonPressed(_ sender: UIButton) {

    var facebookAccount: ACAccount?
    let options:[String : Any] = [ACFacebookAppIdKey: "YOUR_FACEBOOK_API_KEY", ACFacebookPermissionsKey: ["email"],ACFacebookAudienceKey:ACFacebookAudienceFriends]

    let accountStore = ACAccountStore()

    let facebookAccountType = accountStore.accountType(withAccountTypeIdentifier: ACAccountTypeIdentifierFacebook)

    accountStore.requestAccessToAccounts(with: facebookAccountType, options: options) { (granted:Bool, error:Error?) in
        if granted{
            let accounts = accountStore.accounts(with: facebookAccountType)
            facebookAccount = accounts?.last as? ACAccount

            let dict:NSDictionary = facebookAccount!.dictionaryWithValues(forKeys: ["properties"]) as NSDictionary
            let properties:NSDictionary = dict["properties"] as! NSDictionary

            print("facebook Response is-->:%@",properties)
        }
        else {
            if let err = error as? NSError, err.code == Int(ACErrorAccountNotFound.rawValue) {
                DispatchQueue.main.async {
                    self.displayAlert("There is no Facebook accounts configured. you can add or created a Facebook account in your settings.")
                }
            } else {
                DispatchQueue.main.async {
                    self.displayAlert("Permission not granted For Your Application")
                }
            }
        }
    }

}
person Bruno    schedule 16.02.2017

Вход в Facebook с помощью учетных записей и социальных сетей (быстро)

var facebookAccount: ACAccount?

        let options: [NSObject : AnyObject] = [ACFacebookAppIdKey: "YOUR_FACEBOOK_API_KEY", ACFacebookPermissionsKey: ["publish_stream","publish_actions"],ACFacebookAudienceKey:ACFacebookAudienceFriends]
        let accountStore = ACAccountStore()
        let facebookAccountType = accountStore.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierFacebook)

            accountStore.requestAccessToAccountsWithType(facebookAccountType, options: options) { (granted, error) -> Void in
                if granted
                {
                    let accounts = accountStore.accountsWithAccountType(facebookAccountType)
                    self.facebookAccount = accounts.last as? ACAccount
                    let accountsArray=accountStore.accountsWithAccountType(facebookAccountType) as NSArray

                    self.facebookAccount=accountsArray.lastObject as? ACAccount
                    var dict:NSDictionary
                    dict=NSDictionary()

                    dict=self.facebookAccount!.dictionaryWithValuesForKeys(["properties"])
                    let properties:NSDictionary=dict["properties"] as! NSDictionary
                    print("facebook Response is-->:%@",properties)
                }
                else
                {
                    if error.code == Int(ACErrorAccountNotFound.rawValue) {
                        dispatch_async(dispatch_get_main_queue(), { () -> Void in
                            self.displayAlert("There is no Facebook accounts configured. you can add or created a Facebook account in your settings.")
                        })
                    } else {
                        dispatch_async(dispatch_get_main_queue(), { () -> Void in
                            self.displayAlert("Permission not granted For Your Application")
                        })
                    }

                }
            }
person Reema    schedule 15.04.2016