请打包后在真机中测试
不区分
请求方式需要为 POST,目前不支持 GET 请求。
响应结果:
{
"code": 500,
"msg": "系统错误"
}
se ios sdk 1.2.7.2 开始交付模式为 .xcframwork , 在unity环境下只保留了ios-arm64 ,否则会编译报错。
unity环境下如果想使用ios模拟器调试,需要下载ios 原生sdk: https://help.solar-engine.com/cn/docs/sFfJSt
解压后使用 SolarEngineSDK.xcframework/ios-x86_64-simulator 替换unity项目中的Assets/Plugins/iOS/framework/SolarEngineSDK.xcframework/ios-arm64
SESDKRemoteConfig.xcframework/ios-x86_64-simulator 替换unity项目中的Assets/Plugins/iOS/framework/SESDKRemoteConfig.xcframework/ios-arm64
调试完成后发布时记得换回 ios-arm64 。
Admob->Android对接文档
每种广告格式都有一个 OnPaidEventListener
。在广告事件的生命周期内,Google 移动广告 SDK 会监控展示事件,并用赚取的价值调用处理脚本。
以下代码演示了如何处理激励广告的付费事件:
import com.google.android.gms.ads.rewarded.RewardedAd;
public class MainActivity extends Activity {
private RewardedAd rewardedAd;
private final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
AdRequest adRequest = new AdRequest.Builder().build();
RewardedAd.load(this, "AD_UNIT_ID",
adRequest, new RewardedAdLoadCallback(){
@Override
public void onAdLoaded(@NonNull RewardedAd ad) {
rewardedAd = ad;
// Set paid event listener
rewardedAd.setOnPaidEventListener(new OnPaidEventListener() {
@Override
public void onPaidEvent(AdValue adValue) {
// TODO: Send the impression-level ad revenue information to your
//preferred analytics server directly within this callback.
// Extract the impression-level ad revenue data.
double valueMicros = adValue.getValueMicros();
String currencyCode = adValue.getCurrencyCode();
int precision = adValue.getPrecisionType();
// Get the ad unit ID.
String adUnitId = rewardedAd.getAdUnitId();
AdapterResponseInfo loadedAdapterResponseInfo = rewardedAd.getResponseInfo().
getLoadedAdapterResponseInfo();
String adSourceName = loadedAdapterResponseInfo.getAdSourceName();
String adSourceId = loadedAdapterResponseInfo.getAdSourceId();
String adSourceInstanceName = loadedAdapterResponseInfo.getAdSourceInstanceName();
String adSourceInstanceId = loadedAdapterResponseInfo.getAdSourceInstanceId();
Bundle extras = rewardedAd.getResponseInfo().getResponseExtras();
String mediationGroupName = extras.getString("mediation_group_name");
String mediationABTestName = extras.getString("mediation_ab_test_name");
String mediationABTestVariant = extras.getString("mediation_ab_test_variant");
//SE SDK处理逻辑
SEAdImpEventModel seAdImpEventModel = new SEAdImpEventModel();
//变现平台名称
seAdImpEventModel.setAdNetworkPlatform(adSourceName);
//聚合平台标识,admob SDK 设置成 "admob"
seAdImpEventModel.setMediationPlatform("admob");
//展示广告的类型,实际接入的广告类型,以此例激励视频为例adType = 1
seAdImpEventModel.setAdType(1);
//变现平台的应用ID
seAdImpEventModel.setAdNetworkAppID(adSourceId);
//变现平台的变现广告位ID
seAdImpEventModel.setAdNetworkADID(adUnitId);
//广告ECPM
seAdImpEventModel.setEcpm(valueMicros/1000);
//变现平台货币类型
seAdImpEventModel.setCurrencyType(currencyCode);
//填充成功填TRUE即可
seAdImpEventModel.setRenderSuccess(true);
//如果需要设置变现广告事件的自定义属性可参考文档示例,这里不再设置
SolarEngineManager.getInstance().trackAdImpression(seAdImpEventModel);
//end
}
});
}
});
}
}
IronSource->Android对接文档
以下代码演示了如何处理激励广告的付费事件:
/**
Invoked when the ad was displayed successfully and the impression data was recorded
**/
@Override
public void onImpressionSuccess(ImpressionData impressionData) {
// The onImpressionSuccess will be reported when the rewarded video and interstitial ad is opened.
// For banners, the impression is reported on load success. Log.d(TAG, "onImpressionSuccess" + impressionData);
if (impressionData != null)
{
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.AD_PLATFORM, "ironSource");
bundle.putString(FirebaseAnalytics.Param.AD_SOURCE,impressionData.adNetwork());
bundle.putString(FirebaseAnalytics.Param.AD_FORMAT, impressionData.getAdUnit());
bundle.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.getInstanceName());
bundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD");
bundle.putDouble(FirebaseAnalytics.Param.VALUE, impressionData.getRevenue());
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, bundle);
//SE SDK处理逻辑
SEAdImpEventModel seAdImpEventModel = new SEAdImpEventModel();
//变现平台名称
seAdImpEventModel.setAdNetworkPlatform(impressionData.adNetwork());
//聚合平台标识,IronSource SDK 设置成 "ironSource"
seAdImpEventModel.setMediationPlatform("ironSource");
//展示广告的类型,实际接入的广告类型,以此例激励视频为例adType = 1,具体请参考文档中的adType字段描述
seAdImpEventModel.setAdType(1);
//变现平台的应用ID,选填项,可以填SE SDK的appKey也可以不填
seAdImpEventModel.setAdNetworkAppID("---SE SDK的appKey---");
//变现平台的变现广告位ID
seAdImpEventModel.setAdNetworkADID(impressionData.getInstanceId());
//广告ECPM
seAdImpEventModel.setEcpm(impressionData.getRevenue()*1000);
//变现平台货币类型,IronSource币种默认为美元
seAdImpEventModel.setCurrencyType("USD");
//填充成功填TRUE即可
seAdImpEventModel.setRenderSuccess(true);
//如果需要设置变现广告事件的自定义属性可参考文档示例,这里不再设置
SolarEngineManager.getInstance().trackAdImpression(seAdImpEventModel);
//end
}
}
Max->Android对接文档
代码示例:
@Override
void onAdRevenuePaid(final MaxAd ad)
{
double revenue = ad.getRevenue(); // In USD
// Miscellaneous data
String countryCode = AppLovinSdk.getInstance( context ).getConfiguration().getCountryCode(); // "US" for the United States, etc - Note: Do not confuse this with currency code which is "USD"
String networkName = ad.getNetworkName(); // Display name of the network that showed the ad
String adUnitId = ad.getAdUnitId(); // The MAX Ad Unit ID
MaxAdFormat adFormat = ad.getFormat(); // The ad format of the ad (e.g. BANNER, MREC, INTERSTITIAL, REWARDED)
String placement = ad.getPlacement(); // The placement this ad's postbacks are tied to
String networkPlacement = ad.getNetworkPlacement(); // The placement ID from the network that showed the ad
//SE SDK处理逻辑
SEAdImpEventModel seAdImpEventModel = new SEAdImpEventModel();
//变现平台名称
seAdImpEventModel.setAdNetworkPlatform( ad.getNetworkName());
//聚合平台标识,Max SDK 设置成 "Max"
seAdImpEventModel.setMediationPlatform("Max");
//展示广告的类型,以激励视频为例,adType = 1
seAdImpEventModel.setAdType(1);
//变现平台的应用ID,选填项,可以填SE SDK的appKey也可以不填
seAdImpEventModel.setAdNetworkAppID("---SE SDK的appKey---");
//变现平台的变现广告位ID
seAdImpEventModel.setAdNetworkADID(ad.getNetworkPlacement());
//广告ECPM
seAdImpEventModel.setEcpm(ad.getRevenue()*1000);
//变现平台货币类型,Max币种类型为USD
seAdImpEventModel.setCurrencyType('USD');
//填充成功填TRUE即可
seAdImpEventModel.setRenderSuccess(true);
SolarEngineManager.getInstance().trackAdImpression(seAdImpEventModel);
//如果需要设置变现广告事件的自定义属性可参考文档示例,这里不再设置
//end
}
TopOn->Android对接文档
代码示例:
ATAdSourceStatusListener adSourceStatusListener = new ATAdSourceStatusListener() {
@Override
public void onAdSourceBiddingAttempt(ATAdInfo adInfo) {
Log.i(TAG, "onAdSourceBiddingAttempt: " + adInfo.toString());
//SE SDK处理逻辑
SEAdImpEventModel seAdImpEventModel = new SEAdImpEventModel();
//变现平台名称,可参考network_firm_id所对应的具体变现平台名称,这里以network_firm_id = 6表示Mintegral为例
//network_firm_id详细说明地址:https://docs.toponad.com/#/zh-cn/ios/ios_doc/ios_sdk_callback_access?id=network_firm_id
seAdImpEventModel.setAdNetworkPlatform('"Mintegral");
//聚合平台标识,TopOn SDK 设置成 "TopOn"
seAdImpEventModel.setMediationPlatform("TopOn");
//展示广告的类型,实际接入的广告类型,以激励视频为例adType = 1
seAdImpEventModel.setAdType(1);
//变现平台的应用ID,选填项,可以填SE SDK的appKey也可以不填
seAdImpEventModel.setAdNetworkAppID("---SE SDK的appKey---");
//变现平台的变现广告位ID
seAdImpEventModel.setAdNetworkADID(adInfo.getNetworkPlacementId());
//广告ECPM
seAdImpEventModel.setEcpm(adInfo.getEcpm());
//变现平台货币类型
seAdImpEventModel.setCurrencyType(adInfo.getCurrency());
//填充成功填TRUE即可
seAdImpEventModel.setRenderSuccess(true);
//如果需要设置变现广告事件的自定义属性可参考文档示例,这里不再设置
SolarEngineManager.getInstance().trackAdImpression(seAdImpEventModel);
//end
}
@Override
public void onAdSourceBiddingFilled(ATAdInfo adInfo) {
Log.i(TAG, "onAdSourceBiddingFilled: " + adInfo.toString());
}
@Override
public void onAdSourceBiddingFail(ATAdInfo adInfo, AdError adError) {
Log.i(TAG, "onAdSourceBiddingFail Info: " + adInfo.toString());
Log.i(TAG, "onAdSourceBiddingFail error: " + adError.getFullErrorInfo());
}
@Override
public void onAdSourceAttempt(ATAdInfo adInfo) {
Log.i(TAG, "onAdSourceAttemp: " + adInfo.toString());
}
@Override
public void onAdSourceLoadFilled(ATAdInfo adInfo) {
Log.i(TAG, "onAdSourceLoadFilled: " + adInfo.toString());
}
@Override
public void onAdSourceLoadFail(ATAdInfo adInfo, AdError adError) {
Log.i(TAG, "onAdSourceLoadFail Info: " + adInfo.toString());
Log.i(TAG, "onAdSourceLoadFail error: " + adError.getFullErrorInfo());
}
};
atRewardVideoAd.setAdSourceStatusListener(adSourceStatusListener);//激励视频广告
//atInterstitial.setAdSourceStatusListener(adSourceStatusListener);//插屏广告
//atSplashAd.setAdSourceStatusListener(adSourceStatusListener);//插屏广告
//atNative.setAdSourceStatusListener(adSourceStatusListener);//原生广告
//atBannerView.setAdSourceStatusListener(adSourceStatusListener);//横幅广告
每种广告格式都有一个类型为 GADPaidEventHandler 的 paidEventHandler 属性。在广告事件的生命周期内,Google 移动广告 SDK 会监控展示事件,并用赚取的价值调用处理脚本。
@import GoogleMobileAds;
@import UIKit;
@interface ViewController ()
@property(nonatomic, strong) GADRewardedAd *rewardedAd;
@end
@implementation ViewController
- (void)requestRewardedAd {
__weak ViewController *weakSelf = self;
GADRequest *request = [GADRequest request];
[GADRewardedAd
loadWithAdUnitID:@"AD_UNIT_ID"
request:request
completionHandler:^(GADRewardedAd *ad, NSError *error) {
if (error) {
NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
return;
}
self.rewardedAd = ad;
self.rewardedAd.paidEventHandler = ^void(GADAdValue *_Nonnull value){
ViewController *strongSelf = weakSelf;
NSDecimalNumber *value; = value.value;
GADAdNetworkResponseInfo *adInfo = strongSelf.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
SEAdImpressionEventAttribute *attribute = [[SEAdImpressionEventAttribute alloc] init];
// 变现平台名称
attribute.adNetworkPlatform = adInfo.adSourceName;
// 变现平台的应用 ID,
attribute.adNetworkAppID = adInfo.adSourceID;
// 展示广告的类型,实际接入的广告类型
attribute.adType = 5;// 参考文档中的adType字段描述
// 变现平台的变现广告位 ID
attribute.adNetworkPlacementID = strongSelf.rewardedAd.adUnitID;
// 币种,
attribute.currency = value.currencyCode;
// admob SDK ecpm 的单位是美元
attribute.ecpm = [value.value doubleValue]*1000;
// 聚合平台标识,admob SDK 设置成 "admob"
attribute.mediationPlatform = @"admob";
// 广告是否渲染成功
attribute.rendered = YES;
[[SolarEngineSDK sharedInstance] trackAdImpressionWithAttributes:attribute];
};
]};
}
IronSource监听回调代码
+ (void)addImpressionDataDelegate:(id<ISImpressionDataDelegate>)delegate;
Demo示例
设置代理,监听回调
self.impressionDataDelegate = [[DemoImpressionDataDelegate alloc] init];
[IronSource addImpressionDataDelegate:self.impressionDataDelegate];
自定义类,用来接受IronSource回调
@interface DemoImpressionDataDelegate : NSObject<ISImpressionDataDelegate>
@end
@implementation DemoImpressionDataDelegate
当广告成功展示数据时调
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
SEAdImpressionEventAttribute *attribute = [[SEAdImpressionEventAttribute alloc] init];
// 变现平台名称
attribute.adNetworkPlatform = impressionData.ad_network
// 展示广告的类型
attribute.adType = 1; 填入用户实际的广告类型的广告类型,参考文档中的adType字段描述
// 变现平台的变现广告位 ID
attribute.adNetworkPlacementID = impressionData.placement;
// 币种,美元
attribute.currency = @"USD";
// ironsource SDK ecpm 的单位是美元
attribute.ecpm = impressionData.revenue*1000;
// 聚合平台标识,ironsource SDK 设置成 "ironsource"
attribute.mediationPlatform = @"ironsource";
// 广告是否渲染成功
attribute.rendered = YES;
[[SolarEngineSDK sharedInstance] trackAdImpressionWithAttributes:attribute];
}
@end
调用示例
// 检测到广告收益时MAX的回调
- (void)didPayRevenueForAd:(MAAd *)ad
{
SEAdImpressionEventAttribute *attribute = [[SEAdImpressionEventAttribute alloc] init];
// 变现平台名称
attribute.adNetworkPlatform = ad.networkName;
// 变现平台的应用 ID,
attribute.adNetworkAppID = "";
// 展示广告的类型
attribute.adType = ad.format; // MAAdFormat 需要转换成对应的广告类型,参考文档中的adType字段描述
// 变现平台的变现广告位 ID
attribute.adNetworkPlacementID = ad.networkPlacement;
// 币种,美元
attribute.currency = @"USD";
// MAX SDK ecpm 的单位是美元
attribute.ecpm = ad.revenue*1000;
// 聚合平台标识,max SDK 设置成 "max"
attribute.mediationPlatform = @"max";
// 广告是否渲染成功
attribute.rendered = YES;
[[SolarEngineSDK sharedInstance] trackAdImpressionWithAttributes:attribute];
}
调用示例
// TopOn SDK在回调方法最后的extra参数返回广告源的具体信息,
- (void)didFinishLoadingADSourceWithPlacementID:(NSString *)placementID extra:(NSDictionary*)extra {
//不同的广告对应的key,不同,例如这里是banner广告则使用kATBannerDelegateExtraNetworkIDKey
int network_firm_id = [extra[kATBannerDelegateExtraNetworkIDKey] intValue];
NSString* network_placement_id = extra[kATADDelegateExtraNetworkPlacementIDKey];
NSString* adunit_format = extra[kATADDelegateExtraFormatKey];
//不同的广告对应的key不同,例如这里是banner广告则使用 kATBannerDelegateExtraAdSourceIDKey
NSString* adsource_id = extra[kATBannerDelegateExtraAdSourceIDKey];
//不同的广告对应的key不同,例如这里是banner广告则使用 kATBannerDelegateExtraPrice
double adsource_price = [extra[kATBannerDelegateExtraPrice] doubleValue];
NSString* precision = extra[kATADDelegateExtraPrecisionKey];
NSString* currency = extra[kATADDelegateExtraCurrencyKey];
SEAdImpressionEventAttribute *attribute = [[SEAdImpressionEventAttribute alloc] init];
// 变现平台名称
// https://docs.toponad.com/#/zh-cn/ios/ios_doc/ios_sdk_callback_access?id=network_firm_id
attribute.adNetworkPlatform = // network_firm_id 参考 Network Firm Id Table 转换成字符串传给SDK,如6则对应Mintegral
// 展示广告的类型
attribute.adType = ; 需要把 adunit_format 转换成SE SDK对应的枚举,参考文档中的adType字段描述
// 变现平台的变现广告位 ID
attribute.adNetworkPlacementID = network_placement_id;
// 币种,美元
attribute.currency = currency;
// SDK ecpm 的单位是美元
attribute.ecpm = adsource_price;
// 聚合平台标识,topon SDK 设置成 "topon"
attribute.mediationPlatform = @"topon";
// 广告是否渲染成功
attribute.rendered = YES;
[[SolarEngineSDK sharedInstance] trackAdImpressionWithAttributes:attribute];
}
IronSource-Flutter 调用示例:
@override
void onImpressionSuccess(IronSourceImpressionData? impressionData) {
SEAppImpressionData appImpressionData = SEAppImpressionData();
// 变现平台
appImpressionData.adNetworkPlatform = impressionData?.adNetwork;
// 展示广告的类型 , 根据IS具体的广告类型转换成SolarEngine的枚举,具体看IS和SolarEngine的文档介绍,示例如下
appImpressionData.adType = 2;
// 变现平台的应用 ID
// appImpressionData.adNetworkAppID = ?;
// 变现平台的变现广告位 ID
appImpressionData.adNetworkADID = impressionData?.placement ;
// 聚合平台标识,ironsource SDK 设置成 "ironsource"
appImpressionData.mediationPlatform = @"ironsource";
// 广告ECPM
appImpressionData.ecpm = impressionData?.revenue;
// 展示收益的货币种类
appImpressionData.currencyType = "USD";
// 广告是否渲染成功
appImpressionData.isRenderSuccess = true;
SolarEngine.trackAppImpress(appImpressionData);
}
每种广告格式都有一个 OnAdPaid 事件。在广告事件的生命周期内,Google 移动广告 SDK 会监控展示事件,并用表示赚取的价值的 AdValue 调用处理脚本。
using GoogleMobileAds.Api;
private RewardedAd _rewardedAd;
private void LoadRewardedAd()
{
// Send the request to load the ad.
AdRequest adRequest = new AdRequest();
RewardedAd.Load("AD_UNIT_ID", adRequest, (RewardedAd rewardedAd, LoadAdError error) =>
{
// If the operation failed with a reason.
if (error != null)
{
Debug.LogError("Rewarded ad failed to load an ad with error : " + error);
return;
}
_rewardedAd=rewardedAd;
_rewardedAd.OnAdPaid += this.HandleAdPaidEvent;
});
}
public void HandleAdPaidEvent(AdValue adValue)
{
// TODO: Send the impression-level ad revenue information to your
// preferred analytics server directly within this callback.
ResponseInfo responseInfo = _rewardedAd.GetResponseInfo();
AdapterResponseInfo loadedAdapterResponseInfo = responseInfo.GetLoadedAdapterResponseInfo();
ImpressionAttributes impressionAttributes = new ImpressionAttributes();
//变现平台名称
impressionAttributes.ad_platform = loadedAdapterResponseInfo.AdSourceName;
// 变现平台的应用 ID,
impressionAttributes.ad_appid = loadedAdapterResponseInfo.AdSourceId;
//聚合平台标识,admob SDK 设置成 "admob"
impressionAttributes.mediation_platform = "admob";
// 变现平台的变现广告位 ID
impressionAttributes.ad_id = _rewardedAd.GetAdUnitID();
// 展示广告的类型,实际接入的广告类型,参考文档中的adType字段描述
impressionAttributes.ad_type = 1;
// 币种,
impressionAttributes.currency_type = adValue.CurrencyCode;
// admob SDK ecpm
impressionAttributes.ad_ecpm = (double)adValue.Value / 1000;
// 广告是否渲染成功
impressionAttributes.is_rendered = true;
SolarEngine.Analytics.trackAdImpression(impressionAttributes);
}
1、删除SolarEngineNet/iOS 文件夹
2、删除SolarEngineNet/Editor/SolarEnginePlugins/RemoteConfigSDK/iOS 文件夹
3、参考 iOS文档 获取SDK,将SDK放入工程中Assets/Plugins/SolarEngine/iOS
添加SDK所需依赖框架
添加方法:
在工程目录中,选择 TARGETS-->Build Phases-->Link Binary With Libraries-->+ -->选择 Security.framework、SystemConfiguration.framework、CoreTelephony.framework、AdSupport.framework、libsqlite3.dylib 、AdServices.framework等库文件。
UnityFramework Target中添加-Objc参数,否则SDK初始化失败
添加方式: TARGETS -> UnityFramework -> Build Settings -> Other liner flags -> -Objc
新版 Xcode .dylib 以 .tbd 为后缀,添加对应动态库。
注:
1.如上动态库请全部配置,避免报错。
2.Xcode 7 及以上版本,.dylib后缀结尾的系统库均更改为.tbd 后缀结尾。
iOS ODMInfo依赖于GoogleAdsOnDeviceConversion.xcframework、GoogleUtilities.xcframework、nanopb.xcframework
如果你的项目也使用了Firebase的功能可能会出现依赖版本不一致出现冲突,解决冲突操作如下:
打开 SolarEngineNet-SolarEnginePlugins-ODMInfo-Editor-Dependencies文件
注释其中有冲突的pod节点(一般都是GoogleAdsOnDeviceConversion)
配置好后重新导出iOS项目,卸载App重装,搜索关键字ODM 关键字
如果您之前接入的是我们非.unitypackage的版本,请确认,删除您项目中之前手动放入的solorengineSDK:
因iOS pod命令拉取SDK有缓存,所以如您想升级iOSSDK版本,需要在SDK Edit Setting面板上指定您想要的版本或指定最新的版本,然后点击Apply即可
确认一下Unity项目中是否有solarengine对应的aar包存在,例:com.reyun.solar.engine.xxxx.xxx.aar
执行强制拉取:
Assets > External Dependency Manager > Android Resolver > Resolve
Assets > External Dependency Manager > Android Resolver > Force Resolve)