前言:本文包含Unity接入ios sdk以及原生ios sdk的接入步骤,注意xcode版本的更新
一、后台配置
后台配置参照 TradPlus SDK – Unity-Android接入心得 一文中 后台配置,这里就不做重复赘述了
前置条件:
- Xcode更新9.2或者最新版本
- Unity需要2018.3.4或以上版本
二、TradPlus-Unity-ios SDK 的接入
准备工作:
在Mac上下载最新版本 sdk 并解压,获得 **TradPlusFrameworks 和 TradPlusSDK **两个文件夹 。
1. 导入资源
- 将解压得到的**TradPlusSDK 文件夹导入到 Unity中Assets/Plugins目录下,注意:ios版的TradPlusSDK 和Android版的TradPlusSDK **不能同时存在于Unity资源文件夹中
- 使用Unity发布Xcode项目,将解压得到的**TradPlusFrameworks 文件夹复制进项目文件夹内,并使用Xcode打开项目。选中 UnityFramework,添加TradPlusFrameworks **,添加的时候勾选Creat groups
- 删除不必要的 第三方广告平台的库文件,以下都是第三方平台的库文件
2.项目配置
1. 添加常用系统依赖库
在项目 Build phases/Link Binary with libraries下添加以下依赖库
- libz.tbd
- libbz2.tbd
- libxml2.tbd
- libresolv.9.tbd
- libsqlite3.tbd
2. 修改项目设置
1.在 Targets/Build Setting/Linking/Other Linker Flags 中加入ObjC
2. 如果项目需要接入MoPub和KSAdSDK,在 Targets/General中将MoPub.framework和KSAdSDK.framework 设置为Embed & Sign
3.代码实现
经过前两步的操作,接下来就可以快乐的写代码了,Unity-ios的接入不需要额外的编写代码,跟Unity-Android使用同一套代码即可,以杜立特行动的sdk接入为例:
using UnityEngine;
using System;
using System.Collections;
public class ADManager : MonoBehaviour, IGameInterface
{
public ManagerStatus Status { get; private set; }
private Action ADVerifyCallback;
private string adUnitId;
private int reloadCount;
public void SetADCallback(Action callback)
{
ADVerifyCallback = callback;
}
public void StartUp()
{
Status = ManagerStatus.Started;
/*
* TradPlus后台设置 对应广告类型的广告位(非三方广告网络的placementId)
* 仅在初始化广告位时调用一次
*/
reloadCount = 0;
adUnitId = "9FBF62A82E85FA5F7C30DC6xxxxxxxxx";
Init();
}
private void Init()
{
TradPlus.InitializeSdk(adUnitId);
TradPlus.LoadRewardedVideoPluginsForAdUnits(adUnitId);
LoadAD();
SetListener();
}
public bool IsReady()
{
return TradPlus.HasRewardedVideo(adUnitId);
}
public void ShowRewardAd()
{
TradPlus.ShowRewardedVideoConfirmUWSAd(adUnitId);
//自动reload设置为true,有广告直接展示广告,没有可用广告会自动加载广告
TradPlus.ShowRewardedVideo(adUnitId);
}
public void LoadAD()
{
/* 4.4.0 以上版本支持Autoload
*
* 参数2:自动reload设置true,TradPlus SDK会在两个地方帮你自动加载广告,无需调用load
* (1)obj.show()返回false时,此时该广告位下没有可用广告;
* (2)广告关闭,OnRewardedVideoDismissedEvent回调监听中
*
* 不传默认false,需要在上述2个地方调用obj.load()方法以保证有广告的填充。
*/
TradPlus.RequestRewardedVideo(adUnitId, true);
}
private void SetListener()
{
//针对广告位下每个广告源的回调监听
//广告加载成功
TradPlusManager.OnRewardedVideoLoadedEvent += OnRewardedVideoLoadedEvent;
//广告加载失败
TradPlusManager.OnRewardedVideoFailedEvent += OnRewardedVideoFailedEvent;
//广告开始展示
TradPlusManager.OnRewardedVideoShownEvent += OnRewardedVideoShownEvent;
//广告被点击
TradPlusManager.OnRewardedVideoClickedEvent += OnRewardedVideoClickedEvent;
//广告被关闭
//重新加载广告;自动reload设置为true,无需加载广告
TradPlusManager.OnRewardedVideoDismissedEvent += OnRewardedVideoDismissedEvent;
//奖励,当视频播放完毕,会进行奖励回调
TradPlusManager.OnRewardedVideoReceivedRewardEvent += OnRewardedVideoReceivedRewardEvent;
//针对多个广告位加载的结果做一个状态的返回
//当isLoadedSucces为false,重新加载广告
TradPlusManager.OnRewardedVideoAllLoadedEvent += OnRewardedVideoAllLoadedEvent;
}
private void OnRewardedVideoLoadedEvent(string str)
{
//Debug.Log("广告加载成功" + str);
}
private void OnRewardedVideoFailedEvent(string str1,string str2)
{
//Debug.Log("广告加载失败" + str1 + str2);
}
private void OnRewardedVideoShownEvent(string str1, string str2)
{
//Debug.Log("广告开始展示" + str1 + str2);
}
private void OnRewardedVideoClickedEvent(string str)
{
//Debug.Log("广告点击" + str);
}
private void OnRewardedVideoDismissedEvent(string str)
{
//Debug.Log("重新加载广告" + str);
}
private void OnRewardedVideoReceivedRewardEvent(string str1, string str2, int num)
{
//Debug.Log("广告播放完毕");
ADVerifyCallback.Invoke();
}
private void OnRewardedVideoAllLoadedEvent(bool result,string str)
{
//设置了自动加载广告视频,当所有广告位加载失败时,允许3次重新加载,间隔25秒
if (false == result)
{
if (reloadCount < 3)
{
StartCoroutine(ReloadAD());
++reloadCount;
}
else
{
//Debug.Log("广告加载失败!");
}
}
else
{
reloadCount = 0;
}
}
private IEnumerator ReloadAD()
{
yield return new WaitForSeconds(25.0f);
//Debug.Log("重新加载广告源");
LoadAD();
}
}
三、TradPlus-原生ios SDK 的接入
准备工作:
在Mac上下载最新版本 sdk 并解压,获得 **TradPlusFrameworks **文件夹 。
1. 导入资源
- 将解压得到的**TradPlusFrameworks 文件夹复制进项目文件夹内,并使用Xcode打开项目,添加TradPlusFrameworks **,添加的时候勾选Creat groups
- 删除不必要的 第三方广告平台的库文件,以下都是第三方平台的库文件
2. 项目配置
参照 TradPlus-Unity-ios SDK 的接入 中的项目配置
3.代码实现
原谅本人比较菜,不会Objective-C,就简单的贴一下代码吧
1. 头文件 tradplus_sdk_manager.h
#import <UIKit/UIKit.h>
@interface TradplusSdkManager : UIViewController
+(TradplusSdkManager *) GetInterface;
-(void) LoadRewardAD;
-(void) ShowRewardAD;
-(int) GetAdCount;
-(NSString *) GetSlotId;
@end
2. tradplus_sdk_manager.mm
#import "tradplus_sdk_manager.h"
#import <TradPlusAds/MsRewardedVideoAd.h>
#import <TradPlusAds/MsSDKUtils.h>
#import "IosAdsHelper.h"
@interface TradplusSdkManager ()<MsRewardedVideoAdDelegate>
//相关回调时可以访问到的具体渠道信息。
@property (nonatomic, strong) NSMutableDictionary *dicChannelInfo;
@property (strong, nonatomic) MsRewardedVideoAd *rewardedVideoAd;
-(void) Init;
- (void)rewardedVideoAdAllLoaded:(MsRewardedVideoAd *)rewardedVideoAd readyCount:(int)readyCount;
- (void)rewardedVideoAdLoaded:(MsRewardedVideoAd *)rewardedVideoAd;
- (void)rewardedVideoAd:(MsRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error;
- (void)rewardedVideoAdShown:(MsRewardedVideoAd *)rewardedVideoAd;
- (void)rewardedVideoAdClicked:(MsRewardedVideoAd *)rewardedVideoAd;
- (void)rewardedVideoAdDismissed:(MsRewardedVideoAd *)rewardedVideoAd;
- (void)rewardedVideoAdShouldReward:(MsRewardedVideoAd *)rewardedVideoAd reward:(MSRewardedVideoReward *)reward;
@end
@implementation TradplusSdkManager:UIViewController
static TradplusSdkManager* _instance = nil;
+(TradplusSdkManager *)GetInterface
{
if (nil == _instance) {
_instance = [TradplusSdkManager new];
[_instance Init];
}
return _instance;
}
-(void) Init
{
[MsSDKUtils msSDKInit:^(NSError *error){
if (!error)
{
NSLog(@"tradplus SDK 初始化成功!");
}
}];
self.rewardedVideoAd = [[MsRewardedVideoAd alloc] init];
//如果使用穿山甲广告,并且是非模版渲染(穿山甲海外只支持非渲染),需要在调用setAdUnitID方法之前手动设置如下:
self.rewardedVideoAd.isPangleTemplateRender = NO;
//如需自动reload,可调用setAdUnitID:isAutoLoad:方法
[self.rewardedVideoAd setAdUnitID:@"344B8096EE4B760D86F9F8558722C396" isAutoLoad:true];
self.rewardedVideoAd.delegate = self;
}
-(int)GetAdCount
{
return self.rewardedVideoAd.readyAdCount;
}
+(void) LoadFinish{
IosAdsHelper* _iosAdHelper = IosAdsHelper::GetInsterface();
_iosAdHelper->OnAdloaded();
}
-(void) LoadRewardAD
{
NSLog(@"广告开始加载 %s", __FUNCTION__);
int count = [self GetAdCount];
if(0<count){
[TradplusSdkManager LoadFinish];
}else{
[self.rewardedVideoAd loadAd];
}
}
-(void) ShowRewardAD
{
if (self.rewardedVideoAd && [self.rewardedVideoAd isAdReadyWithDirection])
{
NSLog(@"显示广告!");
UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
UIViewController *rootViewController = window.rootViewController;
[self.rewardedVideoAd showAdWithDirectionFromRootViewController:rootViewController];
}
else
{
NSLog(@"没有广告!执行加载!");
[self.rewardedVideoAd loadAd];
}
}
-(NSString *) GetSlotId
{
return [self.rewardedVideoAd.dicChannelInfo objectForKey:@"placementid"];
}
//load 完成
- (void)rewardedVideoAdAllLoaded:(MsRewardedVideoAd *)rewardedVideoAd readyCount:(int)readyCount
{
if (readyCount > 0)
{
//加载成功,有可供展示的插屏广告。
NSLog(@"广告源加成功 %d %s", readyCount, __FUNCTION__);
[TradplusSdkManager LoadFinish];
}
else {
//加载失败,TradPlus后台对应广告位设置的所有三方广告源,全部加载失败,程序启动后第一次加载失败时建议隔30秒重新加载一次。如果设置了自动reload,此处不用处理。
NSLog(@"所有广告源加载失败 %s", __FUNCTION__);
[self LoadRewardAD];
}
}
//单个广告源加载成功
-(void)rewardedVideoAdLoaded:(MsRewardedVideoAd *)rewardedVideoAd
{
NSLog(@"单个广告源加载成功! %s", __FUNCTION__);
[TradplusSdkManager LoadFinish];
}
//单个广告源加载失败
-(void)rewardedVideoAd:(MsRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error
{
NSLog(@"%s->%@", __FUNCTION__, error);
}
//开始播放视频后回调
-(void)rewardedVideoAdShown:(MsRewardedVideoAd *)rewardedVideoAd
{
NSLog(@"广告开始播放 %s", __FUNCTION__);
}
//视频播放结束后,关闭落地页
-(void)rewardedVideoAdDismissed:(MsRewardedVideoAd *)rewardedVideoAd
{
//dismiss后重新请求广告,如果是自动加载可不调用。
[self LoadRewardAD];
NSLog(@"广告关闭 %s", __FUNCTION__);
IosAdsHelper* _iosAdHelper = IosAdsHelper::GetInsterface();
_iosAdHelper->AdsShowCallBackEvent(-1);
}
//点击广告后回调。
-(void)rewardedVideoAdClicked:(MsRewardedVideoAd *)rewardedVideoAd
{
NSLog(@"点击了广告 %s", __FUNCTION__);
}
//播放完成获得奖励后回调 reward为TradPlus后台设置的奖励 通过reward.currencyType reward.amount访问
-(void)rewardedVideoAdShouldReward:(MsRewardedVideoAd *)rewardedVideoAd reward:(MSRewardedVideoReward *)reward
{
NSLog(@"广告播放完成 获得奖励 %s", __FUNCTION__);
self.dicChannelInfo = rewardedVideoAd.dicChannelInfo;
IosAdsHelper* _iosAdHelper = IosAdsHelper::GetInsterface();
_iosAdHelper->AdsShowCallBackEvent(0); //广告播放完成,获得奖励
}
@end
3. 如果想获取广告加载的信息,可以通过
[self.rewardedVideoAd.dicChannelInfo objectForKey:@“信息字段”];
其中信息字段可以替换为以下单词
- iso 国家两位简码
- appkey mintegral除了appid之外还提供了appkey
- appid 三方广告源 标识应用唯一标识的appid/appkey/sdkkey等
- placementid 对应三方placement id,zone id等
- unitid mintegral 单个广告位placement id下面还分unit id
- load_time 加载时长,单位毫秒
- is_play_complete 是否播放完成
四、常见错误及解决办法
如果出现Xcode构建错误,再次检查 导入资源和项目配置这两步是否出错,一般都能解决问题