Jump to content

[TOPIC: topicViewTemplate]
[GLOBAL: userSmallPhoto]
Photo

Facebook frustrations
Started by Rob Miracle Jul 27 2013 12:33 PM

90 replies to this topic
[TOPIC CONTROLS]
Page 2 of 4 1 2 3 4
This topic has been archived. This means that you cannot reply to this topic.
[/TOPIC CONTROLS]
[modOptionsDropdown]
[/modOptionsDropdown]
[reputationFilter]
[TOPIC: post.html]
#26

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

I'll ask.  Do you have to have the native app (since it's a kiosk, you can control its existence) and just do your FB work through the browser?



[TOPIC: post.html]
#27

mgartner

[GLOBAL: userInfoPane.html]
mgartner
  • Observer

  • 25 posts
  • Corona SDK

Well, it's run as a kiosk, but it's a commercial product, so I am not really in control of the user's devices this will be running on. Most users will have the native app installed, so I forsee a lot of headaches if I make uninstalling it a requirement. I actually don't need to do anything but ask the user for their login credentilas inside of the corona app, log in to FB, grab the token and immediately log out.  No other FB interaction is necessary.  It's a client server setup with a upd connection to the server, so I return the token to the server and the uploading to FB happens on a pc.  I just need to be able to logout of FB so the next person can log in.  I am willing to make it worth their while so to speak, as it's the only thing holding up the release of the product and the thought of starting from scratch to make a native app on both platforms is not something I am looking forward to doing.  So if it comes to that, I can chat offline about what it would take.



[TOPIC: post.html]
#28

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

Can you provide me information on other apps you've seen do this?  Are there any references you've seen on facebook to think this is possible?



[TOPIC: post.html]
#29

dchan

[GLOBAL: userInfoPane.html]
dchan
  • Contributor

  • 360 posts
  • Corona Staff

[TOPIC: post.html]
#30

mgartner

[GLOBAL: userInfoPane.html]
mgartner
  • Observer

  • 25 posts
  • Corona SDK

I recall being able to log out of the native FB app back when I was doing Phone Gap apps, but in looking for example iOS apps, I have found that the apps that are doing what I'm trying to do are using a popup window to ask for the FB login credentials and not using the native app.  So, yes, not doing it with the native app is fine as long as I can not automatically launch the native FB app and use a browser dialog even if the native app is installed.

 

An example of an app that is doing exactly what I am doing is: https://itunes.apple.com/us/app/picpic-social/id611055461?mt=8&uo=4



[TOPIC: post.html]
#31

mgartner

[GLOBAL: userInfoPane.html]
mgartner
  • Observer

  • 25 posts
  • Corona SDK

And here's how phonegap does it.  https://github.com/phonegap/phonegap-facebook-plugin

 

They are using the FB Javascript SDK

 

https://github.com/phonegap/phonegap-facebook-plugin/blob/master/www/facebook-js-sdk.js

 

/**
* Logout the user in the background.
*
* Just like logging in is tied to facebook.com, so is logging out -- and
* this call logs the user out of both Facebook and your site. This is a
* simple call:
*
* FB.logout(function(response) {
* // user is now logged out
* });
*
* NOTE: You can only log out a user that is connected to your site.
*
* @access public
* @param cb {Function} The callback function.
*/
  logout: function(cb) {
    FB.ui({ method: 'auth.logout', display: 'hidden' }, cb);
  }
 
 

- (void) logout:(CDVInvokedUrlCommand*)command
{
    if (!FBSession.activeSession.isOpen) {
        return;
    }
    
    // Close the session and clear the cache
    [FBSession.activeSession closeAndClearTokenInformation];
    
    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}


[TOPIC: post.html]
#32

mgartner

[GLOBAL: userInfoPane.html]
mgartner
  • Observer

  • 25 posts
  • Corona SDK

Any luck checking out that other app and/or seeing how the Phonegap plugin works to allow for a dialog to login and still manages to logout?



[TOPIC: post.html]
#33

davemikesell

[GLOBAL: userInfoPane.html]
davemikesell
  • Contributor

  • 527 posts
  • Corona SDK

I hope people are not forgetting about the sample code that comes with Corona.   I copied a couple snippets from the sample code and got an image, along with episode, level, and score, posted to Facebook pretty easily from Android.

 

Question about iOS, though.   It appears that on the Facebook Dev portal, I have to specify my App Store ID to get this working.   Well, my game isn't in the app store yet, because I don't have Facebook posting working for iOS.

 

Seems like a catch-22 to me.   Do I have to release a first version to the app store without the Facebook stuff, then a subsequent release with it?    



[TOPIC: post.html]
#34

aukStudios

[GLOBAL: userInfoPane.html]
aukStudios
  • Corona Geek

  • 1,003 posts
  • Corona SDK

@davemikesell, You don't need to release your app on the App Store to get an iOS app store id. You get the id just by setting up the app in the iOS provisioning portal followed by in iTunes Connect. Hope this helps. - Andrew

[TOPIC: post.html]
#35

davemikesell

[GLOBAL: userInfoPane.html]
davemikesell
  • Contributor

  • 527 posts
  • Corona SDK

I've done that.   Noticed from the sample app that my build.settings didn't include the FB app ID (does that need to be prefixed by fb?), so I added that, but still not working.  The listener is not getting called after facebook.login() (this is working on Android for me).   

 

Also, on the Facebook portal, should the bundle ID include the prefix, or just the com.company.appname?

 

Finally, I'm using a developer provisioning profile.   Maybe I need to create and use a distribution profile.



[TOPIC: post.html]
#36

davemikesell

[GLOBAL: userInfoPane.html]
davemikesell
  • Contributor

  • 527 posts
  • Corona SDK

Success.   I followed the instructions at the link below and can now post to FB from iOS.    Holy crap, I may be able to release this thing :-)

 

http://www.coronalabs.com/blog/2013/07/30/understanding-facebook-authentication/



[TOPIC: post.html]
#37

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

Just a clarification:  The facebook.* API calls needs an AppID provided by Facebook when you create your app on their developer portal (http://developers.facebook.com).  

 

To setup an iOS native app, they want the iTunes connect App ID Number so they can fetch information about your app to show in their displays.  This is really not needed during testing, so you can use the iTunes App ID number (not your app bundle ID)  of any live app, just  make sure to update it to yours after your app pushes live.



[TOPIC: post.html]
#38

davemikesell

[GLOBAL: userInfoPane.html]
davemikesell
  • Contributor

  • 527 posts
  • Corona SDK

I think I'm set there, Rob.  I'm using the iTunes Connect app id.

 

Just got Twitter working, too, using the sample app code.    

 

There has yet to be created a device that can measure the awesomeness of Corona.

 

:wub:



[TOPIC: post.html]
#39

yosu

[GLOBAL: userInfoPane.html]
yosu
  • Contributor

  • 511 posts
  • Corona SDK

Dear Rob,

 

Thanks for making time to sort out these issues. My facebook login worked previously (~2 months ago during my initial test), but now, it doesn't. I am testing it back on the sample app, 'facebook'. It works on an Android device (with a Facebook app installed), but not on Xcode Simulator (iOS 6.1).

 

What I have done. I setup my facebook based on "http://docs.coronalabs.com/guide/social/setupFacebook/index.html#iosbuild". I inserted the "Bundle ID" (e.g. com.myWeb.app),  the "iPhone App Store ID" at "409807569". "Facebook Login" and "Deep Linking" are enabled.

 

 

 

 

My problem is that, everytime I try to facebook-login, safari appears for a few seconds, then it goes back to the app with a failed-login. If i select "Show Dialog", a native window appears and ask for Facebook-login credentials. If I enter facebook in there, i am able to post something to my facebook-wall. Login on "Show Dialog" will not have any effect on the corona API Facebook-login (meaning if I am able to login on "Show Dialog", I am still not logged in on the corona facebook-API).

 

 

The error shown is as below (taken from console) :

 

9/29/13 8:15:44.925 PM Facebook4[7752]: Facebook (original) Listener events:
9/29/13 8:15:44.925 PM Facebook4[7752]:    type(session)
9/29/13 8:15:44.926 PM Facebook4[7752]:    name(fbconnect)
9/29/13 8:15:44.926 PM Facebook4[7752]:    phase(loginFailed)
9/29/13 8:15:44.926 PM Facebook4[7752]:    isError(true)
9/29/13 8:15:44.927 PM Facebook4[7752]:    response(The operation couldn’t be completed. (com.facebook.sdk error 2.))
9/29/13 8:15:44.927 PM Facebook4[7752]: event.name	fbconnect
9/29/13 8:15:44.927 PM Facebook4[7752]: event.type:	session
9/29/13 8:15:44.928 PM Facebook4[7752]: isError: true
9/29/13 8:15:44.928 PM Facebook4[7752]: didComplete: nil
9/29/13 8:15:44.928 PM Facebook4[7752]: Session Status: loginFailed

 

 

 

 

build-settings (last 2-digits is masked with xx) :

 

settings =
{
	orientation =
	{
		default = "portrait",
		supported = { "portrait" }
	},
	android =
	{
		usesPermissions =
		{
			"android.permission.INTERNET",
		},
	},
	iphone =
	{
		plist =
		{
			CFBundleIconFile = "Icon.png",
			CFBundleIconFiles =
			{
				"Icon.png", 
				"Icon@2x.png", 
				"Icon-72.png", 
				"Icon-72@2x.png", 
			},
			UIApplicationExitsOnSuspend = false,	-- must be false for single sign-on to work
			FacebookAppID = "3455772522396xx",	-- replace XXXXXXXXX with your facebook appId

			CFBundleURLTypes =
			{
				{
					CFBundleURLSchemes =
					{
						"fb3455772522396xx",	-- replace XXXXXXXXX with your facebook appId
						
					}
				}
			}
		}
	}
}



[TOPIC: post.html]
#40

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

I did a quick Google on "com.facebook.sdk error 2" to see what thats about.   A couple of common things came up.  Are you in "sandbox mode"?  If so, turn it off.  Make sure your bundle ID is the same (I think it's case sensitive).  Others reported problems with the simulator, have you tried it on device yet?   There is also the realistic issue that it is a real timeout from Facebook too.

 

Others report interaction problems with the device's build in facebook support, but I don't believe that's a real issue.  The Simulator is really pokey and I'd like to know how this behaves on device instead of in the Xcode simulator.



[TOPIC: post.html]
#41

yosu

[GLOBAL: userInfoPane.html]
yosu
  • Contributor

  • 511 posts
  • Corona SDK

Dear Rob,

 

Spot On! It worked on my device, iOS7-beta iPad (with facebook app installed). Not sure why it did not work on my Xcode simulator (still on iOS6.1). 

 

I will further test it out by un-installing the facebook app on the iPad to see how it performs.



[TOPIC: post.html]
#42

krystian6

[GLOBAL: userInfoPane.html]
krystian6
  • Contributor

  • 560 posts
  • Corona SDK

I know this thread is pretty old, but I was just wondering, if anyone had problems with performing facebook.login, when user has removed the app from facebook?

Currently it looks like corona is caching some of the responses, and just returns them just like that.

After I have removed the app from Facebook, I called facebook.login and got a proper response, then I called facebook.request(/me .... ) and also got a successful response [the same calls were made before I removed the app from facebook].

Now when I try to use the same access token in browser/somewhere else I will get an oauth error.

Of course, if I will try to issue a new request to facebook using corona, I will get a fbConnect error.

 

This is quite frustrating, because to check if user is REALLY logged in, I have to create my own request to facebook :/



[TOPIC: post.html]
#43

editor

[GLOBAL: userInfoPane.html]
editor
  • Contributor

  • 101 posts
  • Corona SDK

Hi Rob,

 

I started my own thread but have just read yours.  Here are the answers to your questions:

 

Platform where you having the problem? iOS or Android (include version number)?

 

Android not sure what version but I have a brand new galaxy s4 mini and also using latest Bluestacks emulator

 

 

Version of Corona SDK you are using?

2013.1202

 


What Facebook operation are you trying to do?

What permissions does your activity need?

 

     facebook.login( fbAppId, facebookListener), {"publish_stream"} )
 

Post your build.settings file

 

settings =
{

    iphone = {
        plist = {

            UIApplicationExitsOnSuspend = false,

            FacebookAppID = "188128428059002",  --replace XXXXXXXXXX with your Facebook App ID

            CFBundleURLTypes = {
                {
                CFBundleURLSchemes = { "fb188128428059002", }  --replace XXXXXXXXXX with your Facebook App ID
                }
            },
            
            ["URL types"] = {
                item = {
                    ["URL Schemes"] =
                        { ["Item 0"] = "fb188128428059002" },  --replace XXXXXXXXXX with your Facebook App ID
                },
            },            
        }
    },
    
    android =
    {
    versionCode = "1",
    installLocation="preferExternal"
    },

    androidPermissions =
    {
       "android.permission.READ_PHONE_STATE",
       "android.permission.ACCESS_NETWORK_STATE",
       "android.permission.VIBRATE",
       "android.permission.INTERNET",
        "android.permission.ACCESS_WIFI_STATE",    
        "android.permission.ACCESS_FINE_LOCATION",
        "android.permission.ACCESS_COARSE_LOCATION",        
        },


    plugins =
    {
      --key is the name passed to Lua's 'require()'
     ["CoronaProvider.native.popup.social"] =
      {
        --required
        publisherId = "com.coronalabs", -- don't change, is't the publisher of the plugin
      },
      
      
        -- key is the name passed to Lua's 'require()'
        ["CoronaProvider.ads.admob"] =
        {
            -- required
            publisherId = "com.coronalabs", -- don't change, it's the publisher of the plugin
        },
        
        -- key is the name passed to Lua's 'require()'
        ["CoronaProvider.ads.vungle"] =
        {
            -- required
            publisherId = "com.vungle",
        },
        
    },

  orientation =
    {
        default = "portrait",
        supported =
        {
        "portrait",
        },
                    
    },
    


}

 

 

 

As mentioned in my other thread, I get no error messages in adb.  Here are the event details I get:

 

I/Corona  (19706): event.name   fbconnect
I/Corona  (19706): event.type:  session
I/Corona  (19706): isError: false
I/Corona  (19706): didComplete: nil
I/Corona  (19706): response :
I/Corona  (19706): phase : loginCancelled

 

I read in another forum that calling facebook.logout could make this work, so I tried that but it didn't.

 

How are we getting a "loginCancelled" phase?  This happens both on my Galaxy Mini and the BlueStacks emulator.

 

thanks



[TOPIC: post.html]
#44

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

I know there were changes between 1202 and 1260 (and the G2.0 builds and later)

 

You may need to upgrade  to 2100 to address this.

 

Rob



[TOPIC: post.html]
#45

editor

[GLOBAL: userInfoPane.html]
editor
  • Contributor

  • 101 posts
  • Corona SDK

hi rob,

 

okay i'll give that a go.

 

With all the flood of information and forum posts it's hard to keep track of what's current and what's not.

 

Do we still need a basic facebook login before logging in with permissions?

 

or can I just do thisas my first call to facebook:

 

   facebook.login( fbAppId, facebookListener, {"publish_stream"} )
 

 

function facebookListener( event )

   if ( "session" == event.type ) then

        if ( "login" ~= event.phase ) then
            facebookAlert("Facebook failed!", "Please try again")
            return
        end

        facebook.request("me/feed", "POST"  , {message = message} )
...

 

thanks



[TOPIC: post.html]
#46

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

If things work like we want them to, you should only have to call facebook.login() once with the caveat that if the token expires you may have to call it again to re-login.  So generally you should probably call it when you resume from a suspend event.

 

Rob



[TOPIC: post.html]
#47

krystian6

[GLOBAL: userInfoPane.html]
krystian6
  • Contributor

  • 560 posts
  • Corona SDK

Hello Rob,

 

I wish it was that simple

 

In case of Android with Facebook app installed:

When you are in your game and user will remove the app from Facebook, the next time you do a facebook.login, you will receive the response as usual, without any errors. When you will try to perform facebook.request, you will receive an error:

type - request

name - fbconnect

isError - true

 

Immediately after that, you will also receive this:

type - session

name - fbconnect 

phase - logout

isError - false

 

If you issue a new facebook.login, user will be asked for permissions etc. everything will work fine, not however, that in order to get to this point, you have to perform facebook.login TWICE. First time will end up with a logout, second time will end up with a logged in user or a cancellation.

 

In case of iOS with FB app installed it works a little bit different

 

The first part is the same: you issue facebook.login, you receive everything as usual, you issue facebook.request and you receive the error as described above. Unfortunately this is where everything ends. There's no automatic logout.

What's better, you cannot just do it on your own and issue facebook.logout hoping for the best. You cannot issue facebook.login as well, simply because both of them will yiled no results.

 

You have to create a timer, [in my case 1 second was enough] and issue facebook.logout manually. Now this call does not return anything, but from my experience and testing I performed yesterday, it is necessary.

After this, I create another timer, 3 second was enough in my case, and I do a facebook.login. This time it will work and user will be asked for permissions.

Unfortunately, this ends with application crashing, however the next time user opens up the app - they are logged in [or not if they chose not to log in].

Because this is a very rare case that someone will remove the app from facebook while playing the game, I decided that the app crash is not a showstopper [also, because there's nothing more I can do using Corona, and I am not ready to switch to my own fb handling - I'll do so with my next app].

 

Anyway... here are my experiences with the app I'm developing. 

 

I'll let you know if there's something else going on without the fb app installed.



[TOPIC: post.html]
#48

editor

[GLOBAL: userInfoPane.html]
editor
  • Contributor

  • 101 posts
  • Corona SDK

Hi Rob,

 

I've upgraded to 2100 and still the same events:

 

I/Corona  (11601): event.name   fbconnect
I/Corona  (11601): event.type:  session
I/Corona  (11601): isError: false
I/Corona  (11601): didComplete: nil
I/Corona  (11601): response :
I/Corona  (11601): phase : loginCancelled

 

I can confirm the upgrade because all the graphics were out of whack.

 

I'll post my code now in the hope that you or someone else might spot something.  Thanks for your time if you're able to.

 

regards

 

Daniel

 

 

facebook.lua (the function facebookPostStartGame() gets called from another file)

--------------

facebook = require( "facebook" )

fbAppId = "188128428059002"
facebook.publishInstall(fbAppID)

local LOGOUT = 1
local SHOW_DIALOG = 2
local POST_MSG = 3
local POST_PHOTO = 4
local GET_USER_INFO = 5
local GET_PLATFORM_INFO = 6

local facebookMessage = ""



function facebookListener( event )

    print( "event.name", event.name )  --"fbconnect"
    print( "event.type:", event.type ) --type is either "session", "request", or "dialog"
    print( "isError: " .. tostring( event.isError ) )
    print( "didComplete: " .. tostring( event.didComplete ) )
    print("response : " .. tostring(event.response))
    print("phase : " .. tostring(event.phase))        -- tjn Added

    --"session" events cover various login/logout events
    --"request" events handle calls to various Graph API calls
    --"dialog" events are standard popup boxes that can be displayed

   if ( "session" == event.type ) then

        if ( "login" ~= event.phase ) then
            facebookAlert("Facebook failed!", "Please try again")
            return
        end

        print(access_token)
        access_token = event.token

        if fbCommand == GET_USER_INFO then
            facebook.request("me")
        elseif fbCommand == POST_MSG then
            facebook.request("me/feed", "POST"  , {message = message} )
        end
    elseif ( "request" == event.type or "dialogue" == event.type ) then
        local response = event.response

        print("Response: ",response)

        if ( not event.isError ) then
            if fbCommand == GET_USER_INFO then
                response = json.decode( event.response )
            elseif fbCommand == POST_MSG then
                facebookAlert("Facebook Successful", "You've successfully shared your score!")
            end
        else
            facebookAlert("Facebook failed!", "Please try again")
        end
    end
end

function facebookAlert(popupTitle,popupMessage)
    native.showAlert( popupTitle, popupMessage, {"OK"} )
end

function postToWall(msg)
    message = msg
    fbCommand = POST_MSG
    
    print("initial login")
--    facebook.login( fbAppId, facebookListener)
--    print("logout")
--    facebook.logout()
--    print("login with permissions")
   facebook.login( fbAppId, facebookListener, {"publish_stream"} )
end

function shareGame()
    message = "The Best Cricket Game Ever http://www.bestcricketgame.com"
    fbCommand = POST_MSG
    facebook.login( fbAppId, facebookListener, {"publish_stream"} )
end

function facebookPostStartGame()

    message = "TESTING 123 PLEASE IGNORE I've just started The Best Cricket Game Ever.  My team .. " .. playerTeam .. " is up against " .. computerTeam .. ".  " .. tossWonBy
    .. " won the toss and elected to " .. tostring(getTossChoice()) .. " on a "
    if pitchType == 1 then
        message = message .. " great batting wicket."
    elseif pitchType == 2 then
        message = message .. " pitch that will assist both batters and bowlers."
    elseif pitchType == 3 then
        message = message .. " great bowling wicket."
    end
    
    message = message .. "  The players are now off to the middle to start the action.  If you'd like to play, visit http://www.bestcricketgame.com or search for 'The Best Cricket Game Ever' in the App Store or Google Play."
    
    postToWall(message)
end
 

 

 

 

------------

 

And my build.settings

 

--------------------------

 

settings =
{

    iphone = {
        plist = {

            UIApplicationExitsOnSuspend = false,

            FacebookAppID = "188128428059002",  --replace XXXXXXXXXX with your Facebook App ID

            CFBundleURLTypes = {
                {
                CFBundleURLSchemes = { "fb188128428059002", }  --replace XXXXXXXXXX with your Facebook App ID
                }
            },
            
            ["URL types"] = {
                item = {
                    ["URL Schemes"] =
                        { ["Item 0"] = "fb188128428059002" },  --replace XXXXXXXXXX with your Facebook App ID
                },
            },            
        }
    },
    
    android =
    {
    versionCode = "1",
    installLocation="preferExternal"
    },

    androidPermissions =
    {
       "android.permission.READ_PHONE_STATE",
       "android.permission.ACCESS_NETWORK_STATE",
       "android.permission.VIBRATE",
       "android.permission.INTERNET",
        "android.permission.ACCESS_WIFI_STATE",    
        "android.permission.ACCESS_FINE_LOCATION",
        "android.permission.ACCESS_COARSE_LOCATION",        
        },


    plugins =
    {
      --key is the name passed to Lua's 'require()'
     ["CoronaProvider.native.popup.social"] =
      {
        --required
        publisherId = "com.coronalabs", -- don't change, is't the publisher of the plugin
      },
      
      
        -- key is the name passed to Lua's 'require()'
        ["CoronaProvider.ads.admob"] =
        {
            -- required
            publisherId = "com.coronalabs", -- don't change, it's the publisher of the plugin
        },
        
        -- key is the name passed to Lua's 'require()'
        ["CoronaProvider.ads.vungle"] =
        {
            -- required
            publisherId = "com.vungle",
        },
        
    },

  orientation =
    {
        default = "portrait",
        supported =
        {
        "portrait",
        },
                    
    },
    


}

-------------------------

 

thx

 

Daniel



[TOPIC: post.html]
#49

Rob Miracle

[GLOBAL: userInfoPane.html]
Rob Miracle
  • Moderator

  • 25,461 posts
  • Enterprise

This thread is kinda long, so help me out, @editor are you sure your hashkey is right? 

 

Rob



[TOPIC: post.html]
#50

editor

[GLOBAL: userInfoPane.html]
editor
  • Contributor

  • 101 posts
  • Corona SDK

Hi Rob,

 

From what I've read a few people have had problems with characters being replaced by other characters when they shouldn't.  But I think they also had error messages that specifically mentioned the hashkey problem.    I don't have any error message to go on at all, just a loginCancelled event.

 

Copy/Paste from Facebook my hash is:

qMSzTuC5qly67dJxDMzrToeQRHw=
 
I've tried to find out what I'm comparing it to, but the Corona documenation is now outdated as facebook has updated their site
 
the link
no longer works.
 
How can I work out what I'm meant to be comparing it to?
 
thanks



[topic_controls]
Page 2 of 4 1 2 3 4
 
[/topic_controls]