ATUnityManager.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. //
  2. // ATUnityManager.m
  3. // UnityContainer
  4. //
  5. // Created by Martin Lau on 08/08/2018.
  6. // Copyright © 2018 Martin Lau. All rights reserved.
  7. //
  8. #import "ATUnityManager.h"
  9. #import <AnyThinkSDK/AnyThinkSDK.h>
  10. #import "ATUnityUtilities.h"
  11. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  12. #import <CoreTelephony/CTCarrier.h>
  13. #import "ATBannerAdWrapper.h"
  14. #import "ATNativeAdWrapper.h"
  15. #import "ATInterstitialAdWrapper.h"
  16. #import "ATRewardedVideoWrapper.h"
  17. /*
  18. *class:
  19. *selector:
  20. *arguments:
  21. */
  22. bool at_message_from_unity(const char *msg, void(*callback)(const char*, const char *)) {
  23. NSString *msgStr = [NSString stringWithUTF8String:msg];
  24. NSDictionary *msgDict = [NSJSONSerialization JSONObjectWithData:[msgStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  25. Class class = NSClassFromString(msgDict[@"class"]);
  26. bool ret = false;
  27. ret = [[[class sharedInstance] selWrapperClassWithDict:msgDict callback:callback != NULL ? callback : nil] boolValue];
  28. return ret;
  29. }
  30. int at_get_message_for_unity(const char *msg, void(*callback)(const char*, const char *)) {
  31. NSString *msgStr = [NSString stringWithUTF8String:msg];
  32. NSDictionary *msgDict = [NSJSONSerialization JSONObjectWithData:[msgStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  33. Class class = NSClassFromString(msgDict[@"class"]);
  34. int ret = 0;
  35. ret = [[[class sharedInstance] selWrapperClassWithDict:msgDict callback:callback != NULL ? callback : nil] intValue];
  36. return ret;
  37. }
  38. char * at_get_string_message_for_unity(const char *msg, void(*callback)(const char*, const char *)) {
  39. NSString *msgStr = [NSString stringWithUTF8String:msg];
  40. NSDictionary *msgDict = [NSJSONSerialization JSONObjectWithData:[msgStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  41. Class class = NSClassFromString(msgDict[@"class"]);
  42. NSString *ret = @"";
  43. ret = [[class sharedInstance] selWrapperClassWithDict:msgDict callback:callback != NULL ? callback : nil];
  44. if ([ret UTF8String] == NULL)
  45. return NULL;
  46. char* res = (char*)malloc(strlen([ret UTF8String]) + 1);
  47. strcpy(res, [ret UTF8String]);
  48. return res;
  49. }
  50. @interface ATUnityManager()
  51. @property(nonatomic, readonly) NSMutableDictionary *consentInfo;
  52. @end
  53. @implementation ATUnityManager
  54. +(instancetype)sharedInstance {
  55. static ATUnityManager *sharedInstance = nil;
  56. static dispatch_once_t onceToken;
  57. dispatch_once(&onceToken, ^{
  58. sharedInstance = [[ATUnityManager alloc] init];
  59. });
  60. return sharedInstance;
  61. }
  62. -(instancetype) init {
  63. self = [super init];
  64. if (self != nil) {
  65. _consentInfo = [NSMutableDictionary dictionary];
  66. }
  67. return self;
  68. }
  69. - (id)selWrapperClassWithDict:(NSDictionary *)dict callback:(void(*)(const char*))callback {
  70. NSString *selector = dict[@"selector"];
  71. NSArray<NSString*>* arguments = dict[@"arguments"];
  72. NSString *firstObject = @"";
  73. NSString *lastObject = @"";
  74. if (![ATUnityUtilities isEmpty:arguments]) {
  75. for (int i = 0; i < arguments.count; i++) {
  76. if (i == 0) { firstObject = arguments[i]; }
  77. else { lastObject = arguments[i]; }
  78. }
  79. }
  80. if ([selector isEqualToString:@"startSDKWithAppID:appKey:"]) {
  81. return [NSNumber numberWithBool:[self startSDKWithAppID:firstObject appKey:lastObject]];
  82. } else if ([selector isEqualToString:@"subjectToGDPR"]) {
  83. return [NSNumber numberWithBool:[self subjectToGDPR]];
  84. }else if ([selector isEqualToString:@"showGDPRConsentDialog:"]) {
  85. [self showGDPRConsentDialog:callback];
  86. } else if ([selector isEqualToString:@"getUserLocation:"]) {
  87. [self getUserLocation:callback];
  88. } else if ([selector isEqualToString:@"setPurchaseFlag"]) {
  89. [self setPurchaseFlag];
  90. } else if ([selector isEqualToString:@"clearPurchaseFlag"]) {
  91. [self clearPurchaseFlag];
  92. } else if ([selector isEqualToString:@"purchaseFlag"]) {
  93. return [NSNumber numberWithBool:[self purchaseFlag]];
  94. } else if ([selector isEqualToString:@"setChannel:"]) {
  95. [self setChannel:firstObject];
  96. } else if ([selector isEqualToString:@"setSubChannel:"]) {
  97. [self setSubChannel:firstObject];
  98. } else if ([selector isEqualToString:@"setCustomData:"]) {
  99. [self setCustomData:firstObject];
  100. } else if ([selector isEqualToString:@"setCustomData:forPlacementID:"]) {
  101. [self setCustomData:firstObject forPlacementID:lastObject];
  102. } else if ([selector isEqualToString:@"setDebugLog:"]) {
  103. [self setDebugLog:firstObject];
  104. } else if ([selector isEqualToString:@"getDataConsent"]) {
  105. return [NSNumber numberWithInt:[self getDataConsent]];
  106. } else if ([selector isEqualToString:@"setDataConsent:"]) {
  107. [self setDataConsent:[NSNumber numberWithInt:firstObject.intValue]];
  108. } else if ([selector isEqualToString:@"inDataProtectionArea"]) {
  109. return [NSNumber numberWithBool:[self inDataProtectionArea]];
  110. } else if ([selector isEqualToString:@"deniedUploadDeviceInfo:"]) {
  111. [self deniedUploadDeviceInfo:firstObject];
  112. } else if ([selector isEqualToString:@"setDataConsent:network:"]) {
  113. [self setDataConsent:firstObject network:[NSNumber numberWithInt:lastObject.intValue]];
  114. } else if ([selector isEqualToString:@"setExcludeBundleIdArray:"]) {
  115. [self setExcludeBundleIdArray:firstObject];
  116. } else if ([selector isEqualToString:@"setExludePlacementid:unitIDArray:"]) {
  117. [self setExludePlacementid:firstObject unitIDArray:lastObject];
  118. } else if ([selector isEqualToString:@"setSDKArea:"]) {
  119. [self setSDKArea:[NSNumber numberWithInt:firstObject.intValue]];
  120. } else if ([selector isEqualToString:@"getArea:"]) {
  121. [self getArea:callback];
  122. } else if ([selector isEqualToString:@"setWXStatus:"]) {
  123. [self setWXStatus:[NSNumber numberWithDouble:firstObject.boolValue]];
  124. } else if ([selector isEqualToString:@"setLocationLongitude:dimension:"]) {
  125. [self setLocationLongitude:[NSNumber numberWithDouble:firstObject.doubleValue] dimension:[NSNumber numberWithDouble:lastObject.doubleValue]];
  126. }else if ([selector isEqualToString:@"showDebuggerUI:"]) {
  127. [self showDebuggerUI:firstObject];
  128. }
  129. return nil;
  130. }
  131. -(BOOL) startSDKWithAppID:(NSString*)appID appKey:(NSString*)appKey {
  132. [[ATSDKGlobalSetting sharedManager] setSystemPlatformType:ATSystemPlatformTypeUnity];
  133. return [[ATAPI sharedInstance] startWithAppID:appID appKey:appKey error:nil];
  134. }
  135. - (BOOL) subjectToGDPR {
  136. return [@[@"AT", @"BE", @"BG", @"HR", @"CY", @"CZ", @"DK", @"EE", @"FI", @"FR", @"DE", @"GR", @"HU", @"IS", @"IE", @"IT", @"LV", @"LI", @"LT", @"LU", @"MT", @"NL", @"NO", @"PL", @"PT", @"RO", @"SK", @"SI", @"ES", @"SE", @"GB", @"UK"] containsObject:[[CTTelephonyNetworkInfo new].subscriberCellularProvider.isoCountryCode length] > 0 ? [[CTTelephonyNetworkInfo new].subscriberCellularProvider.isoCountryCode uppercaseString] : @""];
  137. }
  138. -(void) showGDPRConsentDialog:(void(*)(const char*))callback {
  139. [[ATAPI sharedInstance] showGDPRConsentDialogInViewController:[UIApplication sharedApplication].delegate.window.rootViewController dismissalCallback:^{
  140. if (callback != NULL) { callback(@"".UTF8String); }
  141. }];
  142. }
  143. -(void) getUserLocation:(void(*)(const char*))callback {
  144. [[ATAPI sharedInstance] getUserLocationWithCallback:^(ATUserLocation location) {
  145. if (callback != NULL) { callback(@(location).stringValue.UTF8String); }
  146. }];
  147. }
  148. -(void) setPurchaseFlag {
  149. }
  150. -(void) clearPurchaseFlag {
  151. }
  152. -(BOOL) purchaseFlag {
  153. return NO;
  154. }
  155. -(void) setChannel:(NSString*)channel {
  156. [[ATSDKGlobalSetting sharedManager] setChannel:channel];
  157. }
  158. -(void) setSubChannel:(NSString*)subChannel {
  159. [[ATSDKGlobalSetting sharedManager] setSubchannel:subChannel];
  160. }
  161. -(void) setCustomData:(NSString*)customDataStr {
  162. if ([customDataStr isKindOfClass:[NSString class]] && [customDataStr length] > 0) {
  163. NSDictionary *customData = [NSJSONSerialization JSONObjectWithData:[customDataStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  164. [[ATSDKGlobalSetting sharedManager] setCustomData:customData];
  165. }
  166. }
  167. -(void) setCustomData:(NSString*)customDataStr forPlacementID:(NSString*)placementID {
  168. if ([customDataStr isKindOfClass:[NSString class]] && [customDataStr length] > 0) {
  169. NSDictionary *customData = [NSJSONSerialization JSONObjectWithData:[customDataStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  170. [[ATSDKGlobalSetting sharedManager] setCustomData:customData forPlacementID:placementID];
  171. }
  172. }
  173. -(void) setDebugLog:(NSString*)flagStr {
  174. [ATAPI setLogEnabled:[flagStr boolValue]];
  175. }
  176. -(int) getDataConsent {
  177. return [@{@(ATDataConsentSetPersonalized):@0, @(ATDataConsentSetNonpersonalized):@1, @(ATDataConsentSetUnknown):@2}[@([ATAPI sharedInstance].dataConsentSet)] intValue];
  178. }
  179. -(void) setDataConsent:(NSNumber*)dataConsent {
  180. [[ATAPI sharedInstance] setDataConsentSet:[@{@0:@(ATDataConsentSetPersonalized), @1:@(ATDataConsentSetNonpersonalized), @2:@(ATDataConsentSetUnknown)}[dataConsent] integerValue] consentString:@{}];
  181. }
  182. -(BOOL) inDataProtectionArea {
  183. return [[ATAPI sharedInstance] inDataProtectionArea];
  184. }
  185. -(void) deniedUploadDeviceInfo:(NSString *)deniedInfo {
  186. NSLog(@"ATUnityManager::deniedUploadDeviceInfo = %@", deniedInfo);
  187. if (![ATUnityUtilities isEmpty:deniedInfo]) {
  188. NSArray *deniedInfoArray = [NSJSONSerialization JSONObjectWithData:[deniedInfo dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  189. [[ATSDKGlobalSetting sharedManager] setDeniedUploadInfoArray:deniedInfoArray];
  190. }
  191. }
  192. /*
  193. *
  194. */
  195. -(void) setDataConsent:(NSString*)consentJsonString network:(NSNumber*)network {
  196. NSLog(@"API was deprecated, please use SetDataConsent(int consent)");
  197. // NSLog(@"constenJsonString = %@, network = %@", consentJsonString, network);
  198. // NSDictionary *networks = @{@1:kATNetworkNameFacebook, @2:kATNetworkNameAdmob, @3:kATNetworkNameInmobi, @4:kATNetworkNameFlurry, @5:kATNetworkNameApplovin, @6:kATNetworkNameMintegral, @8:kATNetworkNameGDT, @9:kATNetworkNameChartboost, @10:kATNetworkNameTapjoy, @11:kATNetworkNameIronSource, @12:kATNetworkNameUnityAds, @13:kATNetworkNameVungle, @14:kATNetworkNameAdColony, @1:kATNetworkNameOneway, @18:kATNetworkNameMobPower, @20:kATNetworkNameYeahmobi, @21:kATNetworkNameAppnext, @22:kATNetworkNameBaidu};
  199. // if ([networks containsObjectForKey:network]) {
  200. // if (([consentJsonString isKindOfClass:[NSString class]] && [consentJsonString dataUsingEncoding:NSUTF8StringEncoding] != nil)) {
  201. // NSDictionary *consentDict = [NSJSONSerialization JSONObjectWithData:[consentJsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  202. // _consentInfo[networks[network]] = [consentDict containsObjectForKey:@"value"] ? consentDict[@"value"] : consentDict;
  203. // } else {
  204. // [_consentInfo removeObjectForKey:networks[network]];
  205. // }
  206. // NSLog(@"consentInfo = %@", _consentInfo);
  207. // if ([_consentInfo[kATNetworkNameMintegral] isKindOfClass:[NSDictionary class]]) {
  208. // NSMutableDictionary<NSNumber*, NSNumber*>* mintegralInfo = [NSMutableDictionary<NSNumber*, NSNumber*> dictionary];
  209. // [_consentInfo[kATNetworkNameMintegral] enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
  210. // if ([key respondsToSelector:@selector(integerValue)] && [obj respondsToSelector:@selector(integerValue)]) mintegralInfo[@([key integerValue])] = @([obj integerValue]);
  211. // }];
  212. // NSLog(@"consentInfo = %@, %@", [((NSDictionary*)_consentInfo[kATNetworkNameMintegral]).allKeys[0] class], [((NSDictionary*)_consentInfo[kATNetworkNameMintegral]).allValues[0] class]);
  213. // _consentInfo[kATNetworkNameMintegral] = mintegralInfo;
  214. // NSLog(@"consentInfo = %@, %@", [((NSDictionary*)_consentInfo[kATNetworkNameMintegral]).allKeys[0] class], [((NSDictionary*)_consentInfo[kATNetworkNameMintegral]).allValues[0] class]);
  215. // }
  216. // [[ATAPI sharedInstance] setNetworkConsentInfo:_consentInfo];
  217. // }
  218. }
  219. -(void) setExcludeBundleIdArray:(NSString*)bundleIds {
  220. NSLog(@"ATUnityManager::setExcludeBundleIdArray = %@", bundleIds);
  221. if (![ATUnityUtilities isEmpty:bundleIds]) {
  222. NSArray *bundleIdArray = [NSJSONSerialization JSONObjectWithData:[bundleIds dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  223. [[ATSDKGlobalSetting sharedManager] setExludeAppleIdArray:bundleIdArray];
  224. }
  225. }
  226. -(void) setExludePlacementid:(NSString*)placementID unitIDArray:(NSString*)adsourceIds {
  227. NSLog(@"ATUnityManager::setExludePlacementid=%@ adsourceIds= %@",placementID ,adsourceIds);
  228. if (![ATUnityUtilities isEmpty:adsourceIds]) {
  229. NSArray *adsourceIdArray = [NSJSONSerialization JSONObjectWithData:[adsourceIds dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
  230. [[ATAdManager sharedManager] setExludePlacementid:placementID
  231. unitIDArray:adsourceIdArray];
  232. }
  233. }
  234. -(void) setSDKArea:(NSNumber*)area {
  235. NSLog(@"ATUnityManager::setSDKArea=%@",area);
  236. }
  237. -(void) getArea:(void(*)(const char *))callback {
  238. NSLog(@"ATUnityManager::getArea");
  239. NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];
  240. [[ATAPI sharedInstance] getAreaSuccess:^(NSString *areaCodeStr) {
  241. NSLog(@"ATUnityManager::getArea:Success:%@",areaCodeStr);
  242. if (areaCodeStr != nil) {
  243. resultDict[@"areaCode"] = areaCodeStr;
  244. if (callback != NULL) { callback(resultDict.jsonString.UTF8String); }
  245. }
  246. } failure:^(NSError *error) {
  247. NSLog(@"ATUnityManager::getArea:failure:%@",error.domain);
  248. if (error.domain != nil) {
  249. resultDict[@"errorMsg"] = error.domain;
  250. if (callback != NULL) { callback(resultDict.jsonString.UTF8String); }
  251. }
  252. }];
  253. }
  254. -(void) setWXStatus:(NSNumber *)flag {
  255. NSLog(@"ATUnityManager::setWXStatus=%d",flag.boolValue);
  256. [ATSDKGlobalSetting sharedManager].isInstallWX = flag.boolValue;
  257. }
  258. -(void) setLocationLongitude:(NSNumber*)longitude dimension:(NSNumber*)latitude {
  259. NSLog(@"ATUnityManager::setLocationLongitude=%@ dimension=%@",longitude,latitude);
  260. [[ATSDKGlobalSetting sharedManager] setLocationLongitude:longitude.doubleValue dimension:latitude.doubleValue];
  261. }
  262. - (void)showDebuggerUI:(NSString *)debugKey {
  263. NSLog(@"ATUnityManager::showDebuggerUI with key: %@", debugKey);
  264. NSString *classStr = @"ATDebuggerAPI";
  265. Class debuggerAPIClass = NSClassFromString(classStr);
  266. if(!debuggerAPIClass) {
  267. NSLog(@"ATUnityManager::showDebuggerUI - NO %@", classStr);
  268. return;
  269. }
  270. SEL sharedInstanceSel = @selector(sharedInstance);
  271. if (![debuggerAPIClass respondsToSelector:sharedInstanceSel]) {
  272. NSLog(@"ATUnityManager::showDebuggerUI - NO sharedInstance selector");
  273. return;
  274. }
  275. // 通过sharedInstanceSel获取单例对象
  276. id debugger = [debuggerAPIClass performSelector:sharedInstanceSel];
  277. NSString *functionStr = @"showDebuggerInViewController:showType:debugkey:";
  278. SEL sel = NSSelectorFromString(functionStr);
  279. if ([debugger respondsToSelector:sel]) {
  280. NSMethodSignature *signature = [debugger methodSignatureForSelector:sel];
  281. if (signature) {
  282. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
  283. [invocation setTarget:debugger];
  284. [invocation setSelector:sel];
  285. // 设置参数
  286. UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
  287. UIViewController *rootViewController = keyWindow.rootViewController;
  288. NSNumber *showType = @1; // 假设 showType 为1
  289. [invocation setArgument:&rootViewController atIndex:2]; // 注意:参数索引从2开始,0和1被target和selector占用
  290. [invocation setArgument:&showType atIndex:3];
  291. [invocation setArgument:&debugKey atIndex:4];
  292. // 调用方法
  293. [invocation invoke];
  294. }
  295. } else {
  296. NSLog(@"ATUnityManager::showDebuggerUI - NO %@", functionStr);
  297. }
  298. }
  299. @end