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
相关产品推荐
相关产品推荐

