I'm new with iOS development. I have to integrate Facebook login in my iOS app, as user logs in it fetches all the info and navigates it to home screen. I have done this via Facebook latest SDK but I want it to be done via social framework. I have gone through lots of online stuff and also have found examples where they are sharing(posting) content on Facebook page(Wall) via social framework but not Facebook login exactly. Anyone please help, let me know if Facebook login is possible via social framework or i have to stick to SDK. Thanks in Advance
Asked
Active
Viewed 1.2k times
14
-
@Facebbok SDK is the best solution for accessing all controls of Facebook. i will suggest this. – ChenSmile Dec 26 '13 at 07:14
-
1but isn't it bad practice ? like size of sdk is almost 10-11MB – Arun Dec 26 '13 at 07:19
-
but due to various security issues you could not use social framework as a complete Facebook SDK – ChenSmile Dec 26 '13 at 07:20
-
1If you want to fetch user's information, you need to use graph api in combination with social and accounts framework(for login) as explained below by @iSuman. – dispatchMain Dec 26 '13 at 07:38
-
you can use fbconnect to login and retrieve user's all information .i have done same functionality with this https://github.com/twotoasters/fbconnect-iphone – Shehbaz Khan Dec 26 '13 at 08:18
-
2@ShehbazKhan pretty old stuff, with a lot of deprecated API. I wouldn't use. FB official SDK is the way to go, we can complain about it but it is the only way to havve a full integration with the graph API. Social iOS API requires that you have set an account in settings. The official SDK can work also asking username aand pwd on the fly. – Andrea Dec 26 '13 at 10:19
3 Answers
22
Import Social and Acount Framwork
put this code in your .m file
-(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);
}
}];
}
Also logged in your native Facebook application in your device/Simulator
Ashish Kakkad
- 23,586
- 12
- 103
- 136
Gajendra Rawat
- 3,673
- 2
- 19
- 36
-
1For this you need to have a facebook app whose key you need to provide along with audience and permissions in login options dictionary. – dispatchMain Dec 26 '13 at 07:35
-
-
actually i did't implement this for twitter check this hope it will help you https://dev.twitter.com/docs/ios @AbhishekGupta – Gajendra Rawat Apr 18 '14 at 05:33
-
Do you need to ```requestAccessToAccountsWithType``` every single time? Surely once the user has granted access, then you don't need to keep on checking it. Anyway around this? – Supertecnoboff Nov 18 '15 at 09:35
-
is there any issue with social login framework with earlier versions of 10.2 – jeff ayan Aug 03 '17 at 11:17
1
Swift 3 Version of solution @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")
}
}
}
}
}
Bruno
- 1,592
- 13
- 14
0
Facebook login using Accounts and social framework (swift)
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")
})
}
}
}
Reema
- 1,200
- 10
- 10