1
0

UnityMonetizationPurchasingAdapter.m 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #import <UnityAds/USRVUnityPurchasing.h>
  2. #import "UnityAdsUtilities.h"
  3. #import "UnityJsonAdditions.h"
  4. struct UnityPurchasingProduct {
  5. const ushort* productId;
  6. const ushort* localizedTitle;
  7. const ushort* localizedDescription;
  8. const ushort* localizedPriceString;
  9. const ushort* isoCurrencyCode;
  10. const ushort* productType;
  11. double localizedPrice;
  12. };
  13. struct UnityPurchasingPurchaseCallbacks {
  14. const void* completionHandler;
  15. const void* errorHandler;
  16. };
  17. // Callback called to C# that handles retrieiving the products.
  18. // It is assumed that pDelegate will be the same delegate passed into
  19. // UnityPurchasingInvokeRetrieveProductsCallback.
  20. typedef void (*UnityPurchasingOnRetrieveProductsCallback)(const void *pDelegate);
  21. UnityPurchasingOnRetrieveProductsCallback unityPurchasingOnRetrieveProductsCallback;
  22. // Callback called to C# that handles the purchasing flow.
  23. // It is assumed that pDelegate will be the same delegate passed into
  24. // UnityPurchasingInvokeTransactionCompleteCallback and
  25. // UnityPurchasingInvokeTransactionErrorCallback
  26. typedef void (*UnityPurchasingOnPurchaseCallback)(const char *productId, struct UnityPurchasingPurchaseCallbacks* callbacks);
  27. UnityPurchasingOnPurchaseCallback unityPurchasingOnPurchaseCallback;
  28. struct UnityPurchasingAdapterCallbacks {
  29. UnityPurchasingOnRetrieveProductsCallback unityPurchasingOnRetrieveProductsCallback;
  30. UnityPurchasingOnPurchaseCallback unityPurchasingOnPurchaseCallback;
  31. };
  32. @interface UnityPurchasingAdapterDelegate : NSObject <USRVUnityPurchasingDelegate>
  33. @end
  34. @implementation UnityPurchasingAdapterDelegate
  35. -(void)loadProducts:(void (^)(NSArray<UPURProduct*> *products))completionHandler {
  36. unityPurchasingOnRetrieveProductsCallback(CFBridgingRetain(completionHandler));
  37. }
  38. -(void)purchaseProduct:(NSString *)productId completionHandler:(UnityPurchasingTransactionCompletionHandler)completionHandler errorHandler:(UnityPurchasingTransactionErrorHandler)errorHandler userInfo:(nullable NSDictionary *)extras {
  39. struct UnityPurchasingPurchaseCallbacks* callbacks;
  40. callbacks->completionHandler = CFBridgingRetain(completionHandler);
  41. callbacks->errorHandler = CFBridgingRetain(errorHandler);
  42. unityPurchasingOnPurchaseCallback([productId UTF8String], callbacks);
  43. }
  44. @end
  45. static id <USRVUnityPurchasingDelegate> unityPurchasingAdapterDelegate;
  46. /**
  47. * Sets the callbacks for invoking purchasing adapter functionality into C#.
  48. */
  49. void UnityPurchasingSetPurchasingAdapterCallbacks(struct UnityPurchasingAdapterCallbacks *callbacks) {
  50. unityPurchasingOnRetrieveProductsCallback = callbacks->unityPurchasingOnRetrieveProductsCallback;
  51. unityPurchasingOnPurchaseCallback = callbacks->unityPurchasingOnPurchaseCallback;
  52. if (unityPurchasingAdapterDelegate == NULL) {
  53. unityPurchasingAdapterDelegate = [[UnityPurchasingAdapterDelegate alloc] init];
  54. [USRVUnityPurchasing setDelegate:unityPurchasingAdapterDelegate];
  55. }
  56. }
  57. /**
  58. * Allocates a fixed sized array to be returned as a pointer to C#.
  59. */
  60. const void *UnityPurchasingAdapterAllocateProductsArray(int num) {
  61. NSMutableArray *array = [NSMutableArray arrayWithCapacity:num];
  62. return CFBridgingRetain(array);
  63. }
  64. /**
  65. * Appends the given product to the end of the product array.
  66. */
  67. void UnityPurchasingAddItemToProductsArray(const void *pArray, struct UnityPurchasingProduct *pProduct) {
  68. NSMutableArray *array = (__bridge NSMutableArray *) pArray;
  69. UPURProduct *product = [UPURProduct build:^(UPURProductBuilder* builder) {
  70. builder.productId = NSStringFromIl2CppString(pProduct->productId);
  71. builder.localizedTitle = NSStringFromIl2CppString(pProduct->localizedTitle);
  72. builder.localizedDescription = NSStringFromIl2CppString(pProduct->localizedDescription);
  73. builder.localizedPriceString = NSStringFromIl2CppString(pProduct->localizedPriceString);
  74. builder.isoCurrencyCode = NSStringFromIl2CppString(pProduct->isoCurrencyCode);
  75. builder.productType = NSStringFromIl2CppString(pProduct->productType);
  76. builder.localizedPrice = [[NSDecimalNumber alloc] initWithDouble:pProduct->localizedPrice];
  77. }];
  78. [array addObject:product];
  79. }
  80. /**
  81. * Invokes the given retrieve products delegate with the given products.
  82. */
  83. void UnityPurchasingInvokeRetrieveProductsCallback(const void *pDelegate, const void *pProducts) {
  84. if (pDelegate != NULL && pProducts != NULL) {
  85. NSArray *products = (__bridge NSArray *) pProducts;
  86. UnityPurchasingLoadProductsCompletionHandler completionHandler = (__bridge UnityPurchasingLoadProductsCompletionHandler)pDelegate;
  87. completionHandler(products);
  88. CFBridgingRelease(pDelegate);
  89. CFBridgingRelease(pProducts);
  90. }
  91. }
  92. /**
  93. * Invokes the given transaction delegate's complete callback with the given details
  94. */
  95. void UnityPurchasingInvokeTransactionCompleteCallback(struct UnityPurchasingPurchaseCallbacks* callbacks, ushort* transactionDetailsJson) {
  96. if (callbacks != NULL && transactionDetailsJson != NULL) {
  97. NSString *transactionDetailsJsonString = NSStringFromIl2CppString(transactionDetailsJson);
  98. NSError *error = nil;
  99. UPURTransactionDetails *details = [UPURTransactionDetails buildWithJson:transactionDetailsJsonString error:&error];
  100. if (error) {
  101. // do nothing
  102. } else if (details) {
  103. // make sure details is non-null
  104. UnityPurchasingTransactionCompletionHandler handler = (__bridge UnityPurchasingTransactionCompletionHandler)(callbacks->completionHandler);
  105. handler(details);
  106. }
  107. CFBridgingRelease(callbacks->completionHandler);
  108. CFBridgingRelease(callbacks->errorHandler);
  109. free(callbacks);
  110. }
  111. }
  112. /**
  113. * Invokes the given transaction delegate's error callback with the given error and message.
  114. */
  115. void UnityPurchasingInvokeTransactionErrorCallback(struct UnityPurchasingPurchaseCallbacks* callbacks, ushort* transactionErrorDetailsJson) {
  116. if (callbacks != NULL && transactionErrorDetailsJson != NULL) {
  117. NSString *transactionErrorDetailsJsonString = NSStringFromIl2CppString(transactionErrorDetailsJson);
  118. NSError *error = nil;
  119. UPURTransactionErrorDetails *details = [UPURTransactionErrorDetails buildWithJson: transactionErrorDetailsJsonString error:&error];
  120. if (error) {
  121. // do nothing
  122. } else if (details) {
  123. // make sure details is non-null
  124. UnityPurchasingTransactionErrorHandler handler = (__bridge UnityPurchasingTransactionErrorHandler)(callbacks->errorHandler);
  125. handler(details);
  126. }
  127. CFBridgingRelease(callbacks->completionHandler);
  128. CFBridgingRelease(callbacks->errorHandler);
  129. free(callbacks);
  130. }
  131. }