You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1340 lines
44 KiB
Matlab

1 month ago
//
// iOSBridge.m
// iOSBridge
//
// Created by Supersonic.
// Copyright (c) 2015 Supersonic. All rights reserved.
//
#import "iOSBridge.h"
#import <UIKit/UIKit.h>
// Converts NSString to C style string by way of copy (Mono will free it)
#define MakeStringCopy( _x_ ) ( _x_ != NULL && [_x_ isKindOfClass:[NSString class]] ) ? strdup( [_x_ UTF8String] ) : NULL
// Converts C style string to NSString
#define GetStringParam( _x_ ) ( _x_ != NULL ) ? [NSString stringWithUTF8String:_x_] : [NSString stringWithUTF8String:""]
#define BANNER_POSITION_TOP 1
#define BANNER_POSITION_BOTTOM 2
#ifdef __cplusplus
extern "C" {
#endif
void UnityPause(int pause);
extern void UnitySendMessage( const char *className, const char *methodName, const char *param );
#ifdef __cplusplus
}
#endif
@interface iOSBridge ()
{
ISBannerView* _bannerView;
NSInteger _position;
UIViewController* _bannerViewController;
BOOL _shouldHideBanner;
}
@property (nonatomic, strong) RewardedVideoLevelPlayCallbacksWrapper *rewardedVideoLevelPlayDelegate;
@property (nonatomic, strong) InterstitialLevelPlayCallbacksWrapper *interstitialLevelPlayDelegate;
@property (nonatomic, strong) BannerLevelPlayCallbacksWrapper *bannerLevelPlayDelegate;
@end
static NSString * const EMPTY_STRING = @"";
@implementation iOSBridge
static ISUnityBackgroundCallback backgroundCallback;
static bool pauseGame;
char *const IRONSOURCE_EVENTS = "IronSourceEvents";
char *const IRONSOURCE_REWARDED_VIDEO_EVENTS = "IronSourceRewardedVideoEvents";
char *const IRONSOURCE_INTERSTITIAL_EVENTS = "IronSourceInterstitialEvents";
char *const IRONSOURCE_BANNER_EVENTS = "IronSourceBannerEvents";
+ (iOSBridge *)start {
static iOSBridge *instance;
static dispatch_once_t onceToken;
dispatch_once( &onceToken,
^{
instance = [iOSBridge new];
});
return instance;
}
- (instancetype)init {
if(self = [super init]){
self.rewardedVideoLevelPlayDelegate = [[RewardedVideoLevelPlayCallbacksWrapper alloc]initWithDelegate:(id)self];
self.interstitialLevelPlayDelegate = [[InterstitialLevelPlayCallbacksWrapper alloc]initWithDelegate:(id)self];
self.bannerLevelPlayDelegate = [[BannerLevelPlayCallbacksWrapper alloc]initWithDelegate:(id)self];
[IronSource setRewardedVideoDelegate:self];
[IronSource setInterstitialDelegate:self];
[IronSource setISDemandOnlyInterstitialDelegate:self];
[IronSource setISDemandOnlyRewardedVideoDelegate:self];
[IronSource setOfferwallDelegate:self];
[IronSource setBannerDelegate:self];
[IronSource addImpressionDataDelegate:self];
[IronSource setConsentViewWithDelegate:self];
//set level play listeneres
[IronSource setLevelPlayBannerDelegate:self.bannerLevelPlayDelegate];
[IronSource setLevelPlayInterstitialDelegate:self.interstitialLevelPlayDelegate];
[IronSource setLevelPlayRewardedVideoDelegate:self.rewardedVideoLevelPlayDelegate];
_bannerView = nil;
_bannerViewController = nil;
_position = BANNER_POSITION_BOTTOM;
_shouldHideBanner = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification object:nil];
}
return self;
}
- (void)setPluginDataWithType:(NSString *)pluginType pluginVersion:(NSString *)version pluginFrameworkVersion:(NSString *)frameworkVersion {
[ISConfigurations getConfigurations].plugin = pluginType;
[ISConfigurations getConfigurations].pluginVersion = version;
[ISConfigurations getConfigurations].pluginFrameworkVersion = frameworkVersion;
}
#pragma mark Base API
- (const char *)getAdvertiserId {
NSString *advertiserId = [IronSource advertiserId];
return MakeStringCopy(advertiserId);
}
- (void)validateIntegration {
[ISIntegrationHelper validateIntegration];
}
- (void)shouldTrackNetworkState:(BOOL)flag {
[IronSource shouldTrackReachability:flag];
}
- (BOOL)setDynamicUserId:(NSString *)dynamicUserId {
return [IronSource setDynamicUserId:dynamicUserId];
}
- (void)setAdaptersDebug:(BOOL)enabled {
[IronSource setAdaptersDebug:enabled];
}
- (void)setConsent:(BOOL)consent {
[IronSource setConsent:consent];
}
- (void)setMetaDataWithKey:(NSString *)key value:(NSString *)value {
[IronSource setMetaDataWithKey:key value:value];
}
- (void)setMetaDataWithKey:(NSString *)key values:(NSMutableArray *)valuesArray {
[IronSource setMetaDataWithKey:key values:valuesArray];
}
- (void)setManualLoadRewardedVideo:(BOOL) isOn {
if (isOn) {
[IronSource setRewardedVideoManualDelegate:self];
[IronSource setLevelPlayRewardedVideoManualDelegate:self.rewardedVideoLevelPlayDelegate];
}
else {
NSLog(@"Manual load false is the defualt value");
}
}
- (void)setNetworkData:(NSString *)networkKey data:(NSString *)networkData {
NSError* error;
if (!networkData) {
return;
}
NSData *data = [networkData dataUsingEncoding:NSUTF8StringEncoding];
if (!data) {
return;
}
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!dict) {
return;
}
[IronSource setNetworkDataWithNetworkKey:networkKey andNetworkData:dict];
}
#pragma mark Init SDK
- (void)setUserId:(NSString *)userId {
[IronSource setUserId:userId];
}
- (void)initWithAppKey:(NSString *)appKey {
[IronSource initWithAppKey:appKey delegate:self];
}
- (void)initWithAppKey:(NSString *)appKey adUnits:(NSArray<NSString *> *)adUnits {
[IronSource initWithAppKey:appKey adUnits:adUnits delegate:self];
}
- (void)initISDemandOnly:(NSString *)appKey adUnits:(NSArray<NSString *> *)adUnits {
[IronSource initISDemandOnly:appKey adUnits:adUnits];
}
#pragma mark Rewarded Video API
- (void)showRewardedVideo {
[IronSource showRewardedVideoWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (void)showRewardedVideoWithPlacement:(NSString *)placementName {
[IronSource showRewardedVideoWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController placement:placementName];
}
- (const char *) getPlacementInfo:(NSString *)placementName {
char *res = nil;
if (placementName){
ISPlacementInfo *placementInfo = [IronSource rewardedVideoPlacementInfo:placementName];
if(placementInfo){
NSDictionary *dict = @{@"placement_name": [placementInfo placementName],
@"reward_amount": [placementInfo rewardAmount],
@"reward_name": [placementInfo rewardName]};
res = MakeStringCopy([self getJsonFromObj:dict]);
}
}
return res;
}
- (BOOL)isRewardedVideoAvailable {
return [IronSource hasRewardedVideo];
}
- (BOOL)isRewardedVideoPlacementCapped:(NSString *)placementName {
return [IronSource isRewardedVideoCappedForPlacement:placementName];
}
- (void)setRewardedVideoServerParameters:(NSDictionary *)params {
[IronSource setRewardedVideoServerParameters:params];
}
- (void)clearRewardedVideoServerParameters {
[IronSource clearRewardedVideoServerParameters];
}
#pragma mark Rewarded Video Manual Load API
- (void)loadRewardedVideo {
[IronSource loadRewardedVideo];
}
#pragma mark Rewarded Video DemanOnly API
- (void)showISDemandOnlyRewardedVideo:(NSString *)instanceId {
[IronSource showISDemandOnlyRewardedVideo:[UIApplication sharedApplication].keyWindow.rootViewController instanceId:instanceId];
}
- (void)loadISDemandOnlyRewardedVideo:(NSString *)instanceId {
[IronSource loadISDemandOnlyRewardedVideo:instanceId];
}
- (BOOL)isDemandOnlyRewardedVideoAvailable:(NSString *)instanceId {
return [IronSource hasISDemandOnlyRewardedVideo:instanceId];
}
#pragma mark Init Delegate
- (void)initializationDidComplete {
UnitySendMessage(IRONSOURCE_EVENTS, "onSdkInitializationCompleted", "");
}
#pragma mark Rewarded Video Delegate
- (void)rewardedVideoHasChangedAvailability:(BOOL)available {
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAvailabilityChanged", (available) ? "true" : "false");
}
- (void)didReceiveRewardForPlacement:(ISPlacementInfo *)placementInfo {
NSDictionary *dict = @{@"placement_reward_amount": placementInfo.rewardAmount,
@"placement_reward_name": placementInfo.rewardName,
@"placement_name": placementInfo.placementName};
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdRewarded", MakeStringCopy([self getJsonFromObj:dict]));
}
- (void)rewardedVideoDidFailToShowWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdShowFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdShowFailed","");
}
- (void)rewardedVideoDidOpen {
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdOpened", "");
if (pauseGame) {
UnityPause(1);
}
}
- (void)rewardedVideoDidClose {
if (pauseGame) {
UnityPause(0);
}
[self centerBanner];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClosed", "");
}
- (void)rewardedVideoDidStart {
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdStarted", "");
}
- (void)rewardedVideoDidEnd {
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdEnded", "");
}
- (void)didClickRewardedVideo:(ISPlacementInfo *)placementInfo {
NSDictionary *dict = @{@"placement_reward_amount": placementInfo.rewardAmount,
@"placement_reward_name": placementInfo.rewardName,
@"placement_name": placementInfo.placementName};
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClicked", MakeStringCopy([self getJsonFromObj:dict]));
}
#pragma mark Rewarded Video Level Play Delegate
- (void)rewardedVideoLevelPlayDidClick:(nonnull ISPlacementInfo *)placementInfo withAdInfo:(nonnull ISAdInfo *)adInfo {
NSDictionary *dict = @{@"placement_reward_amount": placementInfo.rewardAmount,
@"placement_reward_name": placementInfo.rewardName,
@"placement_name": placementInfo.placementName};
NSArray *params = @[dict, [self getAdInfoData:adInfo]];
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdClicked", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)rewardedVideoLevelPlayDidCloseWithAdInfo:(nonnull ISAdInfo *)adInfo {
if (pauseGame) {
UnityPause(0);
}
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdClosed",[self getAdInfoData:adInfo].UTF8String);
}
- (void)rewardedVideoLevelPlayDidFailToLoadWithError:(nonnull NSError *)error {
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error]));
}
- (void)rewardedVideoLevelPlayDidFailToShowWithError:(nonnull NSError *)error andAdInfo:(nonnull ISAdInfo *)adInfo {
NSArray *params = @[(error) ? [self parseErrorToEvent:error] : @"" , [self getAdInfoData:adInfo]];
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdShowFailed", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)rewardedVideoLevelPlayDidLoadWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdReady", [self getAdInfoData:adInfo].UTF8String);
}
- (void)rewardedVideoLevelPlayDidOpenWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdOpened", [self getAdInfoData:adInfo].UTF8String);
if (pauseGame) {
UnityPause(1);
}
}
- (void)rewardedVideoLevelPlayDidReceiveRewardForPlacement:(nonnull ISPlacementInfo *)placementInfo withAdInfo:(nonnull ISAdInfo *)adInfo {
NSDictionary *dict = @{@"placement_reward_amount": placementInfo.rewardAmount,
@"placement_reward_name": placementInfo.rewardName,
@"placement_name": placementInfo.placementName};
NSArray *params = @[dict, [self getAdInfoData:adInfo]];
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdRewarded", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)hasAvailableAdWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdAvailable", [self getAdInfoData:adInfo].UTF8String);
}
- (void)hasNoAvailableAd {
UnitySendMessage(IRONSOURCE_REWARDED_VIDEO_EVENTS, "onAdUnavailable","");
}
#pragma mark Rewarded Video DemandOnly Delegate
- (void)rewardedVideoDidLoad:(NSString *)instanceId{
NSArray *params = @[instanceId];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdLoadedDemandOnly", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)rewardedVideoDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId{
NSArray *params;
if (error)
params = @[instanceId, [self parseErrorToEvent:error]];
else
params = @[instanceId,@""];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdLoadFailedDemandOnly", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)rewardedVideoAdRewarded:(NSString *)instanceId {
NSArray *params = @[instanceId];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdRewardedDemandOnly", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)rewardedVideoDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId {
NSArray *params;
if (error)
params = @[instanceId, [self parseErrorToEvent:error]];
else
params = @[instanceId,@""];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdShowFailedDemandOnly", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)rewardedVideoDidOpen:(NSString *)instanceId {
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdOpenedDemandOnly", MakeStringCopy(instanceId));
if (pauseGame) {
UnityPause(1);
}
}
- (void)rewardedVideoDidClose:(NSString *)instanceId {
if (pauseGame) {
UnityPause(0);
}
[self centerBanner];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClosedDemandOnly", MakeStringCopy(instanceId));
}
- (void)rewardedVideoDidClick:(NSString *)instanceId {
NSArray *params = @[instanceId];
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClickedDemandOnly", MakeStringCopy([self getJsonFromObj:params]));
}
#pragma mark Interstitial API
- (void)loadInterstitial {
[IronSource loadInterstitial];
}
- (void)showInterstitial {
[IronSource showInterstitialWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (void)showInterstitialWithPlacement:(NSString *)placementName {
[IronSource showInterstitialWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController placement:placementName];
}
- (BOOL)isInterstitialReady {
return [IronSource hasInterstitial];
}
- (BOOL)isInterstitialPlacementCapped:(NSString *)placementName {
return [IronSource isInterstitialCappedForPlacement:placementName];
}
#pragma mark Interstitial DemandOnly API
- (void)loadISDemandOnlyInterstitial:(NSString *)instanceId {
[IronSource loadISDemandOnlyInterstitial:instanceId];
}
- (void)showISDemandOnlyInterstitial:(NSString *)instanceId {
[IronSource showISDemandOnlyInterstitial:[UIApplication sharedApplication].keyWindow.rootViewController instanceId:instanceId];
}
- (BOOL)isISDemandOnlyInterstitialReady:(NSString *)instanceId {
return [IronSource hasISDemandOnlyInterstitial:instanceId];
}
#pragma mark Interstitial Delegate
- (void)interstitialDidLoad {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdReady", "");
}
- (void)interstitialDidFailToLoadWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdLoadFailed","");
}
- (void)interstitialDidOpen {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdOpened", "");
if (pauseGame) {
UnityPause(1);
}
}
- (void)interstitialDidClose {
if (pauseGame) {
UnityPause(0);
}
[self centerBanner];
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClosed", "");
}
- (void)interstitialDidShow {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowSucceeded", "");
}
- (void)interstitialDidFailToShowWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowFailed","");
}
- (void)didClickInterstitial {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClicked", "");
}
#pragma mark Interstitial Level Play Delegate
- (void)interstitialLevelPlayDidClickWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdClicked", [self getAdInfoData:adInfo].UTF8String);
}
- (void)interstitialLevelPlayDidCloseWithAdInfo:(nonnull ISAdInfo *)adInfo {
if (pauseGame) {
UnityPause(0);
}
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdClosed", [self getAdInfoData:adInfo].UTF8String);
}
- (void)interstitialLevelPlayDidFailToLoadWithError:(nonnull NSError *)error {
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error]));
}
- (void)interstitialLevelPlayDidFailToShowWithError:(nonnull NSError *)error andAdInfo:(nonnull ISAdInfo *)adInfo {
NSArray *params = @[(error) ? [self parseErrorToEvent:error] : @"" , [self getAdInfoData:adInfo]];
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdShowFailed", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)interstitialLevelPlayDidLoadWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdReady", [self getAdInfoData:adInfo].UTF8String);
}
- (void)interstitialLevelPlayDidOpenWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdOpened", [self getAdInfoData:adInfo].UTF8String);
if (pauseGame) {
UnityPause(1);
}
}
- (void)interstitialLevelPlayDidShowWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_INTERSTITIAL_EVENTS, "onAdShowSucceeded", [self getAdInfoData:adInfo].UTF8String);
}
#pragma mark Interstitial DemandOnly Delegate
- (void)interstitialDidLoad:(NSString *)instanceId {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdReadyDemandOnly", MakeStringCopy(instanceId));
}
- (void)interstitialDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId {
NSArray *parameters;
if (error)
parameters = @[instanceId, [self parseErrorToEvent:error]];
else
parameters = @[instanceId, @""];
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdLoadFailedDemandOnly",MakeStringCopy([self getJsonFromObj:parameters]));
}
- (void)interstitialDidOpen:(NSString *)instanceId {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdOpenedDemandOnly", MakeStringCopy(instanceId));
if (pauseGame) {
UnityPause(1);
}
}
- (void)interstitialDidClose:(NSString *)instanceId {
if (pauseGame) {
UnityPause(0);
}
[self centerBanner];
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClosedDemandOnly", MakeStringCopy(instanceId));
}
- (void)interstitialDidShow:(NSString *)instanceId {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowSucceededDemandOnly", MakeStringCopy(instanceId));
}
- (void)interstitialDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId {
NSArray *parameters;
if (error)
parameters = @[instanceId, [self parseErrorToEvent:error]];
else
parameters = @[instanceId, @""];
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowFailedDemandOnly", MakeStringCopy([self getJsonFromObj:parameters]));
}
- (void)didClickInterstitial:(NSString *)instanceId {
UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClickedDemandOnly", MakeStringCopy(instanceId));
}
#pragma mark Offerwall API
- (void)showOfferwall {
[IronSource showOfferwallWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (void)showOfferwallWithPlacement:(NSString *)placementName {
[IronSource showOfferwallWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController placement:placementName];
}
- (void)getOfferwallCredits {
[IronSource offerwallCredits];
}
- (BOOL)isOfferwallAvailable {
return [IronSource hasOfferwall];
}
#pragma mark Offerwall Delegate
- (void)offerwallHasChangedAvailability:(BOOL)available {
UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallAvailable", (available) ? "true" : "false");
}
- (void)offerwallDidShow {
UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallOpened", "");
}
- (void)offerwallDidFailToShowWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallShowFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallShowFailed", "");
}
- (void)offerwallDidClose {
[self centerBanner];
UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallClosed", "");
}
- (BOOL)didReceiveOfferwallCredits:(NSDictionary *)creditInfo {
if(creditInfo)
UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallAdCredited", [self getJsonFromObj:creditInfo].UTF8String);
return YES;
}
- (void)didFailToReceiveOfferwallCreditsWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onGetOfferwallCreditsFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onGetOfferwallCreditsFailed", "");
}
#pragma mark ConsentView API
-(void)loadConsentViewWithType:(NSString *)consentViewType {
[IronSource loadConsentViewWithType: consentViewType];
}
-(void)showConsentViewWithType:(NSString *)consentViewType {
@synchronized(self) {
UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[IronSource showConsentViewWithViewController:viewController andType:consentViewType];
}
}
#pragma mark Banner API
- (void)loadBanner:(NSString *)description width:(NSInteger)width height:(NSInteger)height position:(NSInteger)position placement:(NSString *)placement adaptive:(bool) isAdaptive {
@synchronized(self) {
_position = position;
ISBannerSize* size = [self getBannerSize:description width:width height:height];
size.adaptive = isAdaptive;
_bannerViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[IronSource loadBannerWithViewController:_bannerViewController size:size placement:placement];
}
}
- (void)destroyBanner {
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(self) {
if (_bannerView != nil) {
[IronSource destroyBanner:_bannerView];
_bannerView = nil;
_bannerViewController = nil;
_shouldHideBanner = NO;
}
}
});
}
- (void)displayBanner {
_shouldHideBanner = NO;
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(self) {
if (_bannerView != nil) {
[_bannerView setHidden:_shouldHideBanner];
}
}
});
}
- (void)hideBanner {
_shouldHideBanner = YES;
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(self) {
if (_bannerView != nil) {
[_bannerView setHidden:_shouldHideBanner];
}
}
});
}
- (BOOL)isBannerPlacementCapped:(NSString *)placementName {
return [IronSource isBannerCappedForPlacement:placementName];
}
- (ISBannerSize *) getBannerSize:(NSString *)description width:(NSInteger)width height:(NSInteger)height {
if ([description isEqualToString:@"CUSTOM"]) {
return [[ISBannerSize alloc] initWithWidth:width andHeight:height];
}
if ([description isEqualToString:@"SMART"]) {
return ISBannerSize_SMART;
}
if ([description isEqualToString:@"RECTANGLE"]) {
return ISBannerSize_RECTANGLE;
}
if ([description isEqualToString:@"LARGE"]) {
return ISBannerSize_LARGE;
}
else {
return ISBannerSize_BANNER;
}
}
#pragma mark Banner Delegate
- (CGPoint)getBannerCenter:(NSInteger)position rootView:(UIView *)rootView {
CGFloat y;
if (position == BANNER_POSITION_TOP) {
y = (_bannerView.frame.size.height / 2);
if (@available(ios 11.0, *)) {
y += rootView.safeAreaInsets.top;
}
}
else {
y = rootView.frame.size.height - (_bannerView.frame.size.height / 2);
if (@available(ios 11.0, *)) {
y -= rootView.safeAreaInsets.bottom;
}
}
return CGPointMake(rootView.frame.size.width / 2, y);
}
- (void)bannerDidLoad:(ISBannerView *)bannerView {
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(self) {
_bannerView = bannerView;
[_bannerView setAccessibilityLabel:@"bannerContainer"];
[_bannerView setHidden:_shouldHideBanner];
_bannerView.center = [self getBannerCenter:_position rootView:_bannerViewController.view];
[_bannerViewController.view addSubview:_bannerView];
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLoaded", "");
}
});
}
- (void)bannerDidFailToLoadWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLoadFailed", "");
}
- (void)didClickBanner {
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdClicked", "");
}
- (void)bannerWillPresentScreen {
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdScreenPresented", "");
}
- (void)bannerDidDismissScreen {
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdScreenDismissed", "");
}
- (void)bannerWillLeaveApplication {
UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLeftApplication", "");
}
- (void)centerBanner {
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(self) {
if (_bannerView != nil && _bannerViewController != nil) {
_bannerView.center = [self getBannerCenter:_position rootView:_bannerViewController.view];
}
}
});
}
- (void)orientationChanged:(NSNotification *)notification {
[self centerBanner];
}
#pragma mark Banner Level Play Delegate
- (void)bannerLevelPlayDidClickWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_BANNER_EVENTS, "onAdClicked", [self getAdInfoData:adInfo].UTF8String);
}
- (void)bannerLevelPlayDidDismissScreenWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_BANNER_EVENTS, "onAdScreenDismissed", [self getAdInfoData:adInfo].UTF8String);
}
- (void)bannerLevelPlayDidFailToLoadWithError:(nonnull NSError *)error {
UnitySendMessage(IRONSOURCE_BANNER_EVENTS, "onAdLoadFailed", (error) ? MakeStringCopy([self parseErrorToEvent:error]):"");
}
- (void)bannerLevelPlayDidLeaveApplicationWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_BANNER_EVENTS, "onAdLeftApplication", [self getAdInfoData:adInfo].UTF8String);
}
- (void)bannerLevelPlayDidLoad:(nonnull ISBannerView *)bannerView withAdInfo:(nonnull ISAdInfo *)adInfo {
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(self) {
_bannerView = bannerView;
[_bannerView setAccessibilityLabel:@"bannerContainer"];
[_bannerView setHidden:_shouldHideBanner];
_bannerView.center = [self getBannerCenter:_position rootView:_bannerViewController.view];
[_bannerViewController.view addSubview:_bannerView];
UnitySendMessage(IRONSOURCE_BANNER_EVENTS, "onAdLoaded", [self getAdInfoData:adInfo].UTF8String);
}
});
}
- (void)bannerLevelPlayDidPresentScreenWithAdInfo:(nonnull ISAdInfo *)adInfo {
UnitySendMessage(IRONSOURCE_BANNER_EVENTS, "onAdScreenPresented", [self getAdInfoData:adInfo].UTF8String);
}
#pragma mark Helper methods
- (void) setSegment:(NSString*) segmentJSON {
[IronSource setSegmentDelegate:self];
ISSegment *segment = [[ISSegment alloc] init];
NSError* error;
if (!segmentJSON)
return;
NSData *data = [segmentJSON dataUsingEncoding:NSUTF8StringEncoding];
if (!data)
return;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!dict)
return;
NSMutableArray *allKeys = [[dict allKeys] mutableCopy];
for (id key in allKeys)
{
NSString* keyString = (NSString*)key;
NSString *object = [dict objectForKey: keyString];
if ([keyString isEqualToString:@"age"]){
segment.age = [object intValue] ;
}
else if([keyString isEqualToString:@"gender"]){
if([object caseInsensitiveCompare:@"male"] == NSOrderedSame)
segment.gender = IRONSOURCE_USER_MALE ;
else if([object caseInsensitiveCompare:@"female"] == NSOrderedSame)
segment.gender = IRONSOURCE_USER_FEMALE;
}
else if ([keyString isEqualToString:@"level"]){
segment.level = [object intValue];
}
else if ([keyString isEqualToString:@"isPaying"]){
segment.paying = [object boolValue];
}
else if ([keyString isEqualToString:@"userCreationDate"]){
NSDate *date = [NSDate dateWithTimeIntervalSince1970: [object longLongValue]/1000];
segment.userCreationDate = date;
}
else if ([keyString isEqualToString:@"segmentName"]){
segment.segmentName = object;
} else if ([keyString isEqualToString:@"iapt"]){
segment.iapTotal = [object doubleValue];
}
else{
[segment setCustomValue:object forKey:keyString];
}
}
[IronSource setSegment:segment];
}
- (void)didReceiveSegement:(NSString *)segment{
UnitySendMessage(IRONSOURCE_EVENTS, "onSegmentReceived", MakeStringCopy(segment));
}
- (NSString *)parseErrorToEvent:(NSError *)error{
if (error){
NSString* codeStr = [NSString stringWithFormat:@"%ld", (long)[error code]];
NSDictionary *dict = @{@"error_description": [error localizedDescription],
@"error_code": codeStr};
return [self getJsonFromObj:dict];
}
return nil;
}
- (NSString *)getJsonFromObj:(id)obj {
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:obj options:0 error:&error];
if (!jsonData) {
NSLog(@"Got an error: %@", error);
return @"";
} else {
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
return jsonString;
}
}
- (NSString *) getAdInfoData:(ISAdInfo *) adinfo{
if (adinfo!=nil) {
NSString *adInfoString = [NSString stringWithFormat:@"%@", adinfo];
return adInfoString;
}
return EMPTY_STRING;
}
#pragma mark ImpressionData Delegate
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
if (backgroundCallback!=nil) {
const char * serializedParameters = [self getJsonFromObj:[impressionData all_data]].UTF8String;
backgroundCallback(serializedParameters);
}
UnitySendMessage(IRONSOURCE_EVENTS, "onImpressionSuccess", [self getJsonFromObj:[impressionData all_data]].UTF8String);
}
#pragma mark ConsentView Delegate
- (void)consentViewDidAccept:(NSString *)consentViewType {
UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidAccept", MakeStringCopy(consentViewType));
}
- (void)consentViewDidDismiss:(NSString *)consentViewType {
UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidDismiss", MakeStringCopy(consentViewType));
}
- (void)consentViewDidFailToLoadWithError:(NSError *)error consentViewType:(NSString *)consentViewType {
NSArray *params;
if (error)
params = @[consentViewType, [self parseErrorToEvent:error]];
else
params = @[consentViewType, @""];
UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidFailToLoadWithError", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)consentViewDidLoadSuccess:(NSString *)consentViewType {
UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidLoadSuccess", MakeStringCopy(consentViewType));
}
- (void)consentViewDidFailToShowWithError:(NSError *)error consentViewType:(NSString *)consentViewType {
NSArray *params;
if (error)
params = @[consentViewType, [self parseErrorToEvent:error]];
else
params = @[consentViewType, @""];
UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidFailToShowWithError", MakeStringCopy([self getJsonFromObj:params]));
}
- (void)consentViewDidShowSuccess:(NSString *)consentViewType {
UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidShowSuccess", MakeStringCopy(consentViewType));
}
#pragma mark ConversionValue API
-(const char *) getConversionValue {
NSNumber *conversionValue = [IronSource getConversionValue];
char *res = MakeStringCopy([conversionValue stringValue]);
return res;
}
#pragma mark ILRD API
- (void)setAdRevenueData:(NSString *)dataSource impressionData:(NSData *)impressionData {
[IronSource setAdRevenueDataWithDataSource:dataSource impressionData:impressionData];
}
#pragma mark TestSuite API
- (void)launchTestSuite {
[IronSource launchTestSuite:[UIApplication sharedApplication].keyWindow.rootViewController];
}
#pragma mark - C Section
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
double floor;
double ceiling;
} LPPWaterfallConfigurationData;
enum LPPAdFormat
{
LPPAdFormatRewardedVideo,
LPPAdFormatInterstitial,
LPPAdFormatBanner
};
void RegisterCallback(ISUnityBackgroundCallback func){
backgroundCallback=func;
}
void RegisterPauseGameFunction(bool func){
pauseGame=func;
}
void CFSetPluginData(const char *pluginType, const char *pluginVersion, const char *pluginFrameworkVersion){
[[iOSBridge start] setPluginDataWithType:GetStringParam(pluginType) pluginVersion:GetStringParam(pluginVersion) pluginFrameworkVersion:GetStringParam(pluginFrameworkVersion)];
}
const char *CFGetAdvertiserId(){
return [[iOSBridge start] getAdvertiserId];
}
void CFValidateIntegration(){
[[iOSBridge start] validateIntegration];
}
void CFShouldTrackNetworkState(bool flag){
[[iOSBridge start] shouldTrackNetworkState:flag];
}
bool CFSetDynamicUserId(char *dynamicUserId){
return [[iOSBridge start] setDynamicUserId:GetStringParam(dynamicUserId)];
}
void CFSetAdaptersDebug(bool enabled){
[[iOSBridge start] setAdaptersDebug:enabled];
}
void CFSetUserId(char *userId){
return [[iOSBridge start] setUserId:GetStringParam(userId)];
}
void CFSetConsent (bool consent) {
[[iOSBridge start] setConsent:consent];
}
void CFSetMetaData (char *key, char *value) {
[[iOSBridge start] setMetaDataWithKey:GetStringParam(key) value:GetStringParam(value)];
}
void CFSetMetaDataWithValues (char *key,const char *values[]) {
NSMutableArray *valuesArray = [NSMutableArray new];
if(values != nil ) {
int i = 0;
while (values[i] != nil) {
[valuesArray addObject: [NSString stringWithCString: values[i] encoding:NSASCIIStringEncoding]];
i++;
}
[[iOSBridge start] setMetaDataWithKey:GetStringParam(key) values:valuesArray];
}
}
void CFSetManualLoadRewardedVideo(bool isOn) {
[[iOSBridge start] setManualLoadRewardedVideo:isOn];
}
void CFSetNetworkData (char *networkKey, char *networkData) {
[[iOSBridge start] setNetworkData:GetStringParam(networkKey) data:GetStringParam(networkData)];
}
#pragma mark Init SDK
void CFInit(const char *appKey){
[[iOSBridge start] initWithAppKey:GetStringParam(appKey)];
}
void CFInitWithAdUnits(const char *appKey, const char *adUnits[]){
NSMutableArray *adUnitsArray = [NSMutableArray new];
if(adUnits != nil ) {
int i = 0;
while (adUnits[i] != nil) {
[adUnitsArray addObject: [NSString stringWithCString: adUnits[i] encoding:NSASCIIStringEncoding]];
i++;
}
[[iOSBridge start] initWithAppKey:GetStringParam(appKey) adUnits:adUnitsArray];
}
}
void CFInitISDemandOnly(const char *appKey, const char *adUnits[]){
NSMutableArray *adUnitsArray = [NSMutableArray new];
if(adUnits != nil ) {
int i = 0;
while (adUnits[i] != nil) {
[adUnitsArray addObject: [NSString stringWithCString: adUnits[i] encoding:NSASCIIStringEncoding]];
i++;
}
[[iOSBridge start] initISDemandOnly:GetStringParam(appKey) adUnits:adUnitsArray];
}
}
#pragma mark RewardedVideo API
void CFLoadRewardedVideo() {
[[iOSBridge start] loadRewardedVideo];
}
void CFShowRewardedVideo(){
[[iOSBridge start] showRewardedVideo];
}
void CFShowRewardedVideoWithPlacementName(char *placementName){
[[iOSBridge start] showRewardedVideoWithPlacement:GetStringParam(placementName)];
}
const char *CFGetPlacementInfo(char *placementName){
return [[iOSBridge start] getPlacementInfo:GetStringParam(placementName)];
}
bool CFIsRewardedVideoAvailable(){
return [[iOSBridge start] isRewardedVideoAvailable];
}
bool CFIsRewardedVideoPlacementCapped(char *placementName){
return [[iOSBridge start] isRewardedVideoPlacementCapped:GetStringParam(placementName)];
}
void CFSetRewardedVideoServerParameters(char *jsonString) {
NSData *data = [GetStringParam(jsonString) dataUsingEncoding:NSUTF8StringEncoding];
if (!data) {
return;
}
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if (dict) {
[[iOSBridge start] setRewardedVideoServerParameters:dict];
}
}
void CFClearRewardedVideoServerParameters() {
[[iOSBridge start] clearRewardedVideoServerParameters];
}
#pragma mark RewardedVideo DemandOnly API
void CFShowISDemandOnlyRewardedVideo(char * instanceId){
[[iOSBridge start] showISDemandOnlyRewardedVideo:GetStringParam(instanceId)];
}
void CFLoadISDemandOnlyRewardedVideo(char * instanceId) {
[[iOSBridge start] loadISDemandOnlyRewardedVideo:GetStringParam(instanceId)];
}
bool CFIsDemandOnlyRewardedVideoAvailable(char * instanceId) {
return [[iOSBridge start] isDemandOnlyRewardedVideoAvailable:GetStringParam(instanceId)];
}
#pragma mark Interstitial API
void CFLoadInterstitial(){
[[iOSBridge start] loadInterstitial];
}
void CFShowInterstitial(){
[[iOSBridge start] showInterstitial];
}
void CFShowInterstitialWithPlacementName(char *placementName){
[[iOSBridge start] showInterstitialWithPlacement:GetStringParam(placementName)];
}
bool CFIsInterstitialReady(){
return [[iOSBridge start] isInterstitialReady];
}
bool CFIsInterstitialPlacementCapped(char *placementName){
return [[iOSBridge start] isInterstitialPlacementCapped:GetStringParam(placementName)];
}
#pragma mark Interstitial DemandOnly API
void CFLoadISDemandOnlyInterstitial(char * instanceId) {
[[iOSBridge start] loadISDemandOnlyInterstitial:GetStringParam(instanceId)];
}
void CFShowISDemandOnlyInterstitial(char * instanceId) {
[[iOSBridge start] showISDemandOnlyInterstitial:GetStringParam(instanceId)];
}
bool CFIsDemandOnlyInterstitialReady(char * instanceId) {
return [[iOSBridge start] isISDemandOnlyInterstitialReady:GetStringParam(instanceId)];
}
#pragma mark Offerwall API
void CFShowOfferwall(){
[[iOSBridge start] showOfferwall];
}
void CFShowOfferwallWithPlacementName(char *placementName){
[[iOSBridge start] showOfferwallWithPlacement:GetStringParam(placementName)];
}
void CFGetOfferwallCredits(){
[[iOSBridge start] getOfferwallCredits];
}
bool CFIsOfferwallAvailable(){
return [[iOSBridge start] isOfferwallAvailable];
}
#pragma mark Banner API
void CFLoadBanner(char* description, int width, int height, int position, char* placementName, bool isAdaptive){
[[iOSBridge start] loadBanner:GetStringParam(description) width:width height:height position:position placement:GetStringParam(placementName) adaptive:isAdaptive];
}
void CFDestroyBanner (){
[[iOSBridge start] destroyBanner];
}
void CFDisplayBanner (){
[[iOSBridge start] displayBanner];
}
void CFHideBanner (){
[[iOSBridge start] hideBanner];
}
bool CFIsBannerPlacementCapped (char *placementName){
return [[iOSBridge start] isBannerPlacementCapped:GetStringParam(placementName)];
}
#pragma mark Segment API
void CFSetSegment (char* jsonString) {
[[iOSBridge start] setSegment:GetStringParam(jsonString)];
}
#pragma mark Set Waterfall Configuration API
void LPPSetWaterfallConfiguration(LPPWaterfallConfigurationData configurationParams, enum LPPAdFormat adFormat) {
ISWaterfallConfigurationBuilder *builder = [ISWaterfallConfiguration builder];
const double defaultValue = 0.00;
if (configurationParams.floor != defaultValue) {
NSNumber *floorValue = [NSNumber numberWithDouble:configurationParams.floor];
[builder setFloor:floorValue];
}
if (configurationParams.ceiling != defaultValue) {
NSNumber *ceilingValue = [NSNumber numberWithDouble:configurationParams.ceiling];
[builder setCeiling:ceilingValue];
}
ISWaterfallConfiguration *waterfallConfig = [builder build];
ISAdUnit *adUnit;
switch (adFormat) {
case LPPAdFormatInterstitial:
adUnit = [ISAdUnit IS_AD_UNIT_INTERSTITIAL];
break;
case LPPAdFormatRewardedVideo:
adUnit = [ISAdUnit IS_AD_UNIT_REWARDED_VIDEO];
break;
case LPPAdFormatBanner:
adUnit = [ISAdUnit IS_AD_UNIT_BANNER];
break;
default:
return;
}
[IronSource setWaterfallConfiguration:waterfallConfig forAdUnit:adUnit];
}
#pragma mark ConsentView API
void CFLoadConsentViewWithType (char* consentViewType){
[[iOSBridge start] loadConsentViewWithType:GetStringParam(consentViewType)];
}
void CFShowConsentViewWithType (char* consentViewType){
[[iOSBridge start] showConsentViewWithType:GetStringParam(consentViewType)];
}
#pragma mark ConversionValue API
const char *CFGetConversionValue(){
return [[iOSBridge start] getConversionValue];
}
#pragma mark ILRD API
void CFSetAdRevenueData(char* datasource,char* impressiondata){
NSData *data=[GetStringParam(impressiondata)dataUsingEncoding:NSUTF8StringEncoding];
if (!data) {
return;
}
return [[iOSBridge start] setAdRevenueData:GetStringParam(datasource)impressionData:data];
}
#pragma mark TestSuite API
void CFLaunchTestSuite(){
[[iOSBridge start] launchTestSuite];
}
#pragma mark - ISRewardedVideoManualDelegate methods
- (void)rewardedVideoDidLoad {
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdReady", "");
}
- (void)rewardedVideoDidFailToLoadWithError:(NSError *)error {
if (error)
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error]));
else
UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdLoadFailed","");
}
#ifdef __cplusplus
}
#endif
@end