当前位置: 首页 > 工具软件 > haXe > 使用案例 >

[HAXE] haxe接入IOS版FacebookSdK以及iOS开发遇到的问题总结(二)

沈嘉瑞
2023-12-01

Extension与Haxe项目交互

haxe提供了类似JNI的方法,来调用extension中的函数。
Lib.load(“命名空间”,”函数名”,”参数个数”);

extension接口文件:

namespace mm{

    Facebook* face;
    AutoGCRoot *eval_onEvent = 0;
static value set_event_callback( value onCall ){
    face =[[Facebook alloc] init];
    eval_onEvent = new AutoGCRoot( onCall );
    return alloc_bool( true );
}
DEFINE_PRIM( set_event_callback , 1 );


static void FBLogin_method(value login_callback){
    [face loginFunc: val_string(login_callback)];
}
DEFINE_PRIM (FBLogin_method, 1);


void hypfb_dispatch_event( const char *sType , const char *sArg1 , const unsigned char *sArg2,int i  ){
        printf("回调输出%s,%s\n", sType,sArg2);
        buffer _buff = alloc_buffer_len(0);
        if(sArg2!=nil){
            buffer_append_sub(_buff,(char *)sArg2,i);
        }

        val_call3(
                    eval_onEvent->get( ) ,
                    alloc_string( sType ) ,
                    alloc_string( sArg1 ) ,
                    buffer_val(_buff)
                );
    }
}

haxe中的调用部分

private static var set_callback_method = Lib.load ("mm", "set_event_callback", 1);
public function init(){
        set_callback_method(callback);
    }

    private function callback(methodID:String,arg1:String,arg2:Dynamic){
        trace(“IOS回调"+ methodID:String +”,”+argument1+”,”+argument2);
    }

haxe中的代码先通过set_callback_method将回调的callback传递给接口文件中的eval_onEvent,之后通过指定的methodID在callback函数中进行回调处理。

extension中oc++与接口交互

在接口文件赋值回调函数的同时也实例化了Facebook类,Facebook类用于实现了FacebookSDK的功能。
facebook类中函数调用以及回调示例如下:

-(void)loginFunc:(const char*)callbackFunc{

    NSLog(@"facebook登陆开始执行");
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login logInWithReadPermissions: @[@"public_profile",@"user_friends"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error){
        if(error){
            NSLog(@"facebook登陆失败");
            // mm::hypfb_dispatch_event(callbackFunc,"false",nil,0);
        }else if(result.isCancelled){
            NSLog(@"facebook取消登陆");
            // mm::hypfb_dispatch_event(callbackFunc,"false",nil,0);
        }else{
            // mm::hypfb_dispatch_event(callbackFunc,"true",nil,0);

        }
    }];
}

遇到的问题:

  • 回调haxe的参数,在接口文件中参数类型是模糊类型value,oc的数据怎么传回haxe项目中,一直在头疼中。。
  • 如果在extension中要使用子线程要注意线程冲突,dispatch_async(dispatch_get_main_queue(), ^{ });
    haxe调试真心很不方便
  • 还有就是ios不提供设备标识符,所以在网上找了一个解决方案,用ios的钥匙串来保存,KeyChainDemo的链接:https://github.com/tenric/KeyChainDemo
 类似资料: