Facebook SDK: openActiveSessionWithPermissions completionHandler not called - iphone

Using the code from Facebook I have implemented
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [[NSArray alloc] initWithObjects:
#"publish_actions",
nil];
return [FBSession openActiveSessionWithPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
NSLog(#"error %#", error);
[self sessionStateChanged:session
state:state
error:error];
}];
}
It returns NO which I understand because it's a first time login, and the loginUI works (it sends the user to FB and asks them to give permissions) and then returns but completionHandler block is never ever run. It just returns to the app and nada.

I assume you following Implement the Login Flow of Facebook SDK but worth reading that section again as it explains everything. Make sure that you handled openURL and handleOpenURL methods in delegate. Also check openSessionWithAllowLoginUI almost always returns NO

Little late, but just in case someone comes checking...
Switching from openActiveSession to the instance method openWithCompletionHandler did the trick for me.

from the official doc
handler
... If a block is provided, the FBSession object will call the block each time the session changes state.
I fixed this problem my solving Open Graph setups and by studying Scrumptious example code from FB such as these functions [FBSession.activeSession handleOpenURL:url] and [FBSession.activeSession handleDidBecomeActive];

Related

facebook login works on iphone simulator but not on iphone device

In my app, I want to take photos from the facebook. so i used facebook ios sdk. i can be able to authorize from the below code:
if (appDelegate.session.isOpen) {
//[appDelegate.session closeAndClearTokenInformation];
[self retrieveAlbums];
} else {
if (appDelegate.session.state != FBSessionStateCreated) {
// Create a new, logged out session.
appDelegate.session = [[FBSession alloc] init];
}
// if the session isn't open, let's open it now and present the login UX to the user
[appDelegate.session openWithCompletionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
// and here we make sure to update our UX according to the new session state
//NSLog(#"%#",session.accessTokenData.accessToken);
[self retrieveAlbums];
}];
It works fine on iphone simulator. But I can't able to login on my iphone 4 device.
When I tried to login it will open a safari and then shows the message Updating.
Then it will redirect without authorization. access token retrieved as nil. So I cant able to retreive images.
Please help me.
EDIT
Thanks for everyone .Finally I solved my problem. It is because i enabled sandbox mode in facebook developer account settings. When i disabled the sandbox mode, it works normally.
Try clearing the cookies and cache of your safari, going to Settings.
Also if you do not want the app to redirect to Safari, just dont provide the URL Scheme in your info.plist that is something like "fb-AppId-" and it will open a popup for login
I was having the similar problem and solved it by composing couple of solutions in this website. First of all I got rid of the url scheme at my info plist. So now my app opens up the facebook login dialog inside my registration page. Which is a good thing because it doesn't go back and forth to safari for facebook authentication and you stay inside the app. The second thing I made is, putting an error handling mechanism inside my code for facebook login. So if login with facebook fails, it uses another strategy for logging in.
Here is my code.
- (void)loginView:(FBLoginView *)loginView handleError:(NSError *)error {
NSArray *permissions = [[NSArray alloc] initWithObjects:
#"public_profile", #"user_friends", #"email",
nil];
FBSession *session = [[FBSession alloc] initWithPermissions:permissions];
[FBSession setActiveSession:session];
[self openSessionWithAllowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
if (!error && status == FBSessionStateOpen) {
NSString *token = session.accessTokenData.accessToken;
NSLog(#"Logged in! - Token -- %#", token);
} else {
NSLog(#"Something wrong happened");//you can check the error code here
}
}];
}

How to integrate FB iOS SDK 3.1.1 with App Requests

I've been looking for a solid answer that explains how to keep 3.1.1 in my project but also implementing the app request dialog. What I've read says I need to import Facebook.h and call it like [self.facebook dialog:#"apprequests" andParams:params andDelegate:self]; but when I import Facebook.h and comment out #import <FacebookSDK/FacebookSDK.h> I then get conflicts with
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
[self sessionStateChanged:session
state:state
error:error];
}];
Could someone guide me through how I maintain my 3.1.1 SDK but also add apprequests? My goal is to select FB users then send an app request to join my app.
Thanks,
Wes

Facebook iOS SDK 3.1 openActiveSession.. always returns 0

I am working on an application that needs to be able to upload an image for the app for iOS versions 5.0+. For iOS 6, I have easily implemented the social feed that works perfectly.
For iOS 5, I am using the Facebook iOS SDK version 3.1. I use the methods that were in the tutorials, and so when I got to publish the image on iOS <6.0, I call the following method:
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
return [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObjects:#"publish_actions", nil] defaultAudience:FBSessionDefaultAudienceFriends allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
[self sessionStateChanged:session
state:status
error:error];
}];
}
With [self openSessionWithAllowLoginUI:YES]; I always get back NO (0) and sessionStateChanged:state:error is never called due to it returning 0.
I have the app set up correctly, the two different parts set up in the plist, etc. etc., but for some reason this code on my iOS 5.0 device does not want to return correctly. (Just like in openSessionWithAllowLoginUI almost always returns NO)
Does anyone have any solutions on why it would always be returning no? I have the official FB app installed on the device, I am logged into my account...I am not getting any errors or anything...
Thanks in advance!

Facebook IOS SDK 3.1 - reauthorizeWithPublishPermissions?

Just upgraded to the Facebook iOS SDK 3.1 and already running into problems.
My app can't find the facebook method reauthorizeWithPublishPermissions, and it also hasn't got a clue what the static FBSessionDefaultAudienceFriends definition is!
Anyone else seen these problems? Can't believe that the 3.1 SDK would have these basic bugs in it, so I'm blaming my stupidity for now!!
For completeness, here is my code:
[FBSession reauthorizeWithPublishPermissions:[NSArray arrayWithObjects:#"publish_stream", #"publish_actions",nil]
defaultAudience:FBSessionDefaultAudienceFriends
completionHandler:^(FBSession *session, NSError *error) {
// Do something...
}];
Thanks.
#Zotter, answer is depreciated. Now (with latest Facebook iOS SDK, I guess v.3.19) you've to use - (void)requestNewReadPermissions:(NSArray *)readPermissions completionHandler:(FBSessionRequestPermissionResultHandler)handler; method, to authorise app with publish permissions.
[FBSession.activeSession requestNewPublishPermissions:permissions
defaultAudience:FBSessionDefaultAudienceFriends
completionHandler:^(FBSession *session, NSError *error) {
if(!error) {
}
}];
/*! No audience needed; this value is useful for cases where data will only be read from Facebook */
FBSessionDefaultAudienceNone = 0,
/*! Indicates that only the user is able to see posts made by the application */
FBSessionDefaultAudienceOnlyMe = 10,
/*! Indicates that the user's friends are able to see posts made by the application */
FBSessionDefaultAudienceFriends = 20,
/*! Indicates that all Facebook users are able to see posts made by the application */
FBSessionDefaultAudienceEveryone = 30,
reauthorizeWithPublishPermissions: is an instance method
[FBSession.activeSession reauthorizeWithPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:
^(FBSession *session,
NSError *error)
{
...
}];
I had this problem. I was using an old version of Cocoapods that wasn't properly upgrading the source from 3.0 to 3.1. If you're using Cocoapods, upgrade to 0.14.0 and try again. If not, double check to make sure you have the latest Facebook SDK from master - if you don't see those values in FBSession.h, you probably have an old version of the SDK.

Facebook login on iPhone app

I am trying to allow users to login to my app, through Facebook. I am following this guide https://developers.facebook.com/docs/howtos/login-with-facebook-using-ios-sdk/
I have followed all of the steps including the step named "Getting started with the Facebook sdk for iOS".
When I copy and paste the following method, I get an error here:
return [FBSession openActiveSessionWithPermissions:permissions
Here is the method I copied and pasted.
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [[NSArray alloc] initWithObjects:
#"user_likes",
#"read_stream",
nil];
return [FBSession openActiveSessionWithPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error) {
[self sessionStateChanged:session
state:state
error:error];
}];
}
The error says this: "No known class method for selector 'openActiveSessionWithPermissions:allowLoginUI:completionHandler:'"
Can someone help me figure out what I am doing wrong?
Let me know if you'd like to see some more of my code to figure the problem out.
update you facebook sdk to the latest one, and follow Scrumptious example.
I really doubt this is gonna solve your problem, but it's worth a shot. NSError usually takes an ampersand ("&") before getting passed as an argument. So write it as error:&error instead.
Complementing mLamaa answer, take a look on Facebook Upgrade Guide and follow these 2 steps:
1- Update facebook SDK
2- Replace the openActiveSessionWithPermissions function to openActiveSessionWithReadPermissions
Reference:
https://developers.facebook.com/docs/ios/upgrading/
Upgrading from 3.0 to 3.1
"Therefore, if your app previously used v3.0 of the SDK, you will need to remove usage of openActiveSessionWithPermissions:allowLoginUI:completionHandler: and replace it with openActiveSessionWithReadPermissions:allowLoginUI:completionHandler: (or even more simply, openActiveSessionWithAllowLoginUI)."