You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cordova iOS:Facebook原生应用回调返回异常问题咨询

解决Cordova自定义插件中Facebook登录回调的传递问题

我之前做过类似的Cordova+Facebook登录集成场景,刚好能帮到你!针对你描述的流程,核心是要把Facebook登录完成后的回调从原生插件层传递到Cordova的JS页面,具体实现步骤如下:

1. 在原生插件类中处理Facebook回调并转发到Cordova

首先确保你的FBLoginViewController.m继承自CDVPlugin(而不是普通的UIViewController),这样才能使用Cordova的插件上下文来触发JS回调。在你的fbLoginMethod方法里,保存Cordova的命令对象,并在Facebook登录的完成回调中调用Cordova的回调方法:

#import <Cordova/CDV.h>

@interface FBLoginViewController : CDVPlugin
@property (nonatomic, strong) CDVInvokedUrlCommand *loginCommand;
@end

@implementation FBLoginViewController

- (void)fbLoginMethod:(CDVInvokedUrlCommand*)command {
    // 保存当前命令对象,用于后续回调
    self.loginCommand = command;
    
    // 调用Demo.framework中的FBLoginManage启动登录
    [[FBLoginManage sharedInstance] startFBLoginWithCompletion:^(BOOL success, NSString *accessToken, NSError *error) {
        CDVPluginResult *pluginResult;
        
        if (success && accessToken) {
            // 登录成功,组装结果字典返回给JS
            NSDictionary *result = @{
                @"status": @"success",
                @"accessToken": accessToken
            };
            pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:result];
        } else {
            // 登录失败或取消,返回错误信息
            NSString *errorMsg = error ? error.localizedDescription : @"用户取消登录";
            pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:errorMsg];
        }
        
        // 将结果发送回Cordova的JS层
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }];
}

@end

2. 在Cordova项目的JS层接收回调

在你的index.html中,修改按钮的onClick方法,调用Cordova的exec方法并传入成功/失败回调函数:

<button onclick="startFBLogin()">Facebook 登录</button>

<script type="text/javascript" src="cordova.js"></script>
<script>
function startFBLogin() {
    // 调用自定义插件:参数依次是成功回调、失败回调、插件名称、方法名称、参数数组
    cordova.exec(
        function(successData) {
            // 登录成功的处理逻辑
            console.log("Facebook登录成功:", successData);
            alert("登录成功!Token: " + successData.accessToken);
        },
        function(errorMsg) {
            // 登录失败的处理逻辑
            console.error("Facebook登录失败:", errorMsg);
            alert("登录失败:" + errorMsg);
        },
        "FBLoginPlugin", // 插件名称,要和plugin.xml中一致
        "fbLoginMethod", // 要调用的原生方法名
        [] // 传递给原生方法的参数,这里不需要传参所以是空数组
    );
}
</script>

3. 检查插件配置和AppDelegate的URL转发

  • 确保你的plugin.xml中正确声明了插件:
    <plugin id="cordova-plugin-fblogin" version="1.0.0">
        <name>FBLoginPlugin</name>
        <platform name="ios">
            <config-file target="config.xml" parent="/*">
                <feature name="FBLoginPlugin">
                    <param name="ios-package" value="FBLoginViewController" />
                </feature>
            </config-file>
            <source-file src="src/ios/FBLoginViewController.m" />
            <!-- 别忘了引入你的Demo.framework -->
            <framework src="path/to/Demo.framework" embed="true" />
        </platform>
    </plugin>
    
  • 在AppDelegate.m中确保URL被正确转发给Facebook SDK和Cordova:
    #import <FBSDKCoreKit/FBSDKCoreKit.h>
    
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
        // 先让Facebook SDK处理登录回调URL
        BOOL fbHandled = [[FBSDKApplicationDelegate sharedInstance] application:app openURL:url options:options];
        // 如果Facebook没处理,再交给Cordova处理
        if (!fbHandled) {
            fbHandled = [super application:app openURL:url options:options];
        }
        return fbHandled;
    }
    

这样一来,当用户通过Facebook原生应用完成登录验证后,回调会先回到FBLoginManage的完成闭包,然后通过Cordova的插件机制传递到JS层,你就能在index.html里处理登录结果了。

内容的提问来源于stack exchange,提问作者sachin khaire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:15:42