Invite Facebook Friends in IOS6 - iphone

I want to fetch the facebook friend list & send invitation for my app.
i tried following code:
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];
NSLog(#"%#",accounts); `******//I got the null array ***********`
ACAccount *facebookAccount = [accounts lastObject];
NSString *acessToken = [NSString stringWithFormat:#"%#",facebookAccount.credential.oauthToken];
NSDictionary *parameters = #{#"access_token": acessToken};
NSURL *feedURL = [NSURL URLWithString:#"https://graph.facebook.com/me/friends"];
SLRequest *feedRequest = [SLRequest
requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:feedURL
parameters:parameters];
feedRequest.account = facebookAccount;
[feedRequest performRequestWithHandler:^(NSData *responseData,
NSHTTPURLResponse *urlResponse, NSError *error)
{
NSLog(#"%#",[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
}];

In iOS 6 use the facebook SDK:
#import <FacebookSDK/FacebookSDK.h>
and call:
[FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
}];
result should be the data you're looking for.

Related

is it possible to tag a post/photo using ios social framework?

In my app I need to tag my photo/posts. Is this possible using social framework or Should I use Facebook-sdk for this?. Also can I get friends list from social framework? any help to achieve this?
Tagging a photo or post can only be done using the FacebookSDK for iOS while getting your friends list is possible using both the SocialFramework and the FacebookSDK for iOS.
You can use this code to get your friends list using the SocialFramework.
- (void)getFbFriends
{
ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *facebookTypeAccount = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *options = #{
ACFacebookAppIdKey: facebookAppId,
ACFacebookPermissionsKey: #[#"email"],
ACFacebookAudienceKey: ACFacebookAudienceFriends
};
[store requestAccessToAccountsWithType:facebookTypeAccount
options:options
completion:^(BOOL granted, NSError *error){
if(granted)
{
NSArray *accounts = [store accountsWithAccountType:facebookTypeAccount];
ACAccount *facebookAccount = [accounts lastObject];
NSURL *meurl = [NSURL URLWithString:#"https://graph.facebook.com/me"];
SLRequest *merequest = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:meurl
parameters:nil];
merequest.account = facebookAccount;
NSURL *requestURL = [NSURL URLWithString:#"https://graph.facebook.com/me/friends"];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:requestURL parameters:#{#"fields":#"id,name,picture,first_name,last_name,gender"}];
request.account = facebookAccount;
[request performRequestWithHandler:^(NSData *data,
NSHTTPURLResponse *response,
NSError *error) {
if(!error)
{
NSDictionary *list =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if([list objectForKey:#"error"]!=nil)
{
// if error occured e.g. Invalid Auth etc.
}
else
{
NSMutableArray *FBFriends = [[NSMutableArray alloc] init];
[FBFriends addObject:[userInfo objectForKey:#"id"]];
NSLog(#"friends %#", list);
}
}
else
{
NSLog(#"Error");
}
}];
}
else
{
NSLog(#"Error grant access");
}
}];
}

How to use iOS TWRequest for iOS 5 for getting Twitter User Details

How to use TWRequest for both iOS 5 for getting Twitter User Details,
TWRequest was working earlier and I was using in this way
NSURL *url = [NSURL URLWithString:#"https://api.twitter.com/1/users/show.json"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:twittername,#"screen_name",nil];
request = [[TWRequest alloc] initWithURL:url
parameters:params
requestMethod:TWRequestMethodGET];
But recently, Twitter closed the api version 1 and implemented version 1.1, and Presently The above logic is not working in iOS 5, due to the API deprecation may be...
I am using SLRequest for iOS 6 it is working perfect, But I would like to know How can we get Twitter user details in iOS 5
Try this :
NSURL *url = [NSURL URLWithString:#"https://api.twitter.com/1.1/users/show.json"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:twittername,#"screen_name",nil];
request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodGET];
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *twitterAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
NSArray *twitterAccounts = [accountStore accountsWithAccountType:twitterAccountType];
// Runing on iOS 6
if (NSClassFromString(#"SLComposeViewController") && [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
{
[accountStore requestAccessToAccountsWithType:twitterAccountType options:NULL completion:^(BOOL granted, NSError *error)
{
if (granted)
{
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:url parameters:parameters];
[request setAccount:[twitterAccounts lastObject]];
dispatch_async(dispatch_get_main_queue(), ^
{
[NSURLConnection sendAsynchronousRequest:request.preparedURLRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response1, NSData *data, NSError *error)
{
dispatch_async(dispatch_get_main_queue(), ^
{
if (data)
{
[self loadData:data];
}
});
}];
});
}
}];
}
else if (NSClassFromString(#"TWTweetComposeViewController") && [TWTweetComposeViewController canSendTweet]) // Runing on iOS 5
{
[accountStore requestAccessToAccountsWithType:twitterAccountType withCompletionHandler:^(BOOL granted, NSError *error)
{
if (granted)
{
TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:parameters requestMethod:TWRequestMethodGET];
[request setAccount:[twitterAccounts lastObject]];
dispatch_async(dispatch_get_main_queue(), ^
{
[NSURLConnection sendAsynchronousRequest:request.signedURLRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response1, NSData *data, NSError *error)
{
dispatch_async(dispatch_get_main_queue(), ^
{
if (data)
{
[self loadData:data];
}
});
}];
});
}
}];
}
}

get the facebook access token in iOS 6.0

I had implemented facebook SDK with the help of which able to get the facebook authentication as well as user info with the following code.
if(!self.accountStore)
self.accountStore = [[ACAccountStore alloc] init];
if(NSClassFromString(#"SLComposeViewController") != nil)
{
ACAccountType *facebookTypeAccount = [self.accountStore
accountTypeWithAccountTypeIdentifier:#"com.apple.facebook"];
NSLog(#"facebookTypeAccount..:%#",facebookTypeAccount);
NSArray *accounts = [self.accountStore accountsWithAccountType:facebookTypeAccount];
if (facebookTypeAccount) {
if ([accounts respondsToSelector:#selector(count)]) {
[self.accountStore requestAccessToAccountsWithType:facebookTypeAccount
options:#{ACFacebookAppIdKey:
#"key", ACFacebookPermissionsKey: #[#"email"]}
completion:^(BOOL granted, NSError
*error) {
if(granted){
NSArray *accounts = [self.accountStore
accountsWithAccountType:facebookTypeAccount];
[self fetchuserinfo];
}
}];
}
-(void)fetchuserinfo
{
NSString *accessToken = [FBSession activeSession].accessToken;
NSString *url=[NSString stringWithFormat:#"https://graph.facebook.com/me"];
NSURL *meurl = [NSURL URLWithString:url];
SLRequest *merequest = [SLRequest requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:meurl
parameters:nil];
NSLog(#" setting account %#",_facebookAccount);
merequest.account = _facebookAccount;
[merequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSString *meDataString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
returnedData = responseData;
NSLog(#" meRequest Respnse %#", meDataString);
if (returnedData!=nil) {
if(NSClassFromString(#"NSJSONSerialization"))
{
NSError *error = nil;
id object = [NSJSONSerialization
JSONObjectWithData:returnedData
options:0
error:&error];
if(error) { }
if([object isKindOfClass:[NSDictionary class]])
{
NSDictionary *results = object;
NSString *categoryString=[[results valueForKeyPath:#"picture.data"] objectForKey:#"url"];
NSString *userid=[results objectForKey:#"id"];
if (userid != nil)
{
self.gotUserDetails = YES;
}
NSString *username=[results objectForKey:#"name"];
NSString *email=[results objectForKey:#"email"];
NSUserDefaults *userId=[NSUserDefaults standardUserDefaults];
[userId setObject:userid forKey:#"userid"];
}
}
}
}
But to post the feed (https://graph.facebook.com/me/feed/access_token=) from this login user I need access token. If anyone know how to get the access token in iOS 6.0 please help me.
Thanks to all.
Rather than worrying about getting the token and passing that with you call, Apple have provided SLRequest which you can use. You specify the target URL and parameters and SLRequest deals (transparently) with the authentication, transmission and collection of the response data.
You may not actually get the token, but you still need to get authorisation and that authorisation is linked to the list of things you want to do. Your code currently just shows that you want to get the e-mail address, but you can add other permissions:
[accountStore requestAccessToAccountsWithType:facebookAccountType
options:
#{
ACFacebookAppIdKey : ...,
ACFacebookPermissionsKey : #[ #"email", #"read_stream", #"user_groups", #"user_videos" ]),
}
completion:^(BOOL granted, NSError *error) { ...
You need to check the Facebook documentation to find out what permissions you need to request from the user and fill them in for ACFacebookPermissionsKey.
//Try This
-(void)fetchuserinfo
{
NSString *accessToken = [FBSession activeSession].accessToken;
NSLog(#"%#",accessToken);
}
or
-(void)fetchuserinfo
{
NSLog(#"%#",FBSession.activeSession.accessToken);
}
facebook SDK 3.2 in iOS 7 & iOS 8 , it works fine for me.
You should import FacebookSDK/FacebookSDK.h
#import <FacebookSDK/FacebookSDK.h>
....
[self checkFBIDWithToken:[FBSession activeSession].accessTokenData.accessToken];
PS:"checkFBIDWithToken:(NSString *)tempToken" is a method.
facebook doc: accessToken

Use an ACAccount without saving it

My app has tokens from Twitter and wants to make a SLRequest with them but when I do this without saving the ACAccount it doesn't. How can I fix this?
Code:
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountCredential *credential = [[ACAccountCredential alloc] initWithOAuthToken:#"token" tokenSecret:#"secret"];
ACAccountType *twitterAcctType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
ACAccount *newAccount = [[ACAccount alloc] initWithAccountType:twitterAcctType];
newAccount.credential = credential;
newAccount.username = #"username";
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:[NSURL URLWithString:#"https://api.twitter.com/1.1/statuses/user_timeline.json"] parameters:#{ #"screen_name" : #"username" }];
request.account = newAccount;
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
NSLog(#"ResponseData: %#", [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]);
NSLog(#"StatusCode: %d", urlResponse.statusCode);
NSLog(#"Error: %#", error);
}];
Log:
2013-06-20 00:07:55.554 MyApp[6009:c07] ResponseData:
2013-06-20 00:07:55.555 MyApp[6009:c07] StatusCode: 0
2013-06-20 00:07:55.555 MyApp[6009:c07] Error: Error Domain=SLErrorDomain Code=0 "Could not prepare the URL request." UserInfo=0x9499020 {NSLocalizedDescription=Could not prepare the URL request.}

How to fetch Facebook friends in ios 6?

I want to send invite facebook friends from my app same as doing like in Instagram app.
But i can't find any good tutorial for that.
I able to get the name & id of the friend but I can't able to get the url for the profile image,name,etc. for the friends.
My code is as follow:
NSURL *requestURL = [NSURL URLWithString:#"https://graph.facebook.com/me/friends"];
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)
{
list =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(#"Dictionary contains data: %#", list );
if([list objectForKey:#"error"]!=nil)
{
[self attemptRenewCredentials];
}
dispatch_async(dispatch_get_main_queue(),^{
nameLabel.text = [list objectForKey:#"username"];
});
}
else{
//handle error gracefully
NSLog(#"error from get%#",error);
//attempt to revalidate credentials
}
}];
So, how can i achieve this?
This is code for it for fetching friends list
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
__block ACAccount *facebookAccount = nil;
ACAccountType *facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
// Specify App ID and permissions
NSDictionary *options = #{
ACFacebookAppIdKey: #"add_here_your_project_FB_ID",
ACFacebookPermissionsKey: #[#"publish_stream", #"publish_actions",#"read_friendlists"],
ACFacebookAudienceKey: ACFacebookAudienceFriends
};
[accountStore requestAccessToAccountsWithType:facebookAccountType
options:options completion:^(BOOL granted, NSError *error)
{
if (granted)
{
NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];
facebookAccount = [accounts lastObject];
}
else {
NSLog(#"error.localizedDescription======= %#", error.localizedDescription);
}
}];
NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];
facebookAccount = [accounts lastObject];
//NSString *acessToken = [NSString stringWithFormat:#"%#",facebookAccount.credential.oauthToken];
//NSDictionary *parameters = #{#"access_token": acessToken};
NSDictionary *param=[NSDictionary dictionaryWithObjectsAndKeys:#"picture,id,name,link,gender,last_name,first_name,username",#"fields", nil];
NSURL *feedURL = [NSURL URLWithString:#"https://graph.facebook.com/me/friends"];
SLRequest *feedRequest = [SLRequest
requestForServiceType:SLServiceTypeFacebook
requestMethod:SLRequestMethodGET
URL:feedURL
parameters:param];
feedRequest.account = facebookAccount;
[feedRequest performRequestWithHandler:^(NSData *responseData,
NSHTTPURLResponse *urlResponse, NSError *error)
{
if(!error)
{
id json =[NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSLog(#"Dictionary contains data: %#", json );
if([json objectForKey:#"error"]!=nil)
{
//[self attemptRenewCredentials];
}
dispatch_async(dispatch_get_main_queue(),^{
//nameLabel.text = [json objectForKey:#"username"];
});
}
else{
//handle error gracefully
NSLog(#"error from get%#",error);
//attempt to revalidate credentials
}
}];
I hope it helps you. Thanks
you should include this in param
[ NSMutableDictionary dictionaryWithObjectsAndKeys:#"picture,id,name,link,gender,last_name,first_name",#"fields",nil]