ATBaseUnityWrapper.m 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. //
  2. // ATBaseUnityWrapper.m
  3. // UnityContainer
  4. //
  5. // Created by Martin Lau on 08/08/2018.
  6. // Copyright © 2018 Martin Lau. All rights reserved.
  7. //
  8. #import "ATBaseUnityWrapper.h"
  9. #import "ATUnityUtilities.h"
  10. #import "ATUnitySafeThreadDictionary.h"
  11. @interface ATBaseUnityWrapper()
  12. @property(nonatomic, strong) ATUnitySafeThreadDictionary<NSString*, NSValue*> *callbacks;
  13. @end
  14. @implementation ATBaseUnityWrapper
  15. +(instancetype) sharedInstance {
  16. return nil;
  17. }
  18. -(instancetype) init {
  19. self = [super init];
  20. if (self != nil) {
  21. _callbacks = [ATUnitySafeThreadDictionary<NSString*, NSValue*> dictionary];
  22. }
  23. return self;
  24. }
  25. -(void) setCallBack:(void (*)(const char *, const char *))callback forKey:(NSString *)key {
  26. __weak ATBaseUnityWrapper* weakSelf = self;
  27. if (callback != NULL && [key length] > 0) {
  28. [self.callbacks setValue:[NSValue valueWithPointer:(void*)callback] forKey:key];
  29. }
  30. }
  31. -(void) removeCallbackForKey:(NSString *)key {
  32. if ([key length] > 0) {
  33. [self.callbacks removeObjectForKey:key];
  34. }
  35. }
  36. -(void(*)(const char*, const char *)) callbackForKey:(NSString*)key {
  37. __block void(*callback)(const char*, const char *) = NULL;
  38. if ([key length] > 0) {
  39. callback = (void(*)(const char*, const char *))[self.callbacks[key] pointerValue];
  40. }
  41. return callback;
  42. }
  43. -(NSString*)scriptWrapperClass {
  44. return @"";
  45. }
  46. - (id)selWrapperClassWithDict:(NSDictionary *)dict callback:(void(*)(const char*, const char*))callback {
  47. return nil;
  48. }
  49. -(void) invokeCallback:(NSString*)callback placementID:(NSString*)placementID error:(NSError*)error extra:(NSDictionary*)extraParams {
  50. __block NSDictionary* extra = extraParams;
  51. dispatch_async(dispatch_get_main_queue(), ^{
  52. @try {
  53. if ([self callbackForKey:placementID] != NULL) {
  54. if ([callback isKindOfClass:[NSString class]] && [callback length] > 0) {
  55. NSMutableDictionary *paraDict = [NSMutableDictionary dictionaryWithObject:callback forKey:@"callback"];
  56. NSMutableDictionary *msgDict = [NSMutableDictionary dictionary];
  57. if (![ATUnityUtilities isEmpty:extra]) {
  58. // 过滤SDK返回参数的 user_load_extra_data 中不支持的类型
  59. if (extra[kATUnityUserExtraDataKey] != nil) {
  60. NSMutableDictionary *extraDictM = [NSMutableDictionary dictionaryWithDictionary:extra];
  61. NSMutableDictionary *extraDataTemp = [NSMutableDictionary dictionary];
  62. NSMutableDictionary *extraDataDictM = [NSMutableDictionary dictionaryWithDictionary:extra[kATUnityUserExtraDataKey]];
  63. for (NSString *key in extraDataDictM.allKeys) {
  64. if ([extraDataDictM[key] isKindOfClass:[NSString class]] || [extraDataDictM[key] isKindOfClass:[NSNumber class]]) {
  65. [extraDataTemp setValue:extraDataDictM[key] forKey:key];
  66. }
  67. }
  68. if ([extraDataTemp count]) {
  69. [extraDictM setValue:extraDataTemp forKey:kATUnityUserExtraDataKey];
  70. } else {
  71. [extraDictM removeObjectForKey:kATUnityUserExtraDataKey];
  72. }
  73. extra = extraDictM;
  74. }
  75. if (extra[@"extra"] != nil) {
  76. msgDict[@"extra"] = extra[@"extra"];
  77. msgDict[@"rewarded"] = extra[@"rewarded"];
  78. } else {
  79. msgDict[@"extra"] = extra;
  80. }
  81. }
  82. paraDict[@"msg"] = msgDict;
  83. if ([placementID isKindOfClass:[NSString class]] && ![ATUnityUtilities isEmpty:placementID]) {
  84. msgDict[@"placement_id"] = placementID;
  85. };
  86. if ([error isKindOfClass:[NSError class]]) {
  87. NSMutableDictionary *errorDict = [NSMutableDictionary dictionaryWithObject:[NSString stringWithFormat:@"%ld", error.code] forKey:@"code"];
  88. if (![ATUnityUtilities isEmpty:error.userInfo[NSLocalizedDescriptionKey]]) {
  89. errorDict[@"desc"] = [NSString stringWithFormat:@"%@",error.userInfo[NSLocalizedDescriptionKey]];
  90. } else {
  91. errorDict[@"desc"] = @"";
  92. }
  93. if (![ATUnityUtilities isEmpty:error.userInfo[NSLocalizedFailureReasonErrorKey]]) {
  94. errorDict[@"reason"] = [NSString stringWithFormat:@"%@",error.userInfo[NSLocalizedFailureReasonErrorKey]];
  95. } else {
  96. errorDict[@"reason"] = @"";
  97. }
  98. msgDict[@"error"] = errorDict;
  99. }
  100. [self callbackForKey:placementID]([self scriptWrapperClass].UTF8String, paraDict.jsonString.UTF8String);
  101. }
  102. }
  103. } @catch (NSException *exception) {
  104. } @finally {}
  105. });
  106. }
  107. - (NSArray *)jsonStrToArray:(NSString *)jsonString{
  108. NSError *error;
  109. NSArray *array = [NSArray array];
  110. @try {
  111. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  112. array = [NSJSONSerialization JSONObjectWithData:jsonData
  113. options:NSJSONReadingMutableContainers
  114. error:&error];
  115. if(error){
  116. return [NSArray array];
  117. }
  118. } @catch (NSException *exception) {
  119. NSLog(@"jsonStrToArray --- exception:%@",exception);
  120. } @finally {}
  121. return array;
  122. }
  123. @end