您的位置:首页 > Web前端 > JavaScript

js与oc间互相调用代码(含有部分支付统计分享)

2016-12-19 11:29 591 查看
.h代码:

@interface JSCallObjectCBridge : NSObject{

}

+ (void) JSCallObjectC:(NSMutableDictionary*) dict;
- (NSDictionary*) getJsonFromStr:(NSString*) json;
+ (JSCallObjectCBridge*) getInstance;
- (void) ObjectCCallJS:(NSString*) jsonStr;
-(void) applePaySuccess:(NSString*)productId;
- (UIViewController *)getCurrentVC;
- (void) shareSuccess;

@end

.mm代码:
#import <Foundation/Foundation.h>

#import "JSCallObjectCBridge.h"

#import "SDKTalkingData.h"
#import "SDKApplePay.h"
#import "SDKShare.h"

#import "scripting/js-bindings/manual/cocos2d_specifics.hpp"

@implementation JSCallObjectCBridge

//SDK命令号
static int const CMD_TALKINGDATA = 1001;
static int const CMD_LOG = 2001;
static int const CMD_APPLEPAY = 4001;
static int const CMD_MOBSHARE = 5001;

static JSCallObjectCBridge* instance = nil;

+ (JSCallObjectCBridge*) getInstance
{
if (!instance) {
instance = [JSCallObjectCBridge alloc];
[instance init];
}
return instance;
}

+ (void) JSCallObjectC:(NSString*) jsonStr
{
NSDictionary* dict = [[JSCallObjectCBridge getInstance] getJsonFromStr:jsonStr];
int cmd = [[dict objectForKey:@"cmd"] intValue];

switch (cmd) {
case CMD_TALKINGDATA:
[[SDKTalkingData getInstance] handlerEvent:dict];
break;
case CMD_LOG:

break;
case CMD_APPLEPAY:
[[JSCallObjectCBridge getInstance] appleDoPay:[dict copy]];
break;
case CMD_MOBSHARE:
[[SDKShare getInstance] handlerEvent:[dict copy]];
break;
default:
break;
}
}

-(void) appleDoPay:(NSDictionary *)dict{
NSString *appleProductId = nil;
appleProductId = [dict objectForKey:@"productId"];
NSLog(@"APPLE PAY %@,id:%@",dict,appleProductId);
[[SDKApplePay getInstance] requestProductsPay:appleProductId];
//======!!!!!购买时的调用方法
}

- (void) ObjectCCallJS:(NSString*) jsonStr
{
//NSString* msg = @"SDK.Test()";
ScriptingCore::getInstance()->evalString([jsonStr UTF8String]);
}
-(void) applePaySuccess:(NSString*)productId{
NSLog(@"applePaySuccess:%@",productId);
NSMutableDictionary* dict = [[[NSMutableDictionary alloc] init] autorelease];
[dict setObject:@"4001" forKey:@"cmd"];
[dict setObject:productId forKey:@"productId"];

NSString *jsonStr = [self getJsonStrFromDictonar:dict];

NSString *msg = [NSString stringWithFormat:@"SDK.HandlerCallJs(%@)",jsonStr];
NSLog(@"applePaySuccess:%@",msg);
[self ObjectCCallJS:msg];
}

- (void) shareSuccess{
NSMutableDictionary* dict = [[[NSMutableDictionary alloc] init] autorelease];
[dict setObject:@"5001" forKey:@"cmd"];

NSString *jsonStr = [self getJsonStrFromDictonar:dict];

NSString *msg = [NSString stringWithFormat:@"SDK.HandlerCallJs(%@)",jsonStr];
[self ObjectCCallJS:msg];
}

-(NSString*)getJsonStrFromDictonar:(NSMutableDictionary*)dict{
NSError * error = nil;
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
NSString * jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

return  jsonStr;
}

- (NSDictionary*) getJsonFromStr:(NSString*) json
{
//转换成二进制数据
NSData * data = [json dataUsingEncoding:NSUTF8StringEncoding];
//解析JSON文件 OC中自带的方法
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

return dict;
}

//获取当前屏幕显示的viewcontroller
- (UIViewController *)getCurrentVC
{
UIViewController *result = nil;

UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
{
if (tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}

UIView *frontView = [[window subviews] objectAtIndex:0];
id nextResponder = [frontView nextResponder];

if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
else
result = window.rootViewController;

return result;
}

@end


PS:上面的代码为oc部分的js与oc的桥文件。

下面代码部分为js部分的js与oc的调用文件(在这里也有js调用java的方法)
/*
需要回调的写在这里面
*/
HandlerCallJs:function(data){
var cmd = Number(data.cmd);
switch(cmd){
case CMD_LOG:
break;
case CMD_TALKINGDATA:
break;
case CMD_GOOGLEPAY:
//google支付回调
//data.productId(回调的key值)
ShopObj.buyCallBack(data.productId);
break;
case CMD_MOBSHARE:
//mobshare分享回调
NetWorkManager.sendfenxiang();
break;
default:
break;
}
},

JsCallJava:function(jsonStr){
//Js 调用 Java
var result = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/JSCallJavaBridge","LuaCallJava","(Ljava/lang/String;)Ljava/lang/String;",jsonStr);
cc.log("调用Java端成功" + result);
return result;
},

JsCallObject:function(jsonStr){
//Js 调用 Object
var result = jsb.reflection.callStaticMethod("JSCallObjectCBridge","JSCallObjectC:",jsonStr);
cc.log("调用OC端成功" + result);
},
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  js与oc间的调用