1
0

UnityMonetizationDecisionWrapper.m 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #import <UnityAds/UnityMonetization.h>
  2. #import <Unity/UnityInterface.h>
  3. #import "UnityAdsUtilities.h"
  4. #import "UnityJsonAdditions.h"
  5. typedef void (*UnityMonetizationShowAdStartCallback)();
  6. typedef void (*UnityMonetizationShowAdFinishCallback)(int finishState);
  7. @interface UnityMonetizationUnityShowAdDelegate : NSObject<UMONShowAdDelegate>
  8. @property (nonatomic) UnityMonetizationShowAdStartCallback startCallback;
  9. @property (nonatomic) UnityMonetizationShowAdFinishCallback finishCallback;
  10. -(instancetype)initWithCallbacks:(UnityMonetizationShowAdStartCallback)startCallback finishCallback:(UnityMonetizationShowAdFinishCallback)finishCallback;
  11. @end
  12. @implementation UnityMonetizationUnityShowAdDelegate
  13. - (instancetype)initWithCallbacks:(UnityMonetizationShowAdStartCallback)startCallback finishCallback:(UnityMonetizationShowAdFinishCallback)finishCallback {
  14. if (self = [super init]) {
  15. self.startCallback = startCallback;
  16. self.finishCallback = finishCallback;
  17. }
  18. return self;
  19. }
  20. -(void)unityAdsDidFinish:(NSString *)placementId withFinishState:(UnityAdsFinishState)finishState {
  21. UnityPause(0);
  22. if (self.finishCallback) {
  23. self.finishCallback(finishState);
  24. }
  25. }
  26. -(void)unityAdsDidStart:(NSString *)placementId {
  27. if (self.startCallback) {
  28. self.startCallback();
  29. }
  30. }
  31. @end
  32. const ushort* Il2CppStringFromNSString(NSString* str) {
  33. size_t len = str.length;
  34. NSData* cStr = [str dataUsingEncoding:NSUTF16LittleEndianStringEncoding];
  35. ushort* buffer = (ushort*)malloc(len * sizeof(ushort) + 1);
  36. memset(buffer, 0, (len + 1) * sizeof(ushort));
  37. [cStr getBytes:buffer length:len * sizeof(ushort)];
  38. return buffer;
  39. }
  40. const ushort* serializeJsonToIl2CppString(NSDictionary* dict) {
  41. NSError* error;
  42. NSData* data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
  43. NSString* str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  44. if (data != nil) {
  45. return Il2CppStringFromNSString(str);
  46. }
  47. return NULL;
  48. }
  49. NSDictionary* getJsonDictionaryFromItem(UMONItem* item) {
  50. return @{
  51. @"itemType": item.type ? item.type : [NSNull null],
  52. @"productId": item.productId ? item.productId : [NSNull null],
  53. @"quantity": @(item.quantity)
  54. };
  55. }
  56. NSArray* getJsonArrayFromItemArray(NSArray<UMONItem*>* items) {
  57. NSMutableArray* array = [[NSMutableArray alloc] init];
  58. for (UMONItem* item in items) {
  59. [array addObject:getJsonDictionaryFromItem(item)];
  60. }
  61. return [array copy];
  62. }
  63. BOOL isValidPrice(NSDecimalNumber* number) {
  64. return number && ![number isEqualToNumber:[NSDecimalNumber notANumber]];
  65. }
  66. NSDictionary* getJsonDictionaryFromProduct(UPURProduct* product) {
  67. return @{
  68. @"productId": product.productId ? product.productId : [NSNull null],
  69. @"localizedTitle": product.localizedTitle ? product.localizedTitle : [NSNull null],
  70. @"localizedDescription": product.localizedDescription ? product.localizedDescription : [NSNull null],
  71. @"localizedPriceString": product.localizedPriceString ? product.localizedPriceString : [NSNull null],
  72. @"isoCurrencyCode": product.isoCurrencyCode ? product.isoCurrencyCode : [NSNull null],
  73. @"localizedPrice": isValidPrice(product.localizedPrice) ? product.localizedPrice : [NSNull null],
  74. @"productType": product.productType ? product.productType : [NSNull null]
  75. };
  76. }
  77. NSDictionary* getPromoMetadataDictionary(UMONPromoMetaData* metadata) {
  78. return @{
  79. @"impressionDate": metadata.impressionDate ? @([metadata.impressionDate timeIntervalSince1970] * 1000) : [NSNull null],
  80. @"offerDuration": @(metadata.offerDuration),
  81. @"costs": getJsonArrayFromItemArray(metadata.costs),
  82. @"payouts": getJsonArrayFromItemArray(metadata.payouts),
  83. @"premiumProduct": getJsonDictionaryFromProduct(metadata.premiumProduct)
  84. };
  85. }
  86. const ushort* serializePromoMetadataToJson(UMONPromoMetaData* metadata) {
  87. NSDictionary* dict = getPromoMetadataDictionary(metadata);
  88. return serializeJsonToIl2CppString([dict copy]);
  89. }
  90. bool UnityMonetizationPlacementContentIsReady(const void* pPlacementContent) {
  91. UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
  92. return placementContent.ready;
  93. }
  94. bool UnityMonetizationPlacementContentSendCustomEvent(const void* pPlacementContent, const ushort* customEventJson) {
  95. NSString *customEventJsonString = NSStringFromIl2CppString(customEventJson);
  96. NSError *error = nil;
  97. UMONCustomEvent *event = [UMONCustomEvent buildWithJson:customEventJsonString error:&error];
  98. if (error) {
  99. // do nothing
  100. NSLog(@"UnityMonetizationPlacementContentSendCustomEvent error occurred : %@", [error description]);
  101. return false;
  102. } else if (event) {
  103. // make sure details is non-null
  104. UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
  105. [placementContent sendCustomEvent:event];
  106. return true;
  107. } else {
  108. NSLog(@"UnityMonetizationPlacementContentSendCustomEvent was not able to send event");
  109. return false;
  110. }
  111. }
  112. const ushort* UnityMonetizationGetPlacementContentExtras(const void* pPlacementContent) {
  113. if (pPlacementContent) {
  114. UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*) pPlacementContent;
  115. NSDictionary* dict = placementContent.userInfo;
  116. if (dict != nil) {
  117. return serializeJsonToIl2CppString(dict);
  118. }
  119. }
  120. return NULL;
  121. }
  122. bool UnityMonetizationPlacementContentIsRewarded(const void* pPlacementContent) {
  123. UMONRewardablePlacementContent* placementContent = (__bridge UMONRewardablePlacementContent*)pPlacementContent;
  124. return placementContent.rewarded;
  125. }
  126. const ushort* UnityMonetizationPlacementContentGetRewardId(const void* pPlacementContent) {
  127. UMONRewardablePlacementContent* placementContent = (__bridge UMONRewardablePlacementContent*)pPlacementContent;
  128. return Il2CppStringFromNSString(placementContent.rewardId);
  129. }
  130. void UnityMonetizationPlacementContentShowAd(const void* pPlacementContent, UnityMonetizationShowAdStartCallback startCallback, UnityMonetizationShowAdFinishCallback finishCallback) {
  131. UMONShowAdPlacementContent* placementContent = (__bridge UMONShowAdPlacementContent*)pPlacementContent;
  132. UnityPause(1);
  133. [placementContent show:UnityGetGLViewController() withDelegate:[[UnityMonetizationUnityShowAdDelegate alloc] initWithCallbacks:startCallback finishCallback:finishCallback]];
  134. }
  135. const ushort* UnityMonetizationGetPromoAdMetadata(const void* pPlacementContent) {
  136. if (pPlacementContent) {
  137. UMONPromoAdPlacementContent* placementContent = (__bridge UMONPromoAdPlacementContent*)pPlacementContent;
  138. return serializePromoMetadataToJson(placementContent.metadata);
  139. }
  140. return NULL;
  141. }
  142. const char* UnityMonetizationGetPlacementContentType(const void* pPlacementContent) {
  143. UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
  144. // NOTE: il2cpp will free this pointer after invocation!
  145. return UnityAdsCopyString([placementContent.type UTF8String]);
  146. }
  147. int UnityMonetizationGetPlacementContentState(const void* pPlacementContent) {
  148. UMONPlacementContent* placementContent = (__bridge UMONPlacementContent*)pPlacementContent;
  149. return placementContent.state;
  150. }
  151. void UnityMonetizationPlacementContentReleaseReference(const void* pPlacementContent) {
  152. CFBridgingRelease(pPlacementContent);
  153. }