Badminton-Scoreboard/Libraries/com.unity.ads/Plugins/iOS/UnityMonetizationDecisionWrapper.m
2023-10-08 10:24:48 +08:00

178 lines
7.5 KiB
Objective-C

#import <UnityAds/UnityMonetization.h>
#import <Unity/UnityInterface.h>
#import "UnityAdsUtilities.h"
#import "UnityJsonAdditions.h"
typedef void (*UnityMonetizationShowAdStartCallback)();
typedef void (*UnityMonetizationShowAdFinishCallback)(int finishState);
@interface UnityMonetizationUnityShowAdDelegate : NSObject<UMONShowAdDelegate>
@property (nonatomic) UnityMonetizationShowAdStartCallback startCallback;
@property (nonatomic) UnityMonetizationShowAdFinishCallback finishCallback;
-(instancetype)initWithCallbacks:(UnityMonetizationShowAdStartCallback)startCallback finishCallback:(UnityMonetizationShowAdFinishCallback)finishCallback;
@end
@implementation UnityMonetizationUnityShowAdDelegate
- (instancetype)initWithCallbacks:(UnityMonetizationShowAdStartCallback)startCallback finishCallback:(UnityMonetizationShowAdFinishCallback)finishCallback {
if (self = [super init]) {
self.startCallback = startCallback;
self.finishCallback = finishCallback;
}
return self;
}
-(void)unityAdsDidFinish:(NSString *)placementId withFinishState:(UnityAdsFinishState)finishState {
UnityPause(0);
if (self.finishCallback) {
self.finishCallback(finishState);
}
}
-(void)unityAdsDidStart:(NSString *)placementId {
if (self.startCallback) {
self.startCallback();
}
}
@end
const ushort* Il2CppStringFromNSString(NSString* str) {
size_t len = str.length;
NSData* cStr = [str dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
ushort* buffer = (ushort*)malloc(len * sizeof(ushort) + 1);
memset(buffer, 0, (len + 1) * sizeof(ushort));
[cStr getBytes:buffer length:len * sizeof(ushort)];
return buffer;
}
const ushort* serializeJsonToIl2CppString(NSDictionary* dict) {
NSError* error;
NSData* data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
NSString* str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (data != nil) {
return Il2CppStringFromNSString(str);
}
return NULL;
}
NSDictionary* getJsonDictionaryFromItem(UMONItem* item) {
return @{
@"itemType": item.type ? item.type : [NSNull null],
@"productId": item.productId ? item.productId : [NSNull null],
@"quantity": @(item.quantity)
};
}
NSArray* getJsonArrayFromItemArray(NSArray<UMONItem*>* items) {
NSMutableArray* array = [[NSMutableArray alloc] init];
for (UMONItem* item in items) {
[array addObject:getJsonDictionaryFromItem(item)];
}
return [array copy];
}
BOOL isValidPrice(NSDecimalNumber* number) {
return number && ![number isEqualToNumber:[NSDecimalNumber notANumber]];
}
NSDictionary* getJsonDictionaryFromProduct(UPURProduct* product) {
return @{
@"productId": product.productId ? product.productId : [NSNull null],
@"localizedTitle": product.localizedTitle ? product.localizedTitle : [NSNull null],
@"localizedDescription": product.localizedDescription ? product.localizedDescription : [NSNull null],
@"localizedPriceString": product.localizedPriceString ? product.localizedPriceString : [NSNull null],
@"isoCurrencyCode": product.isoCurrencyCode ? product.isoCurrencyCode : [NSNull null],
@"localizedPrice": isValidPrice(product.localizedPrice) ? product.localizedPrice : [NSNull null],
@"productType": product.productType ? product.productType : [NSNull null]
};
}
NSDictionary* getPromoMetadataDictionary(UMONPromoMetaData* metadata) {
return @{
@"impressionDate": metadata.impressionDate ? @([metadata.impressionDate timeIntervalSince1970] * 1000) : [NSNull null],
@"offerDuration": @(metadata.offerDuration),
@"costs": getJsonArrayFromItemArray(metadata.costs),
@"payouts": getJsonArrayFromItemArray(metadata.payouts),
@"premiumProduct": getJsonDictionaryFromProduct(metadata.premiumProduct)
};
}
const ushort* serializePromoMetadataToJson(UMONPromoMetaData* metadata) {
NSDictionary* dict = getPromoMetadataDictionary(metadata);
return serializeJsonToIl2CppString([dict copy]);
}
bool UnityMonetizationPlacementContentIsReady(const void* pPlacementContent) {
UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
return placementContent.ready;
}
bool UnityMonetizationPlacementContentSendCustomEvent(const void* pPlacementContent, const ushort* customEventJson) {
NSString *customEventJsonString = NSStringFromIl2CppString(customEventJson);
NSError *error = nil;
UMONCustomEvent *event = [UMONCustomEvent buildWithJson:customEventJsonString error:&error];
if (error) {
// do nothing
NSLog(@"UnityMonetizationPlacementContentSendCustomEvent error occurred : %@", [error description]);
return false;
} else if (event) {
// make sure details is non-null
UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
[placementContent sendCustomEvent:event];
return true;
} else {
NSLog(@"UnityMonetizationPlacementContentSendCustomEvent was not able to send event");
return false;
}
}
const ushort* UnityMonetizationGetPlacementContentExtras(const void* pPlacementContent) {
if (pPlacementContent) {
UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*) pPlacementContent;
NSDictionary* dict = placementContent.userInfo;
if (dict != nil) {
return serializeJsonToIl2CppString(dict);
}
}
return NULL;
}
bool UnityMonetizationPlacementContentIsRewarded(const void* pPlacementContent) {
UMONRewardablePlacementContent* placementContent = (__bridge UMONRewardablePlacementContent*)pPlacementContent;
return placementContent.rewarded;
}
const ushort* UnityMonetizationPlacementContentGetRewardId(const void* pPlacementContent) {
UMONRewardablePlacementContent* placementContent = (__bridge UMONRewardablePlacementContent*)pPlacementContent;
return Il2CppStringFromNSString(placementContent.rewardId);
}
void UnityMonetizationPlacementContentShowAd(const void* pPlacementContent, UnityMonetizationShowAdStartCallback startCallback, UnityMonetizationShowAdFinishCallback finishCallback) {
UMONShowAdPlacementContent* placementContent = (__bridge UMONShowAdPlacementContent*)pPlacementContent;
UnityPause(1);
[placementContent show:UnityGetGLViewController() withDelegate:[[UnityMonetizationUnityShowAdDelegate alloc] initWithCallbacks:startCallback finishCallback:finishCallback]];
}
const ushort* UnityMonetizationGetPromoAdMetadata(const void* pPlacementContent) {
if (pPlacementContent) {
UMONPromoAdPlacementContent* placementContent = (__bridge UMONPromoAdPlacementContent*)pPlacementContent;
return serializePromoMetadataToJson(placementContent.metadata);
}
return NULL;
}
const char* UnityMonetizationGetPlacementContentType(const void* pPlacementContent) {
UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
// NOTE: il2cpp will free this pointer after invocation!
return UnityAdsCopyString([placementContent.type UTF8String]);
}
int UnityMonetizationGetPlacementContentState(const void* pPlacementContent) {
UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
return placementContent.state;
}
void UnityMonetizationPlacementContentReleaseReference(const void* pPlacementContent) {
CFBridgingRelease(pPlacementContent);
}