使用Android上的新AppID更新Facebook SDK会话(使用Cordova / PhoneGap)

时间:2015-02-14 11:10:01

标签: android cordova facebook-android-sdk android-facebook

我们有一个适用于Android的Cordova / PhoneGap应用程序,用户可以使用PhoneGap Facebook Connect插件(https://github.com/Wizcorp/phonegap-facebook-plugin)使用他们的Facebook帐户登录。

但是,每次用户在设置中更改国家/地区时,我们都需要以编程方式使用新的AppId / AppName更新Facebook会话,因为我们为每个国家/地区设置了不同的Facebook应用。

我们可以使用它创建一个连接到Phonegap Facebook Connect插件的自定义插件,每当用户更改国家或尝试使用Facebook登录时调用该插件:

package com.OURAPP.facebook;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaArgs;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.json.JSONException;

import android.app.Activity;

import com.facebook.Session;

public class FacebookConnectMultiPlugin extends CordovaPlugin {

    private Activity context;

     @Override
     public void initialize(CordovaInterface cordova, CordovaWebView webView) {
         context = cordova.getActivity();
     }

    @Override
    public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext)  throws JSONException {
        if (action.equals("changeAppId")) {
            String appId = args.getString(0);
            Session session = new Session.Builder(context).setApplicationId(appId).build();
            Session.setActiveSession(session);
            callbackContext.success();
            return true;
        } else {
            return false;
        }
    }
}

然而,在将Phonegap Facebook Connect更新到最新版本(现在它使用新的Facebook SDK)后,我们的自定义插件停止工作,我们无法弄清楚出了什么问题。

TL;博士

如果有帮助,我们在iOS上遇到了同样的问题,但我们可以解决它。在那种情况下,我们缺少更新Facebook AppName,但是,我们无法在Android上找到任何方法。

这是我们的旧代码:

#import "FacebookConnectMultiPlugin.h"
#import <FacebookSDK/FacebookSDK.h>

@interface FacebookConnectMultiPlugin ()

@property (strong, nonatomic) NSString *appid;

@end

@implementation FacebookConnectMultiPlugin

- (void)changeAppId:(CDVInvokedUrlCommand*)command
{
    CDVPluginResult* pluginResult = nil;
    NSString* myarg = [command.arguments objectAtIndex:0];

    NSLog(@"This is the app id: %@", myarg);

    FBSession *session = [[FBSession alloc] initWithAppID:myarg
        permissions:nil
        defaultAudience:FBSessionDefaultAudienceFriends
        urlSchemeSuffix:nil
        tokenCacheStrategy:nil];

    [FBSession setActiveSession:session];

    if (myarg != nil) {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    } else {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Arg was null"];
    }

    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}

@end

这是新代码:

#import "FacebookConnectMultiPlugin.h"
#import <FacebookSDK/FacebookSDK.h>

@interface FacebookConnectMultiPlugin ()

@property (strong, nonatomic) NSString *appid;

@end

@implementation FacebookConnectMultiPlugin

- (void)changeAppId:(CDVInvokedUrlCommand*)command
{
    CDVPluginResult* pluginResult = nil;
    NSString* myarg = [command.arguments objectAtIndex:0];
    NSString* myDisplayName = [command.arguments objectAtIndex:1];

    NSLog(@"----------------------");
    NSLog(@"This is the app id: %@", myarg);
    NSLog(@"This is the display name: %@", myDisplayName);
    NSLog(@"----------------------");

    FBSession *session = [[FBSession alloc] initWithAppID:myarg
        permissions:nil
        defaultAudience:FBSessionDefaultAudienceFriends
        urlSchemeSuffix:nil
        tokenCacheStrategy:nil];

    [FBSession setActiveSession:session];

    [FBSettings setDefaultAppID:myarg];

    [FBSettings setDefaultDisplayName:myDisplayName];

    if (myarg != nil) {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    } else {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Arg was null"];
    }

    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}

@end

1 个答案:

答案 0 :(得分:1)

如果你有一个不同的Facebook应用程序,用户需要切换到,那么他们也需要授权该应用程序。如果他们已经登录,则需要通过致电Session.getActiveSession().closeAndClearTokenInformation()将其注销。

然后,您可以像使用Session.Builder一样构建会话,但是您必须使用OpenRequest打开它。了解session.openForRead的调用方式here

此外,您还必须使用UiLifecycleHelper并实现onActivityResult,您可以在此post中看到更详细的说明。