mgcrea / cordova-facebook-connect

Cordova ARC plugin for the Facebook SDK
94 stars 43 forks source link

Is there an FB.Event.monitor('auth.statusChange', function(session) ) equivalent? #11

Open rbahumi opened 11 years ago

rbahumi commented 11 years ago

Hi,

I ran a small experiment with the plugin, trying to call dialog('feed') after a call to logout. The results were that the plugin has stopped functioning afterwards. I tried calling login again, but that didn't do anything.

I guess that according the normal flow of things, this shouldn't happen. But what if the token has been expired, or if the user had deauthorise my app?

  1. Should I call login before any call to the dialog?
  2. Is there an FB.Event.monitor('auth.statusChange', function(session) ) equivalent that notifies when the user's status changes?

Regards, Roei.

rbahumi commented 11 years ago

Below are some extra details. This is my index.html:

<head>

<script type="text/javascript" src="js/cordova-2.0.0.js"></script>
<script type="text/javascript" src="js/plugins/FacebookConnect.js"></script>
<script type="text/javascript" src="js/jquery.min.1.7.1.js"></script>
<script>

    var APP_ID = '352872202215';
    document.addEventListener('deviceready', bar, false);

    function bar(){
        //alert('deviceready');
        facebookConnect = window.plugins.facebookConnect;
    }

    function login(){
        alert('login');

        facebookConnect.login({permissions: ["email", "user_about_me"], appId: APP_ID}, 
                function(result) {
                          console.log("FacebookConnect.login:" + JSON.stringify(result));

                          // Check for cancellation/error
                          if(result.cancelled || result.error) {
                            console.log("FacebookConnect.login:failedWithError:" + result.message);
                            return;
                          }
                          else console.log('succeeded!');
              });

    }
        function logout(){
            alert('logout!');
            facebookConnect.logout(function(response){
                console.log("FacebookConnect.logout:" + JSON.stringify(response));
            });
        }
            function post(){
                alert('post!');
                          // Feed dialog example
                          var dialogOptions = {
                                method: 'feed',
                                //app_id: APP_ID,
                                name: 'roei',
                                link: 'https://surf-space.com/spots/israel',
                                description: 'stuff...',
                                picture: 'http://fbrell.com/f8.jpg'
                                }

                          facebookConnect.dialog('feed', dialogOptions, function(response) {
                                console.log("FacebookConnect.dialog:" + JSON.stringify(response));
                          });

            };

</script>
</head>

<body>
    <button type="button" id="login" data-inline="false" onclick="login();">login</button>
    <button type="button" id="post" data-inline="false" onclick="post();">post</button>
    <button type="button" id="logout" data-inline="false" onclick="logout();">logout</button>
</body>
</html>

This is the console.log output after calling logout:

2012-08-20 23:00:47.076 surf_space[3893:c07] -[FacebookConnect facebook] 
[Line 32] ERROR: You must provide a non-empty appId.
2012-08-20 23:00:47.079 surf_space[3893:c07] PluginResult:toJSONString - 
{"status":1,"message":"OK","keepCallback":false}
2012-08-20 23:00:47.080 surf_space[3893:c07] PluginResult 
toSuccessCallbackString: cordova.callbackSuccess('FacebookConnect2',
{"status":1,"message":"OK","keepCallback":false});
2012-08-20 23:00:47.081 surf_space[3893:c07] [INFO] FacebookConnect.logout:"OK"

Please note that if I run login again, everything works as expected. But, when calling the dialog('feed') right away after logout, this is the console.log output:

2012-08-20 23:10:49.982 surf_space[3893:c07] -[FacebookConnect facebook] 
[Line 32] ERROR: You must provide a non-empty appId.
2012-08-20 23:10:49.983 surf_space[3893:c07] *** WebKit discarded an uncaught 
exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: 
delegate: <NSInvalidArgumentException> *** -[CDVJKDictionary setObject:forKey:]: 
attempt to insert nil value (key: app_id)

And the plugin doesn't recover from that....

rbahumi commented 11 years ago

Another thing, I am running these tests on an iPhone 5.1 simulator without a facebook app installed.

All authentications are going directly to the Safari browser.

mgcrea commented 11 years ago
  1. You should clearly login before doing any other call. The app should not however (but it may crash in the facebook sdk part). I'll patch that.
  2. There is no statusChange event yet, but if it is provided by the facebook native sdk, it should be quite straightforward to implement (PR welcomed ;-)!)
dvdvck commented 11 years ago

Perhaps, you should call initWithAppId js method to verify a session active when the app starts or resumes