参考

环境:MAC,xCode11,CocosCreator2.3.1

有关CocosCreator与Object-C如何交互的问题,参考文章:

https://blog.csdn.net/ZFSR05255134/article/details/105587509

cocos creator 文档介绍

https://docs.cocos.com/creator/manual/zh/advanced-topics/oc-reflection.html

穿山甲SDK初始化

在xcode 编辑器中 AppController 类 中定义与实现 initCsjAdSDK 函数。

//初始化Csj SDK
-(void)initCsjAdSDK{NSLog(@"-------------------1 初始化Csj SDK");[BUAdSDKManager setAppID:@"应用id"];[BUAdSDKManager setIsPaidApp:NO];[BUAdSDKManager setLoglevel:BUAdSDKLogLevelDebug];
//    NSLog(<#NSString * _Nonnull format, ...#>);// 初始化激励视屏UIViewController *_csjAdReward= [[CsjAdReward alloc] init];[_viewController.view addSubview:_csjAdReward.view];}

调用SDK初始化

在 AppController 类 的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  函数中调用 initCsjAdSDK 函数。

    // 初始化Csj SDK[self initCsjAdSDK];

接入激励视屏。

定义 Object-C 头文件,CsjAdReward.h

代码如下:

@interface CsjAdReward  : UIViewController{
//    int countNum;
}
+(CsjAdReward *) getAdInstance;            //用来获取实例的方法
-(void) OpenAd;
-(void) testCallJs;
@end

实现 Object-C CsjAdReward 类

代码如下:


#import <Foundation/Foundation.h>
#import "CsjAdReward.h"
#import <BUAdSDK/BURewardedVideoModel.h>
#import <BUAdSDK/BUNativeExpressRewardedVideoAd.h>
//#import <BUAdSDK/BURewardedVideoAd.h>
//#import "AppController.h"
#import <BUAdSDK/BUAdSDKManager.h>
//
#import "CallJS.h"
//#import "RootViewController.h"
@interface CsjAdReward ()<BUNativeExpressRewardedVideoAdDelegate>
@property (nonatomic,strong) BUNativeExpressRewardedVideoAd *rewardedVideoAd;
@endstatic CsjAdReward *instance;    //这里声明一下静态实例,方便javascript层调用@implementation CsjAdReward//获取实例的方法,方便javascript层调用
+(CsjAdReward *) getAdInstance{return instance;
}//初始化,根着SDK文档照做就好了
- (void) viewDidLoad {NSLog(@"----------viewDidLoad");instance=self;//    [BUAdSDKManager setAppID:@"应用ID"];
//    [BUAdSDKManager setIsPaidApp:NO];
//    [BUAdSDKManager setLoglevel:BUAdSDKLogLevelDebug];BURewardedVideoModel *model=[[BURewardedVideoModel alloc]init];model.userId=@"ming123";self.rewardedVideoAd=[[BUNativeExpressRewardedVideoAd alloc] initWithSlotID:@"激励视频ID" rewardedVideoModel:model];self.rewardedVideoAd.delegate=self;[self.rewardedVideoAd loadAdData];
}//打开激励视频的方法
-(void) OpenAd{if(self.rewardedVideoAd.isAdValid){[self.rewardedVideoAd showAdFromRootViewController:self];}
}/**
This method is called when video ad material loaded successfully.
*/
- (void)nativeExpressRewardedVideoAdDidLoad:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在成功加载视频广告素材时调用。");
}/**
This method is called when video ad materia failed to load.
@param error : the reason of error
*/
- (void)nativeExpressRewardedVideoAd:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *_Nullable)error{NSLog(@"----------当视频广告材料加载失败时调用此方法。error.code = %l",error.code);
}/**
This method is called when cached successfully.
*/
- (void)nativeExpressRewardedVideoAdDidDownLoadVideo:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------成功缓存时调用此方法。");
}/**
This method is called when rendering a nativeExpressAdView successed.
*/
- (void)nativeExpressRewardedVideoAdViewRenderSuccess:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------在成功呈现nativeExpressAdView时调用此方法。");
}/**
This method is called when a nativeExpressAdView failed to render.
@param error : the reason of error
*/
- (void)nativeExpressRewardedVideoAdViewRenderFail:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd error:(NSError *_Nullable)error{NSLog(@"----------当nativeExpressAdView无法呈现时调用此方法。error.code = %l",error.code);
}/**
This method is called when video ad slot will be showing.
*/
- (void)nativeExpressRewardedVideoAdWillVisible:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在显示视频广告槽时调用。");
}/**
This method is called when video ad slot has been shown.
*/
- (void)nativeExpressRewardedVideoAdDidVisible:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在显示视频广告槽时调用。");
}/**
This method is called when video ad is about to close.
*/
- (void)nativeExpressRewardedVideoAdWillClose:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在视频广告即将关闭时调用。");
}/**
This method is called when video ad is closed.
*/
- (void)nativeExpressRewardedVideoAdDidClose:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在视频广告关闭时调用。");
//    NSLog(@"-----------nativeExpressRewardedVideoAdDidClose");// 调用 js/ts 脚本中的函数: AppMain 节点下 IOSCtrl 脚本中的 GetAward 的函数。[CallJS callJsCCNodeFunc_1:@"视屏广告看完了,发奖励罗!"];//视频结束后,再加载一次广告数据,保证广告的不重复[self.rewardedVideoAd loadAdData];
}- (void)testCallJs{// 调用 js/ts 脚本中的函数: AppMain 节点下 IOSCtrl 脚本中的 GetAward 的函数。[CallJS callJsCCNodeFunc_1:@"第1个参数!"];// 调用 js/ts 脚本中的函数: AppMain 节点下 IOSCtrl 脚本中的 GetAward2 的函数。[CallJS callJsCCNodeFunc_3:@"GetAward2" withCmd:@"第1个参数!" withContent:@"第2个参数!"];// 调用 js/ts 的全局函数:GetBigAward[CallJS callJsGlobalFunc_2:@"GetBigAward" withCmd:@"第1个参数!"];
}/**
This method is called when video ad is clicked.
*/
- (void)nativeExpressRewardedVideoAdDidClick:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在单击视频广告时调用。");
}/**
This method is called when the user clicked skip button.
*/
- (void)nativeExpressRewardedVideoAdDidClickSkip:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在单击视频广告时调用。");
}/**
This method is called when video ad play completed or an error occurred.
@param error : the reason of error
*/
- (void)nativeExpressRewardedVideoAdDidPlayFinish:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *_Nullable)error{NSLog(@"----------此方法在视频广告播放完成或发生错误时调用。error.code = %l",error.code);
}/**
Server verification which is requested asynchronously is succeeded.
@param verify :return YES when return value is 2000.
*/
- (void)nativeExpressRewardedVideoAdServerRewardDidSucceed:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd verify:(BOOL)verify{NSLog(@"----------异步请求的服务器验证成功。");
}/**
Server verification which is requested asynchronously is failed.
Return value is not 2000.
*/
- (void)nativeExpressRewardedVideoAdServerRewardDidFail:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------异步请求的服务器验证失败。");
}@end

如何在 CocosCreator 中调用

首先在XCode AppController 类定义与实现 csjAdRewardOpen

//  object-c 看视屏函数,在 js/ts 中调用。
+ (void)csjAdRewardOpen:(NSString *)code{NSLog(@"----- js/ts 调用了 object-c 函数 --打开激励视频");[[CsjAdReward getAdInstance] OpenAd];
}

如何将看完视屏的结果返回给CocosCreator

查看 CsjAdReward 脚本函数 nativeExpressRewardedVideoAdDidClose

/**
This method is called when video ad is closed.
*/
- (void)nativeExpressRewardedVideoAdDidClose:(BUNativeExpressRewardedVideoAd *)rewardedVideoAd{NSLog(@"----------此方法在视频广告关闭时调用。");
//    NSLog(@"-----------nativeExpressRewardedVideoAdDidClose");// 调用 js/ts 脚本中的函数: AppMain 节点下 IOSCtrl 脚本中的 GetAward 的函数。[CallJS callJsCCNodeFunc_1:@"视屏广告看完了,发奖励罗!"];//视频结束后,再加载一次广告数据,保证广告的不重复[self.rewardedVideoAd loadAdData];
}

有关 CallJS 类的实现见如下代码(类的文件名字注意是 CallJS.mm,如果是CallJS.m 请在xcode编辑器中修改过来)

#import <Foundation/Foundation.h>#import "cocos2d.h"
#import "CallJS.h"// 这个必须导入,否则报错。
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h"
//using namespace std;@implementation CallJS+(void)callJsCCNodeFunc_1:(NSString*) cmdStr{NSLog(@"-------callJsCCNodeFunc_1...");std::string param001 = [cmdStr UTF8String];// "cc.find('AppMain').getComponent('IOSCtrl').GetAward(\"%s\");", param001.c_str()// 可以理解为:调用 cc.find() 函数在场景中查找 AppMain 节点,在利用 getComponent() 函数获取该节点下 名为 IOSCtrl.ts 的脚本。最后调用 脚本中的成员函数 GetAward(),此函数有一个参数。std::string jsCallStr = cocos2d::StringUtils::format("cc.find('AppMain').getComponent('IOSCtrl').GetAward(\"%s\");", param001.c_str());NSLog(@"--------- jsCallStr = %s", jsCallStr.c_str());se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
}+(void)callJsCCNodeFunc_3:(NSString*) funcNameStr withCmd:(NSString*) cmdStr withContent:(NSString*) contentStr{NSLog(@"-------callJsCCNodeFunc_3...");std::string funcName = [funcNameStr UTF8String];std::string param001 = [cmdStr UTF8String];std::string param002 = [contentStr UTF8String];std::string jsCallStr = cocos2d::StringUtils::format("cc.find('AppMain').getComponent('IOSCtrl').%s(\"%s\",\"%s\");", funcName.c_str(),param001.c_str(),param002.c_str());NSLog(@"--------- jsCallStr = %s", jsCallStr.c_str());se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
}+(void)callJsGlobalFunc_1:(NSString*) funcNameStr{NSLog(@"-------callJsGlobalFunc_1...");std::string funcName = [funcNameStr UTF8String];std::string jsCallStr = cocos2d::StringUtils::format("%s();",funcName.c_str());NSLog(@"--------- jsCallStr = %s", jsCallStr.c_str());se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
}+(void)callJsGlobalFunc_2:(NSString*) funcNameStr withCmd:(NSString*) cmdStr{NSLog(@"-------callJsGlobalFunc_2...");std::string funcName = [funcNameStr UTF8String];std::string param001 = [cmdStr UTF8String];std::string jsCallStr = cocos2d::StringUtils::format("%s(\"%s\");",funcName.c_str(), param001.c_str());NSLog(@"--------- jsCallStr = %s", jsCallStr.c_str());se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
}+(void)callJsGlobalFunc_3:(NSString*) funcNameStr withCmd:(NSString*) cmdStr withContent:(NSString*) contentStr{NSLog(@"-------callJsGlobalFunc_3...");std::string funcName = [funcNameStr UTF8String];std::string param001 = [cmdStr UTF8String];std::string param002 = [contentStr UTF8String];std::string jsCallStr = cocos2d::StringUtils::format("%s(\"%s\",\"%s\");",funcName.c_str(), param001.c_str(),param002.c_str());NSLog(@"--------- jsCallStr = %s", jsCallStr.c_str());
//    ScriptingCore::getInstance()->evalString(jsCallStr.c_str());se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
}@end

有关 CocosCreator 中的ts脚本IOSCtrl.ts。如下:

const { ccclass, property } = cc._decorator;/*** 这里是一个全局函数,函数名为 GetBigAward ,带有一个参数。* 可供 object-c 调用 js/ts 用。*/
window["GetBigAward"] = function(code:string){console.error("------ object-c 调用 js 全局函数,参数 code = ",code);
}/**
* 与 Ios object-c 交互
* 此脚本 绑定在 游戏中景中 AppMain 节点下,可以通过 cc.find('AppMain');语句找到此节点。
*/
@ccclass
export class IOSCtrl  extends cc.Component {onLoad(){console.log("------ IOSCtrl onLoad");// this.AddListener();}onDestroy(){// this.RemoveListener();}// private AddListener(){//     Messenger.AddListener(MsgEvent.CSJSDK_IOS_LookVideo,this.LookVideo,this);//     Messenger.AddListener(MsgEvent.CSJSDK_IOS_ShowBanner,this.ShowBanner,this);//     Messenger.AddListener(MsgEvent.CSJSDK_IOS_HideBanner,this.HideBanner,this);// }// private RemoveListener(){//     Messenger.RemoveListener(MsgEvent.CSJSDK_IOS_LookVideo,this.LookVideo,this);//     Messenger.RemoveListener(MsgEvent.CSJSDK_IOS_ShowBanner,this.ShowBanner,this);//     Messenger.RemoveListener(MsgEvent.CSJSDK_IOS_HideBanner,this.HideBanner,this);// }/*** js/ts 调用 object-c 用。*/private LookVideo():void{if ('jsb' in window) {if (cc.sys.os == cc.sys.OS_IOS) {console.error("------- js 调用 object-c 去 看视频 ");// js 调用 object-c 中 AppController 类中的 静态函数 csjAdRewardOpen ,带有一个参数。// 注意 函数名必须带上 ":" ,否则无法找到 函数。 如 "csjAdRewardOpen:"jsb.reflection.callStaticMethod("AppController", "csjAdRewardOpen:","参数1");// 如果在 object-c 把函数定义成这个样子:+ (void)csjAdRewardOpen:(NSString *)code withcmd:(NSString *)code2; // 那么调用时函数名必须写成 "csjAdRewardOpen:withcmd:"// jsb.reflection.callStaticMethod("AppController", "csjAdRewardOpen:withcmd:","参数1","参数2");}}}/*** js/ts 调用 object-c 用。*/private ShowBanner():void{if ('jsb' in window) {if (cc.sys.os == cc.sys.OS_IOS) {console.error("------- js 调用 object-c 去 csjAdShowBanner ");jsb.reflection.callStaticMethod("AppController", "csjAdShowBanner:","2222");}}}/*** js/ts 调用 object-c 用。*/protected HideBanner():void{if ('jsb' in window) {if (cc.sys.os == cc.sys.OS_IOS) {console.error("------- js 调用 object-c 去 csjAdHideBanner ");jsb.reflection.callStaticMethod("AppController", "csjAdHideBanner:","3333");}}}/*** 可供 object-c 调用 js/ts 用。*/public GetAward(code:string){console.error("------ object-c 调用了 js 返回了视屏奖励,code =",code)// let mon = Platform.instance.platformHadler as CSJSDKPlatform;// if(mon){//     CSJSDKPlatform.IOSGetRewardVideo();// }}/*** 可供 object-c 调用 js/ts 用。* @param code * @param code2 */public GetAward2(code:string,code2:string){console.error("------ object-c 调用了 js 返回了视屏奖励,code =",code,",code2 = ",code2)// let mon = Platform.instance.platformHadler as CSJSDKPlatform;// if(mon){//     CSJSDKPlatform.IOSGetRewardVideo();// }}
}

CocosCreator接入穿山甲SDK(IOS)--激励视屏相关推荐

  1. ios sdk 穿山甲_Creator iOS接入穿山甲SDK

    首先介绍一下 .m文件与.mm文件有什么区别 .m文件 支持C ,OC .mm文件 支持C,C++,OC OC 与 TS 互调,例子有很多,比如官方的例子里面就有 TS 调用OC的时候有个点 初学者可 ...

  2. Unity接入微信SDK——iOS(接入微信SDK)

    Unity接入微信SDK--iOS(一 接入微信SDK) 下载微信SDK 下载地址:微信开放平台 导出Unity Xcode项目 导出Unity Xcode项目,并打开 微信SDK导入Xcode项目 ...

  3. CocosCreator接入穿山甲广告(IOS)

    说明 接入穿山甲广告SDK 将Cocos Creator工程打包,在手机上运行,看能否正常运行游戏,保证游戏没有问题的前提下再引入SDK所需要的各种包 根据文档引入各种包,文档地址:https://p ...

  4. CocosCreator接入穿山甲广告2-插屏广告

    看过上一篇文章的小伙伴,我这里就不在进行对初始化等进行墨迹,直接上插屏广告的逻辑,一般在游戏比如关卡结束的时候会弹出插屏广告. 穿山甲sdk初始化后,在oncreate方法里直接调用chuanShan ...

  5. Android接入穿山甲SDK并实现开屏广告

    一.穿山甲SDK的接入 0.进入官方下载地址,下载穿山甲AndroidSDK,下载的压缩包里包含.aar的sdk文件和工程demo. 1.将 SDK 压缩包内的 open_ad_sdk.aar 复制到 ...

  6. CocosCreator接入穿山甲广告总结

    最近项目开始接入国内广告变现,接的是穿山甲sdk广告,接入的过程真的是各种坎坷,我会分为激励视频,插屏广告,底部banner三部分,在后续的文章中会一点点详细的把这三部分都总结出来,给有恰好需要的朋友 ...

  7. Android 接入穿山甲SDK之Banner广告

    大家可以先参考我的上一篇博客 信息流广告 传送门 首先创建一个脚本具体内容如下 package com.unity3d.player.chuanshanjia;import android.app.A ...

  8. CocosCreator接入穿山甲广告1-激励视频

    首先进入文档后要先去下载它文档里的sdk,这个压缩包里面含有demo,没有头绪的朋友可以进入他的工程看下,也可在模拟器上运行一下它的demo看下效果.下载完后可以进入他工程下的libs的文件夹里把两个 ...

  9. Android 接入穿山甲SDK之开屏广告

    大家可以先参考我的上一篇博客介绍了如何集成SDK以及一些工具类传送门 首先创建一个脚本写入如下内容 package com.unity3d.player.chuanshanjia;import and ...

最新文章

  1. mysql导出数据到txt太慢_分享:mysql导出数据到txt文件
  2. python数据处理实例-python数据分析实例(1)
  3. 定时任务:Java中Timer和TimerTask的使用
  4. matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释
  5. oracle取位置,获取oracle trace文件路径
  6. VS2015qt配置完成后添加菜单栏
  7. 2021年小红书美妆护肤品类行业洞察报告
  8. 华为面试分配_什么时候不做面试分配
  9. 河南科技大学计算机信息安全技术考试,关于申报2020年信息安全等级保护项目的通知...
  10. 对计算机设备配置的认识,检测计算机硬件配置,知道你选购的计算机配置是否真实...
  11. Android manifest 获取源代码
  12. string进行大小写转换
  13. Linux安装Prometheus
  14. 计算机视觉论文-2021-09-14
  15. FPGA | Vivado 查看最大工作频率(Fmax)
  16. 雷达多普勒频率计算公式_详细分析:合成孔径雷达成像技术
  17. 无线局域服务器架设方法,技巧:如何实现局域网架设BT服务器
  18. 统一修改PCB板上器件标识、阻值,后期方便手工焊接样板。(现以AD10为例)
  19. 单层石墨烯工业化量产科研成果及工业化量产基地落地
  20. angular检测ie浏览器,并给用户提示

热门文章

  1. 转换字母大小写(小写转大写)
  2. C++语言中关于switch的用法
  3. SpringBoot 轻松搞定数据验证 (三)
  4. java 二维卡尔曼滤波_卡尔曼滤波 – Kalman Filtering
  5. 面试题小结 (数据分析)
  6. 仿QQ计步器效果的实现
  7. 小猿圈python金角大王_小猿圈python学习-基本数据类型
  8. 高级驾驶辅助系统ADAS技术介绍
  9. CSDN 第六期编程竞赛做题记录
  10. vue 前端传图片文件,后端接收