Post status update to Facebook from iOS application - objective-c

I am creating an iOS application and I am adding some sharing options. I already downloaded the Facebook 3.0 SDK and placed it in my project in accordance with the Facebook developer page. All I need my application to do is post text-only status updates to Facebook when a certain button is clicked on an UIActionSheet. Here is the code I have so far:
#import <FacebookSDK/FacebookSDK.h>
-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0) {
NSArray *permissions = [NSArray arrayWithObject:#"publish_actions"];
[FBSession openActiveSessionWithPermissions:permissions allowLoginUI:YES
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
// session might now be open.
if (session.isOpen)
//don't know what to do from here
}];
}
}
I don't know where to proceed from here. The authentication takes place and then the Facebook app on my iPhone opens and that is the end of it. Also, if there is anything else I should add that I am missing PLEASE let me know. I am new to Facebook SDK.

Facebook's iOS documentation covers this very nicely in their sample application and tutorials.
Specifically
HelloFacebookSample: combines use of FBLoginView,
FBProfilePictureView, FBFriendsPickerViewController,
FBPlacePickerViewController, and FBRequest for profile access, status
updates and photo uploading.
From developer.facebook.com

Related

iOS Facebook integration shows 'App Not Setup' error

I am having Facebook login in my iOS App. After following all the steps from developer.facebook.com and successful integration I can see a button in my view on clicking that button it redirects to safari and asking for fb username and password but after logging in it shows 'App Not Setup' error. Here I have 3 questions
I want everything to load inside the app itself
I don't want the FB login button, I want to load the FB page on viewdidload/appear
Whats the reason for "App not Setup" error. I want to test with successful loginenter
There might be various reasons for "App not setup" like
Check your plist file where you are entering 'FacebookAppID' and URL string
a)check your facebook app id
b)check your URL String facebook app id has prefix 'fb'
c)Check your bundle id i.e com.yourapp.com is properly set on facebook app settings or not.
d) Check you have entered all correct information in app settings of your facebook app.
If you don't strictly need to use Facebook SDK you could use the Social.framework. That way you wouldn't have to worry about the bundle id or Facebook App ID.
Here's a sample code to show how it works:
SLComposeViewController *slComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
[slComposeViewController setInitialText:MyText];
[slComposeViewController setTitle:MyTitle];
if (![slComposeViewController addURL:url]) {
NSLog(#"Unable to add url");
}
[self presentViewController:slComposeViewController animated:YES completion:nil];
//Check the result
slComposeViewController.completionHandler = ^(SLComposeViewControllerResult result)
{
switch (result) {
case SLComposeViewControllerResultCancelled:
//Do something
break;
case SLComposeViewControllerResultDone:
//Do something
break;
}
};
//If iOS < 7.0 dismiss the viewcontroller
NSString *version = [[UIDevice currentDevice] systemVersion];
if ([version floatValue] < 7.0)
{
dispatch_async(dispatch_get_main_queue(), ^{
[slComposeViewController dismissViewControllerAnimated:NO completion:^{
// Do something
}];
});
}

iOS facebook SDK: Login already authenticated

I have had the Facebook iOS SDK running in an app I've been working on for a few months. At this point I am mostly using the SDK for SSO purposes.
Since I have started using iOS 6.0 I have been seeing an issue where the "Login to use your FB account with MY_APP" modal is blocking my current view.
The odd thing is that the user is already authenticated and apparently authorized to use my app. This is proven by the fact that I can get the user's email address and such.
It is also important to note that if I click the "X" it will close and everything is fine (user is authenticated/authorized). If I login as it tells me, it shows the "MY_APP is already authorized" modal which I cannot click the "Okay" button but I can click the "X" which again drops me back into my view with the user authenticated and authorized.
Here you can see the it:
To authenticate I am calling the following method in the appdelegate:
[appDelegate openSessionWithAllowLoginUI:YES];
The following are the relevant FB methods in my appdelegate:
// FACEBOOK STUFF
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [NSArray arrayWithObjects: #"email", nil];
return [FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
[self sessionStateChanged:session state:status error:error];
}];
}
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState)state
error:(NSError *)error {
// FBSample logic
// Any time the session is closed, we want to display the login controller (the user
// cannot use the application unless they are logged in to Facebook). When the session
// is opened successfully, hide the login controller and show the main UI.
switch (state) {
case FBSessionStateOpen: {
FBCacheDescriptor *cacheDescriptor = [FBFriendPickerViewController cacheDescriptor];
[cacheDescriptor prefetchAndCacheForSession:session];
[self sendAuthenticationStatusChangedNotification];
}
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
// FBSample logic
// Once the user has logged in, we want them to be looking at the root view.
[FBSession.activeSession closeAndClearTokenInformation];
//[self showLoginView];
break;
default:
break;
}
if (error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:#"Error"
message:error.localizedDescription
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alertView show];
}
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// FBSample logic
// We need to handle URLs by passing them to FBSession in order for SSO authentication
// to work.
return [FBSession.activeSession handleOpenURL:url];
}
EDIT 1
I noticed that this is happing on one of my phones but not the other. The phone that wasn't working had an older version of the FB app installed. Updating the FB app stopped this issue from happening. I am still interested in a fix to avoid others from experiencing the same issue.
EDIT 2
The issue went away for a little but now is back even with the new facebook app installed. Please help!
The problem for me actually turned out to be a silly one. I was calling
[appDelegate openSessionWithAllowLoginUI:YES];
two times due to a button click event that was wired up twice. As soon as it was only being called once, the issue went away!

Facebook sdk: ActiveSession is still closed after I give permission

I am integrating facebook login in my application. I jsut want the user to be able to login and I get his birthday and Location.
I got the latest Facebook SDK and successfully added it to my application. I also created a new application on facebook and added the key provided to my application.
I have created a button "Login with facebook" and done the following
When the user clicks the button
// handler for button click
- (IBAction)facebookLoginTouched:(id)sender {
[self openSessionWithAllowLoginUI:YES];
}
This method will show the user the facebook login page in order to get his permission
-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [[NSArray alloc] initWithObjects:
#"user_location",
#"user_birthday",
nil];
return [FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
[self HandleLogin];
}];
}
Then if login and permission successful
- (void)HandleLogin {
if (FBSession.activeSession.isOpen) {
//THIS IS NEVER REACHED
[FBRequestConnection
startForMeWithCompletionHandler:^(FBRequestConnection *connection,
id<FBGraphUser> user,
NSError *error) {
//DO SOMETHING WITH THE USER INFO
}];
}
}
My problem:
When I click on the button the facebook page comes in correctly and I enter my username/password. It logged me correctly and I gave permission for the application to access my information. When I finish, I return to the app successfully.
However when the code reaches FBSession.activeSession.isOpen it returns false.
Why is the session still closed after I correctly logged in and gave permission?
Any help is greatly appreciated.
Thanks
You may be missing code to process the return from the Facebook app. Add the following in your app delegate implementation file:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// attempt to extract a token from the url
return [FBSession.activeSession handleOpenURL:url];
}

FBNativeDialogNotSupported Facebook sdk 3.1

With the release of Facebook SDK 3.1 it has a class which launches the Facebook Native Dialog for Post in iOS 6.
Below is the code for it.
[FBNativeDialogs presentShareDialogModallyFrom:currentController initialText:nil image:nil url:nil handler:^(FBNativeDialogResult result, NSError *error) {
//Print Error
}];
Error Domain=com.facebook.sdk Code=7 "The operation couldn’t be completed. (com.facebook.sdk error 7.)" UserInfo=0x1e5e0930 {com.facebook.sdk:NativeDialogReasonKey=com.facebook.sdk:NativeDialogNotSupported
So, I tried to login first using the following code and then launch the FBNativeDialog. But, it does not enter the completion handler, when Okay button is pressed of Facebook permission window in Safari.
AppDelegate *appDelegate=[[UIApplication sharedApplication] delegate];
appDelegate.session = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObjects:#"publish_stream", nil]];
[appDelegate.session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
switch (status) {
case FBSessionStateOpen:
[FBNativeDialogs presentShareDialogModallyFrom:currentController initialText:nil image:nil url:nil handler:^(FBNativeDialogResult result, NSError *error) {
NSLog(#"Dialog Error= %#",error);
}];
break;
default:
break;
}
}];
when Okay button is pressed of Facebook permission window in Safari
You need to set up the Facebook account on the iOS 6 device/simulator in order to use the native share dialogs. Once you have done so, you will get native iOS permissions dialogs as well so there should be no app switching to Safari to login. See my similar response to http://facebook.stackoverflow.com/a/12681352/1712979

Prompt login alert with Twitter framework in iOS5?

As you all may know, since iOS5 there is a native Twitter framework which make it easy to post tweets from your app.
Is there a way to prompt an alert that forwards the user to the settings app and ask for username and password?
I know that i could solve the problem with the following code:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"prefs:root=TWITTER"]];
But thats undocumented code..
Thanks in advance
Regards Billy
(My first post on SO)
In iOS5.1, we should use TWTweetComposeViewController to show the dialog since apple rejects apps using prefs:root=TWITTER.
But, I didn't like showing the tweet screen and keyboard
so I figured out the way to hide them, but show the pop up screen.
UPDATE:
Apple approved my app using this trick.
TWTweetComposeViewController *viewController = [[TWTweetComposeViewController alloc] init];
//hide the tweet screen
viewController.view.hidden = YES;
//fire tweetComposeView to show "No Twitter Accounts" alert view on iOS5.1
viewController.completionHandler = ^(TWTweetComposeViewControllerResult result) {
if (result == TWTweetComposeViewControllerResultCancelled) {
[self dismissModalViewControllerAnimated:NO];
}
};
[self presentModalViewController:viewController animated:NO];
//hide the keyboard
[viewController.view endEditing:YES];
//this approach doesn't work since you can't jump to settings
// [self dismissModalViewControllerAnimated:NO];
You don't need to implement this, if you set up your Twitter integration to make a post on Twitter and iOS detects that there is no Twitter account set up it will do this automatically for you!
This is a screenshot of one of my apps running on my iPhone 4S on iOS 5.1
The removal of Preferences links is in reference to custom actions by the developer, as in linking to your own preferences menu. This does not apply because not only is Twitter a built in function of iOS 5 but the UIAlertView that pops up to notify you isn't handled by the developer, it is an automatic function of iOS.
Here i found the way :
Display custom alert if no twitter account has been setup on your device settings:
if (![TWTweetComposeViewController canSendTweet]) {
UIAlertView *alertViewTwitter = [[[UIAlertView alloc]
initWithTitle:#"No Twitter Accounts"
message:#"There are no Twitter accounts configured. You can add or create a Twitter account in Settings."
delegate:self
cancelButtonTitle:#"Settings"
otherButtonTitles:#"Cancel",nil] autorelease];
[alertViewTwitter show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex==0) {
TWTweetComposeViewController *ctrl = [[TWTweetComposeViewController alloc] init];
if ([ctrl respondsToSelector:#selector(alertView:clickedButtonAtIndex:)]) {
[(id <UIAlertViewDelegate>)ctrl alertView:alertView
clickedButtonAtIndex:0];
}
[ctrl release];
}
}
Hope this will make sense :)
It's not possible, although it should automatically ask the user to login, if the user isn't logged in already.
As of iOS 5.1 that feature has been removed, as seen here