2023-01-29 12:44:57 +08:00
|
|
|
//
|
|
|
|
|
// ATBaseUnityWrapper.m
|
|
|
|
|
// UnityContainer
|
|
|
|
|
//
|
|
|
|
|
// Created by Martin Lau on 08/08/2018.
|
|
|
|
|
// Copyright © 2018 Martin Lau. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#import "ATBaseUnityWrapper.h"
|
|
|
|
|
#import "ATUnityUtilities.h"
|
2025-03-13 17:49:41 +08:00
|
|
|
#import "ATUnitySafeThreadDictionary.h"
|
2023-01-29 12:44:57 +08:00
|
|
|
@interface ATBaseUnityWrapper()
|
2025-03-13 17:49:41 +08:00
|
|
|
@property(nonatomic, strong) ATUnitySafeThreadDictionary<NSString*, NSValue*> *callbacks;
|
2023-01-29 12:44:57 +08:00
|
|
|
@end
|
|
|
|
|
@implementation ATBaseUnityWrapper
|
|
|
|
|
+(instancetype) sharedInstance {
|
|
|
|
|
return nil;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(instancetype) init {
|
|
|
|
|
self = [super init];
|
|
|
|
|
if (self != nil) {
|
2025-03-13 17:49:41 +08:00
|
|
|
_callbacks = [ATUnitySafeThreadDictionary<NSString*, NSValue*> dictionary];
|
|
|
|
|
|
2023-01-29 12:44:57 +08:00
|
|
|
}
|
|
|
|
|
return self;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(void) setCallBack:(void (*)(const char *, const char *))callback forKey:(NSString *)key {
|
|
|
|
|
__weak ATBaseUnityWrapper* weakSelf = self;
|
2025-03-13 17:49:41 +08:00
|
|
|
if (callback != NULL && [key length] > 0) {
|
|
|
|
|
[self.callbacks setValue:[NSValue valueWithPointer:(void*)callback] forKey:key];
|
|
|
|
|
}
|
2023-01-29 12:44:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(void) removeCallbackForKey:(NSString *)key {
|
2025-03-13 17:49:41 +08:00
|
|
|
if ([key length] > 0) {
|
|
|
|
|
[self.callbacks removeObjectForKey:key];
|
|
|
|
|
}
|
2023-01-29 12:44:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(void(*)(const char*, const char *)) callbackForKey:(NSString*)key {
|
|
|
|
|
__block void(*callback)(const char*, const char *) = NULL;
|
|
|
|
|
if ([key length] > 0) {
|
2025-03-13 17:49:41 +08:00
|
|
|
callback = (void(*)(const char*, const char *))[self.callbacks[key] pointerValue];
|
2023-01-29 12:44:57 +08:00
|
|
|
}
|
|
|
|
|
return callback;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(NSString*)scriptWrapperClass {
|
|
|
|
|
return @"";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (id)selWrapperClassWithDict:(NSDictionary *)dict callback:(void(*)(const char*, const char*))callback {
|
|
|
|
|
return nil;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-13 17:49:41 +08:00
|
|
|
-(void) invokeCallback:(NSString*)callback placementID:(NSString*)placementID error:(NSError*)error extra:(NSDictionary*)extraParams {
|
|
|
|
|
|
|
|
|
|
__block NSDictionary* extra = extraParams;
|
|
|
|
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
@try {
|
2023-01-29 12:44:57 +08:00
|
|
|
|
2025-03-13 17:49:41 +08:00
|
|
|
if ([self callbackForKey:placementID] != NULL) {
|
|
|
|
|
if ([callback isKindOfClass:[NSString class]] && [callback length] > 0) {
|
|
|
|
|
|
|
|
|
|
NSMutableDictionary *paraDict = [NSMutableDictionary dictionaryWithObject:callback forKey:@"callback"];
|
|
|
|
|
|
|
|
|
|
NSMutableDictionary *msgDict = [NSMutableDictionary dictionary];
|
|
|
|
|
|
|
|
|
|
if (![ATUnityUtilities isEmpty:extra]) {
|
|
|
|
|
|
|
|
|
|
// 过滤SDK返回参数的 user_load_extra_data 中不支持的类型
|
|
|
|
|
if (extra[kATUnityUserExtraDataKey] != nil) {
|
|
|
|
|
NSMutableDictionary *extraDictM = [NSMutableDictionary dictionaryWithDictionary:extra];
|
|
|
|
|
NSMutableDictionary *extraDataTemp = [NSMutableDictionary dictionary];
|
|
|
|
|
NSMutableDictionary *extraDataDictM = [NSMutableDictionary dictionaryWithDictionary:extra[kATUnityUserExtraDataKey]];
|
|
|
|
|
for (NSString *key in extraDataDictM.allKeys) {
|
|
|
|
|
if ([extraDataDictM[key] isKindOfClass:[NSString class]] || [extraDataDictM[key] isKindOfClass:[NSNumber class]]) {
|
|
|
|
|
[extraDataTemp setValue:extraDataDictM[key] forKey:key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ([extraDataTemp count]) {
|
|
|
|
|
[extraDictM setValue:extraDataTemp forKey:kATUnityUserExtraDataKey];
|
|
|
|
|
} else {
|
|
|
|
|
[extraDictM removeObjectForKey:kATUnityUserExtraDataKey];
|
|
|
|
|
}
|
|
|
|
|
extra = extraDictM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (extra[@"extra"] != nil) {
|
|
|
|
|
msgDict[@"extra"] = extra[@"extra"];
|
|
|
|
|
msgDict[@"rewarded"] = extra[@"rewarded"];
|
|
|
|
|
} else {
|
|
|
|
|
msgDict[@"extra"] = extra;
|
2023-09-04 16:57:46 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-13 17:49:41 +08:00
|
|
|
|
|
|
|
|
paraDict[@"msg"] = msgDict;
|
|
|
|
|
|
|
|
|
|
if ([placementID isKindOfClass:[NSString class]] && ![ATUnityUtilities isEmpty:placementID]) {
|
|
|
|
|
msgDict[@"placement_id"] = placementID;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if ([error isKindOfClass:[NSError class]]) {
|
|
|
|
|
|
|
|
|
|
NSMutableDictionary *errorDict = [NSMutableDictionary dictionaryWithObject:[NSString stringWithFormat:@"%ld", error.code] forKey:@"code"];
|
|
|
|
|
|
|
|
|
|
if (![ATUnityUtilities isEmpty:error.userInfo[NSLocalizedDescriptionKey]]) {
|
|
|
|
|
errorDict[@"desc"] = [NSString stringWithFormat:@"%@",error.userInfo[NSLocalizedDescriptionKey]];
|
|
|
|
|
} else {
|
|
|
|
|
errorDict[@"desc"] = @"";
|
|
|
|
|
}
|
|
|
|
|
if (![ATUnityUtilities isEmpty:error.userInfo[NSLocalizedFailureReasonErrorKey]]) {
|
|
|
|
|
errorDict[@"reason"] = [NSString stringWithFormat:@"%@",error.userInfo[NSLocalizedFailureReasonErrorKey]];
|
|
|
|
|
} else {
|
|
|
|
|
errorDict[@"reason"] = @"";
|
|
|
|
|
}
|
|
|
|
|
msgDict[@"error"] = errorDict;
|
2023-09-04 16:57:46 +08:00
|
|
|
}
|
2025-03-13 17:49:41 +08:00
|
|
|
|
|
|
|
|
[self callbackForKey:placementID]([self scriptWrapperClass].UTF8String, paraDict.jsonString.UTF8String);
|
2023-01-29 12:44:57 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-03-13 17:49:41 +08:00
|
|
|
} @catch (NSException *exception) {
|
2023-01-29 12:44:57 +08:00
|
|
|
|
2025-03-13 17:49:41 +08:00
|
|
|
} @finally {}
|
|
|
|
|
|
|
|
|
|
});
|
2023-01-29 12:44:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (NSArray *)jsonStrToArray:(NSString *)jsonString{
|
2025-03-13 17:49:41 +08:00
|
|
|
|
2023-01-29 12:44:57 +08:00
|
|
|
|
|
|
|
|
NSError *error;
|
|
|
|
|
NSArray *array = [NSArray array];
|
|
|
|
|
|
|
|
|
|
@try {
|
|
|
|
|
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
|
2025-03-13 17:49:41 +08:00
|
|
|
|
2023-01-29 12:44:57 +08:00
|
|
|
array = [NSJSONSerialization JSONObjectWithData:jsonData
|
2025-03-13 17:49:41 +08:00
|
|
|
options:NSJSONReadingMutableContainers
|
|
|
|
|
error:&error];
|
2023-01-29 12:44:57 +08:00
|
|
|
if(error){
|
|
|
|
|
return [NSArray array];
|
|
|
|
|
}
|
|
|
|
|
} @catch (NSException *exception) {
|
|
|
|
|
NSLog(@"jsonStrToArray --- exception:%@",exception);
|
|
|
|
|
} @finally {}
|
2025-03-13 17:49:41 +08:00
|
|
|
|
2023-01-29 12:44:57 +08:00
|
|
|
return array;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@end
|