Jump to content

[TOPIC: topicViewTemplate]
[GLOBAL: userSmallPhoto]
Photo

Facebook 3.1.1 SDK breaks A LOT
Started by haakon Dec 29 2012 08:39 PM

- - - - -
133 replies to this topic
[TOPIC CONTROLS]
« Page 4 of 6 2 3 4 5 6
This topic has been archived. This means that you cannot reply to this topic.
[/TOPIC CONTROLS]
[modOptionsDropdown]
[/modOptionsDropdown]
[reputationFilter]
[TOPIC: post.html]
#76

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

Just an update on this issue. We understand this is a major issue and we are looking into this problem now and hope to have a resolution very soon.

Thanks,
Tom
uid: 7559 topic_id: 34416 reply_id: 142418


[TOPIC: post.html]
#77

haakon

[GLOBAL: userInfoPane.html]
haakon
  • Contributor

  • 188 posts
  • Enterprise

Naomi (and Tom),

By accident I tried to post a payload to facebook.request that had illegal content. It actually led to the problems described in this thread, the facebook error 5.

I know for sure my implementation works fine, we have tested it extensively for several days. So Naomi, I'm thinking that you are maybe posting some data that is not valid since you're still getting the error.

You can test it by trying to issue a post to me/photos with this payload:

WORKS
local obj = {
    message = "Corona SDK",
    source = { baseDir=system.TemporaryDirectory, filename="image.png", type="image" }
}
FacePublishPhoto(obj)

FAILS with error and causes a lot of trouble
local obj = {
    message = "Corona SDK",
    source = 'http://www.coronalabs.com/wp-content/uploads/2012/06/Built_with_Corona_SM.png',
}
FacePublishPhoto(obj)

My point is, if you have a payload that does not validate, Corona handles the error from Facebook horribly. It completely destroys the facebook functionality in Corona. Which is what is happening for you, Naomi. I'd like to see that test project you created, would you mind sending it to me? haakon ÆT monkeybin.no
uid: 21746 topic_id: 34416 reply_id: 142422


[TOPIC: post.html]
#78

Naomi

[GLOBAL: userInfoPane.html]
Naomi
  • Corona Geek

  • 2,303 posts
  • Corona SDK

@Tom, thank you. Looking forward to the resolution.

@haakon, I haven't touched my code after I reverted it back to my pre-workaround code. Perhaps when I converted to incorporate your workaround, it worked -- except that I didn't clean slate my device, and some FB related cookie was still on device, causing it to disturb my test process -- I don't know. The errors I ended up with (after I implemented your workaround) was the same errors that I get when I delete the app and reinstall the very same app. Does your app have no issue after you install it, test it thoroughly, delete it and then reinstall it -- assuming you are building your app with iOS6.1 SDK? If it works, then I may not have implemented your workaround properly.

Anyhow, yes, I'll send you the test project. Let me know if you spot anything odd. If you end up implementing your workaround on the test project, it would be nice if you can send it back.

Naomi

Edit: Haakon, I just sent you the test project. BTW, is this illegal for facebook.showDialog? But then, if it's illegal, why does it work after I restart the app?
local attachment = {
	app_id = appID,
	to = friendID,
	link = "http://www.coronalabs.com",
	picture = "http://www.coronalabs.com/wp-content/uploads/2012/06/Built_with_Corona_SM.png",
	name = "I Hit a New High Score!!",
	description = "I made a new high score in this game!"
	}
facebook.showDialog( "feed", attachment )

uid: 67217 topic_id: 34416 reply_id: 142429


[TOPIC: post.html]
#79

mslack

[GLOBAL: userInfoPane.html]
mslack
  • Contributor

  • 230 posts
  • Corona SDK

lol ... after reading all the frustration caused by this issue and facing it myself now i notice that just above this box where i am typing is a solution ..... "Need immediate assistance? Get Premium Support." ...

+1 for fixing this

Thanks for the code Haakon ... will give it s spin if this is not addressed in the next day or two.
uid: 118012 topic_id: 34416 reply_id: 142450


[TOPIC: post.html]
#80

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

Just an update on the iOS Facebook SDK 3.0 issue. We reworked our internal FB 3.1.1 interface and believe we have resolved the major issues. We tested against the Facebook Sample App as well as Naomi's test case (#20794). The changes will in the next daily build (1028 and later). We will continue to test and please report any problems you find.

We tried to not make any breaking API changes so there should be no changes to existing Corona code.

Thanks,
Tom
uid: 7559 topic_id: 34416 reply_id: 142584


[TOPIC: post.html]
#81

Naomi

[GLOBAL: userInfoPane.html]
Naomi
  • Corona Geek

  • 2,303 posts
  • Corona SDK

Tom, this is fantastic! Thank you. I'll grab daily build 1028 as soon as it becomes available, and yes, I'll post if I encounter any problems.

Thanks again!

Naomi
uid: 67217 topic_id: 34416 reply_id: 142586


[TOPIC: post.html]
#82

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

To use Facebook with build 1028 there is one change needed to your Facebook project. You need to add your Facebook App ID to another place in the build.setting file.


plist=
{
FacebookAppID = "xxxxxxxxxxxxxx",
CFBundleURLTypes =
{
{
CFBundleURLSchemes =
{
"fbxxxxxxxxxxxxxx",
},
},
},
},

[/code]
uid: 7559 topic_id: 34416 reply_id: 142641


[TOPIC: post.html]
#83

cebodine

[GLOBAL: userInfoPane.html]
cebodine
  • Observer

  • 12 posts
  • Corona SDK

Thank you Tom. We'll have a look at this today and see what kind of results we get and report back here.

uid: 120928 topic_id: 34416 reply_id: 142652


[TOPIC: post.html]
#84

Naomi

[GLOBAL: userInfoPane.html]
Naomi
  • Corona Geek

  • 2,303 posts
  • Corona SDK

@cebodine, a quick note to let you know that I found there are still some FB issues with daily build 1028 (after revising the build.settings per Tom's instruction.) Tom is aware of my test result. And now, I'll sit tight and wait for another good news.

Naomi
uid: 67217 topic_id: 34416 reply_id: 142656


[TOPIC: post.html]
#85

cebodine

[GLOBAL: userInfoPane.html]
cebodine
  • Observer

  • 12 posts
  • Corona SDK

Hi Tom,

We are still experiencing problems with build 1028. In the call to facebook.login, we have been wrapping the listener parameter with a lua enclosure to provide context information to the listener:

        facebook.login( game.facebookAppId,
            function(event)
                listener(request, event)
            end,
            request.permissions
        )

The request table includes all of the required data to send to facebook (path, method, attachment), and what action(s) to take upon receipt. This avoids having to define global variables and facilitated concurrent processing of multiple facebook requests.

With the latest build, we can confirm that the enclosure passed to the FIRST login call is now used for all subsequent listener invocations. To some extent, we might be able to work around this, but it will require blocking all user activity until each request is completed. This used to work quite well.

What we really need is the ability to pass a different listener for each facebook.request in the same manner as network.request. The current implementation requires the listener to depend upon global (or at least module level) variables to determine context.
uid: 120928 topic_id: 34416 reply_id: 142689


[TOPIC: post.html]
#86

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

@cebodine, can you provide some code around the snippet you posted so we can see the context in which it's used? If you prefer, you can email me directly something that I can test against to better understand the issue. tom at coronalabs dot com.

Have you seen any other issues in your test of 1028?

Thanks,
Tom
uid: 7559 topic_id: 34416 reply_id: 142700


[TOPIC: post.html]
#87

Naomi

[GLOBAL: userInfoPane.html]
Naomi
  • Corona Geek

  • 2,303 posts
  • Corona SDK

A quick update to let you all know that Daily Build 1028 fixed the issue for me. The final issue that I had with the 1028 was something to do with a device that previously had FB error. I didin't clean slate the device, and the newly built app got tripped by the lingering issue. Once I wiped the device and then installed the same app, the error went away.

Tom, thank you so much for fixing this!!!

Naomi
uid: 67217 topic_id: 34416 reply_id: 142703


[TOPIC: post.html]
#88

cebodine

[GLOBAL: userInfoPane.html]
cebodine
  • Observer

  • 12 posts
  • Corona SDK

Hi Tom,

I don't really have time at the moment to put together a full working demonstration that is not our complete project, but here are a few larger snipets... Right now, I am away from my mac, so I cannot build this for device. and test

facebookUI.lua
local facebook = require("facebook")
local json = require("json")

local factory = {}

-- Facebook Session States
local fbPhases = {
    login = "Logged In",
    loginFailed = "Login Failed",
    loginCancelled = "Login Cancelled",
    logout = "Logged Out",
}
-- Facebook Connection listener
--
local function listener( request, event )

    -- print("facebookUI.listener invoked", dialog, request, event)
    -- After a successful login event, send the FB command
	-- Note: If the app is already logged in, we will still get a "login" phase
	--
    if ( "session" == event.type ) then
        -- event.phase is one of: "login", "loginFailed", "loginCancelled", "logout"
        print( "facebookUI listener, Session Status: " .. event.phase, request )
        factory.sessionState = event.phase
    end
    if ( "session" == event.type ) then
        if "login" == event.phase then

            print("Login complete, invoking facebook.request", request.path)
            if request.action then
                facebook.showDialog( request.action, request.attachment )
            else
                facebook.request( request.path, request.method, request.attachment )		-- posting the photo
            end
        else
            print("Login failed: ", event.phase)
        end

    elseif ( "request" == event.type ) or ( "dialog" == event.type ) then
        -- event.response is a JSON object from the FB server
        local response = event.response

        if event.isError then
            print("Facebook connect error:", json.encode(event))
        else
            if "dialog" == event.type and (not(response and string.find(response, "post_id="))) then
                print("Dialog cancelled.")
                if request.onError then
                    request.onError("Canceled")
                end
            else
                print("Facebook Response:",response)
                local decodedResponse = json.decode(response) or response
                if decodedResponse and decodedResponse.error then
                    print("Facebook refused request.\n" .. (decodedResponse.error.message or "") )
                else
                    if request.onResponse then
                        -- invoke callback with decoded json, or plan response if not json encoded
                        request.onResponse(request, decodedResponse)
                    end
                end
            end
        end
    else
        print("facebookUI listener - unhandeld event:", event.type)
    end
end

function factory.sendMessage( request )
    -- call the login method of the FB session object, passing in a handler
    -- to be called upon successful login.

    -- wrap callback to provide context to listener
    print("invoking facebook.login for ", request.path, request)
    facebook.login( game.facebookAppId,
        function(event)
            listener(request, event)
        end,
        request.permissions
        --{"publish_stream","user_photos"}
    )
end

other module:
local fbUI = require( "facebookUI" )

local function getFriendsListener(request, response)
    local friendsList = response and response.data
    local contextData = request.contextData
    -- process the results in friendsList
end

local function getFriends()
        local request = {
            path = "me/friends",
            attachment = {
                fields="installed,name,picture.height(90).width(90)"
            },
            onResponse = getFriendsListener,
            onError = function(msg) print("failed", msg) end,
            contextData = "Other info",
        }
        fbUI.sendMessage(request)
end

The request table above is just one example, it combines the data to send to facebook with success and error handlers, and can pass additional parameters to the onResponse listener.
It is getting late, I've got to go.
uid: 120928 topic_id: 34416 reply_id: 142711


[TOPIC: post.html]
#89

cebodine

[GLOBAL: userInfoPane.html]
cebodine
  • Observer

  • 12 posts
  • Corona SDK

After re-working our code to store the facebook request context globally, our application is now functional on build 1028 (except for the part that attempts to do multiple concurrent facebook requests) I guess I'm going to have to serialize that process and make the user wait.

We have observed a few errors:
Error: HTTP status code: 200
Facebook connect error: {"isError":true,"type":"request","name":"fbconnect","response":"The operation couldn't be completed. (com.facebook.sdk error 5.)"}
These have been sporadic, not reproducible, and no pattern has yet been determined. Immediate retry of the same request works.

Thanks
uid: 120928 topic_id: 34416 reply_id: 142768


[TOPIC: post.html]
#90

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

Facebook error 5 is a general error that's returned when it couldn't complete an operation I saw this yesterday when I was testing and the iPad device didn't have an Internet connection. Your app needs to handle cases when something goes wrong with the connection or talking with the Facebook servers.
uid: 7559 topic_id: 34416 reply_id: 142776


[TOPIC: post.html]
#91

dimd

[GLOBAL: userInfoPane.html]
dimd
  • Contributor

  • 100 posts
  • Corona SDK

Hey Tom,

I still get Facebook error 5 with my code, which used to work to post a screenshot.
---- ***********   FACEBOOK    ************* ----
	
	local function onLoginSuccess()
		
		local attachment = {
			message = text[18][language],
			source = { baseDir=system.DocumentsDirectory, filename="shot.jpg", type="image" }
		}
		
		facebook.request( "me/feed", "POST", attachment )
		
	end

	local function fbListener( event )
		if event.isError then
			native.showAlert( "ERROR", event.response, { "OK" } )
		else
			if event.type == "session" and event.phase == "login" then
				-- login was a success; call function
				onLoginSuccess()
			
			elseif event.type == "request" then
				-- this block is executed upon successful facebook.request() call
	 
				native.showAlert( "Success", "The photo has been uploaded.", { "OK" } )
				
			end
		end
	end
 
	local function postFB(event)
		
		if event.phase == "began" then 
			
			display.getCurrentStage():setFocus( event.target )
			event.target.isFocus = true
			
		elseif event.phase == "moved" then
		

		elseif event.phase == "ended" or event.phase == "cancelled" then
	   
			--** Take screenshot
			display.save( stillMainMenuGraphicElements[39], "shot.jpg", system.DocumentsDirectory )
			
			local function waitAndPost()
				if require("socket").connect("google.com", 80) == nil then
					 
					 -- If no internet connection
					
				else
	
					facebook.login( fbAppID, fbListener, { "publish_actions" } )
					
				end
			end
			
			timer.performWithDelay(100, waitAndPost)		
			
			display.getCurrentStage():setFocus( nil )
			event.target.isFocus = nil
			
		end
 		   	
    	return true
end



I did add to the build.settings the following. (However, is it normal to have it once with the "fb" prefix and once without?)

FacebookAppID = "123922354444543",
			
			CFBundleURLTypes =
            {
                {
                    CFBundleURLSchemes =
                    {
                        "fb123922354444543",
                    }
                }
            },


Any idea? What am i doing wrong?

Thanks.
uid: 100310 topic_id: 34416 reply_id: 142792


[TOPIC: post.html]
#92

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

@cebodine, we are looking into your issue to see what we can do to make it work as before.
uid: 7559 topic_id: 34416 reply_id: 142794


[TOPIC: post.html]
#93

Naomi

[GLOBAL: userInfoPane.html]
Naomi
  • Corona Geek

  • 2,303 posts
  • Corona SDK

@Tom and @cebodine, I'd like to know what Tom means by "make it work as before."

Does this mean re-working the code "to store the facebook request context globally" is not necessary? I've been re-working my code today, because otherwise, facebook requests are failing after successfully executing a series of requests in one scene (i.e., successfully executing CASE 5 or CASE 7.) If re-working my code is not necessary, I'd rather wait for additional fix before I proceed further. So, is what Tom looking into related to this? Please let me know.

Naomi
uid: 67217 topic_id: 34416 reply_id: 142795


[TOPIC: post.html]
#94

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

@Naomi,

This means making each call to facebook.login update the listener, whereas in the current implementation (build 1028 and newer), only the first facebook.login sets it. Before build 1028 each login call would update the listener so we introduced a regression bug with our fix.
uid: 7559 topic_id: 34416 reply_id: 142799


[TOPIC: post.html]
#95

Naomi

[GLOBAL: userInfoPane.html]
Naomi
  • Corona Geek

  • 2,303 posts
  • Corona SDK

@Tom, thank you so much for the explanation. It sounds like I don't need to rework my code then. That's a relief.

Thanks again,
Naomi
uid: 67217 topic_id: 34416 reply_id: 142802


[TOPIC: post.html]
#96

cebodine

[GLOBAL: userInfoPane.html]
cebodine
  • Observer

  • 12 posts
  • Corona SDK

@Tom,

Just to be clear, the listener called should be the listener that was in effect at the time that the request or dialog was sent. That is the only way that multiple concurrent Facebook requests can be correlated.

Ideally, that would mean adding an additional parameter to facebook.request to specify the listener for that specific request.

Thanks
uid: 120928 topic_id: 34416 reply_id: 142803


[TOPIC: post.html]
#97

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

@cebodine, we are looking to fix what we broke with build 1028 changes. At this time we cannot add new parameters or APIs because it won't be compatible with Android, which we haven't updated to the latest SDK. We will update the Android SDK after we get some much needed Android issues out of the way.
uid: 7559 topic_id: 34416 reply_id: 142809


[TOPIC: post.html]
#98

Tom

[GLOBAL: userInfoPane.html]
Tom
  • Moderator

  • 1,480 posts
  • Corona Staff

@cebodine, the login listener regression bug is fixed and should be available in the next daily build (1030).
uid: 7559 topic_id: 34416 reply_id: 142827


[TOPIC: post.html]
#99

haakon

[GLOBAL: userInfoPane.html]
haakon
  • Contributor

  • 188 posts
  • Enterprise

Hi,

1030 works fine, but broke our own plugin for facebook native share dialog, since you have moved your own code into a plugin (Enterprise).

Error Domain=com.facebook.sdk Code=7 "The operation couldn’t be completed. (com.facebook.sdk error 7.)" UserInfo=0x1ab85fd0 {com.facebook.sdk:NativeDialogReasonKey=NativeDialogInvalidForSession}

Thus we need this piece of code inserted in your plugin asap (we should have submitted to Apple today, but need to wait for you to update):

#import <FacebookSDK/FacebookSDK.h>
#import <FacebookSDK/FBNativeDialogs.h>

int
PluginNativeFacebook::ShowDialogForReal( lua_State *L)
{
    UIViewController *viewController = fRuntime.appViewController;
    
    const char *txt = lua_tostring( L, 1 );
    const char *img = lua_tostring( L, 2 );
    const char *url = lua_tostring( L, 3 );
    int listenerIndex = 4;
    
    if (NULL == fListener) {
        if ( CoronaLuaIsListener( L, listenerIndex, kEvent ) )
        {
            CoronaLuaRef listener = CoronaLuaNewRef( L, listenerIndex );
            fListener = listener;
        }
	}
    
    [FBNativeDialogs
     presentShareDialogModallyFrom:viewController
     initialText:[NSString stringWithFormat:@"%s", txt]
     image:[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%s", img]]
     url:[NSURL URLWithString:[NSString stringWithFormat:@"%s", url]]
     handler:^(FBNativeDialogResult result, NSError *error) {
         
         // Only show the error if it is not due to the dialog
         // not being supporte, i.e. code = 7, otherwise ignore
         // because our fallback will show the share view controller.
         if (error && [error code] == 7) {
             NSLog(@"Not supported");
             NSLog(@"%@", error.debugDescription);
             
             char status[] = "error";
             DispatchEvent(true, status);
         } else {
             NSLog(@"Supported, what next?");
             NSString *alertText = @"";
             if (error) {
                 alertText = [NSString stringWithFormat:
                          @"error: domain = %@, code = %d",
                          error.domain, error.code];
                
             } else if (result == FBNativeDialogResultSucceeded) {
                 NSLog(@"Posted successfully");
                 char status[] = "success";
                 DispatchEvent(true, status);
             } else if (result == FBNativeDialogResultCancelled) {
                 NSLog(@"Cancelled");
                 char status[] = "cancelled";
                 DispatchEvent(true, status);
             } else if (result == FBNativeDialogResultError) {
                 NSLog(@"Got an error");
                 char status[] = "error";
                 DispatchEvent(true, status);
             } else if (![alertText isEqualToString:@""]) {
                 NSLog(@"%@", alertText);
                 char status[] = "error";
                 DispatchEvent(true, status);
             } else {
                 NSLog(@"Just an error, not sure why");
                 char status[] = "error";
                 DispatchEvent(true, status);
             }
         }
     }];
    
    return 0;
}

int
PluginNativeFacebook::ShowDialog(lua_State *L)
{
    NSLog( @"Show Dialog, Native Facebook Plugin, version %s.", version);
    
    Self *provider = ToLibrary(L);
	provider->ShowDialogForReal(L);
    
    return 0;
}
uid: 21746 topic_id: 34416 reply_id: 142869


[TOPIC: post.html]
#100

walter

[GLOBAL: userInfoPane.html]
walter
  • Moderator

  • 726 posts
  • Alumni

If the error is generated by the invocation of your code/plugin, then this isn't an issue with our Facebook implementation.

In other words, if you are calling your own native wrapper for facebook functionality, then our code will not have an impact on your code's behavior. In fact, none of our code would be executed at all, since you are using your own version instead.
uid: 26 topic_id: 34416 reply_id: 142895



[topic_controls]
« Page 4 of 6 2 3 4 5 6
 
[/topic_controls]