提交修改

This commit is contained in:
changyunjia
2026-06-09 15:16:52 +08:00
co-authored by changyunjia
parent d4442fc21f
commit 3ac4fe0cd0
330 changed files with 48115 additions and 36763 deletions
@@ -1,79 +0,0 @@
import Foundation
import StoreKit
#if canImport(PurchaseConnector)
import PurchaseConnector
@available(iOS 15.0, *)
@objc
public class AFUnityStoreKit2Bridge: NSObject {
@objc
public static func fetchAFSDKTransactionSK2(withTransactionId transactionId: String, completion: @escaping (AFSDKTransactionSK2?) -> Void) {
guard let transactionIdUInt64 = UInt64(transactionId) else {
print("Invalid transaction ID format.")
completion(nil)
return
}
Task {
for await result in StoreKit.Transaction.all {
if case .verified(let transaction) = result, transaction.id == transactionIdUInt64 {
let afTransaction = AFSDKTransactionSK2(transaction: transaction)
DispatchQueue.main.async {
completion(afTransaction)
}
return
}
}
DispatchQueue.main.async {
completion(nil)
}
}
}
@objc
public static func extractSK2ProductInfo(_ products: [AFSDKProductSK2]) -> NSArray {
var result: [[String: Any]] = []
for product in products {
if let swiftProduct = Mirror(reflecting: product).children.first(where: { $0.label == "product" })?.value {
let productId = (swiftProduct as? NSObject)?.value(forKey: "id") as? String ?? ""
let title = (swiftProduct as? NSObject)?.value(forKey: "displayName") as? String ?? ""
let desc = (swiftProduct as? NSObject)?.value(forKey: "description") as? String ?? ""
let price = (swiftProduct as? NSObject)?.value(forKey: "price") as? NSDecimalNumber ?? 0
result.append([
"productIdentifier": productId,
"localizedTitle": title,
"localizedDescription": desc,
"price": price
])
}
}
return result as NSArray
}
@objc
public static func extractSK2TransactionInfo(_ transactions: [AFSDKTransactionSK2]) -> NSArray {
var result: [[String: Any]] = []
for txn in transactions {
guard let mirrorChild = Mirror(reflecting: txn).children.first(where: { $0.label == "transaction" }),
let swiftTxn = mirrorChild.value as? StoreKit.Transaction else {
continue
}
let transactionId = "\(swiftTxn.id)"
let date = NSNumber(value: swiftTxn.purchaseDate.timeIntervalSince1970)
result.append([
"transactionIdentifier": transactionId,
"transactionState": "verified", // or skip this line
"transactionDate": date
])
}
return result as NSArray
}
}
#endif
@@ -1,42 +0,0 @@
fileFormatVersion: 2
guid: 5652805602a6b4273a6e527b00aea272
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
VisionOS: VisionOS
second:
enabled: 1
settings: {}
- first:
iPhone: iOS
second:
enabled: 1
settings: {}
- first:
tvOS: tvOS
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,24 +0,0 @@
//
// AFUnityUtils.h
//
// Created by Andrii H. and Dmitry O. on 16 Oct 2023
//
#if __has_include(<AppsFlyerLib/AppsFlyerLib.h>)
#import <AppsFlyerLib/AppsFlyerLib.h>
#else
#import "AppsFlyerLib.h"
#endif
static NSString* stringFromChar(const char *str);
static NSDictionary* dictionaryFromJson(const char *jsonString);
static const char* stringFromdictionary(NSDictionary* dictionary);
static NSArray<NSString*> *NSArrayFromCArray(int length, const char **arr);
static char* getCString(const char* string);
static AppsFlyerLinkGenerator* generatorFromDictionary(NSDictionary* dictionary, AppsFlyerLinkGenerator* generator);
static EmailCryptType emailCryptTypeFromInt(int emailCryptTypeInt);
static AppsFlyerAdRevenueMediationNetworkType mediationNetworkTypeFromInt(int mediationNetwork);
static NSNumber *intFromNullableBool(const char *cStr);
static NSString* stringFromDeepLinkResultStatus(AFSDKDeepLinkResultStatus deepLinkResult);
static NSString* stringFromDeepLinkResultError(AppsFlyerDeepLinkResult *result);
@@ -1,219 +0,0 @@
//
// AFUnityUtils.mm
// Unity-iPhone
//
// Created by Jonathan Wesfield on 24/07/2019.
//
#import "AFUnityUtils.h"
static NSString* stringFromChar(const char *str) {
return str ? [NSString stringWithUTF8String:str] : nil;
}
static NSDictionary* dictionaryFromJson(const char *jsonString) {
if(jsonString){
NSData *jsonData = [[NSData alloc] initWithBytes:jsonString length:strlen(jsonString)];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];
return dictionary;
}
return nil;
}
static const char* stringFromdictionary(NSDictionary* dictionary) {
if(dictionary){
NSError * err;
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&err];
NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
return [myString UTF8String];
}
return nil;
}
static NSDictionary* dictionaryFromNSError(NSError* error) {
if(error){
NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary];
errorDictionary[@"code"] = @(error.code);
errorDictionary[@"localizedDescription"] = error.localizedDescription ?: @"";
// Include userInfo fields for enhanced error reporting (iOS SDK 6.17.8+)
if (error.userInfo[@"error_code"]) {
errorDictionary[@"error_code"] = error.userInfo[@"error_code"];
}
if (error.userInfo[@"error_message"]) {
errorDictionary[@"error_message"] = error.userInfo[@"error_message"];
}
if (error.userInfo[@"invalid_fields"]) {
errorDictionary[@"invalid_fields"] = error.userInfo[@"invalid_fields"];
}
return errorDictionary;
}
return nil;
}
static NSArray<NSString*> *NSArrayFromCArray(int length, const char **arr) {
NSMutableArray<NSString *> *res = [[NSMutableArray alloc] init];
for(int i = 0; i < length; i++) {
if (arr[i]) {
[res addObject:[NSString stringWithUTF8String:arr[i]]];
}
}
return res;
}
static char* getCString(const char* string){
if (string == NULL){
return NULL;
}
char* res = (char*)malloc(strlen(string) + 1);
strcpy(res, string);
return res;
}
static AppsFlyerLinkGenerator* generatorFromDictionary(NSDictionary* dictionary, AppsFlyerLinkGenerator* generator) {
NSArray* generatorKeys = @[@"channel", @"customerID", @"campaign", @"referrerName", @"referrerImageUrl", @"deeplinkPath", @"baseDeeplink", @"brandDomain"];
NSMutableDictionary* mutableDictionary = [dictionary mutableCopy];
[generator setChannel:[dictionary objectForKey: @"channel"]];
[generator setReferrerCustomerId:[dictionary objectForKey: @"customerID"]];
[generator setCampaign:[dictionary objectForKey: @"campaign"]];
[generator setReferrerName:[dictionary objectForKey: @"referrerName"]];
[generator setReferrerImageURL:[dictionary objectForKey: @"referrerImageUrl"]];
[generator setDeeplinkPath:[dictionary objectForKey: @"deeplinkPath"]];
[generator setBaseDeeplink:[dictionary objectForKey: @"baseDeeplink"]];
[generator setBrandDomain:[dictionary objectForKey: @"brandDomain"]];
[mutableDictionary removeObjectsForKeys:generatorKeys];
[generator addParameters:mutableDictionary];
return generator;
}
static EmailCryptType emailCryptTypeFromInt(int emailCryptTypeInt){
EmailCryptType emailCryptType;
switch (emailCryptTypeInt){
case 1:
emailCryptType = EmailCryptTypeSHA256;
break;
default:
emailCryptType = EmailCryptTypeNone;
break;
}
return emailCryptType;
}
static NSNumber *intFromNullableBool(const char *cStr) {
if (!cStr) return nil;
NSString *str = [NSString stringWithUTF8String:cStr];
if ([str caseInsensitiveCompare:@"true"] == NSOrderedSame) {
return @YES;
} else if ([str caseInsensitiveCompare:@"false"] == NSOrderedSame) {
return @NO;
}
return nil;
}
static AppsFlyerAdRevenueMediationNetworkType mediationNetworkTypeFromInt(int mediationNetworkInt){
AppsFlyerAdRevenueMediationNetworkType mediationNetworkType;
switch (mediationNetworkInt){
case 1:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeGoogleAdMob;
break;
case 2:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeIronSource;
break;
case 3:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeApplovinMax;
break;
case 4:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeFyber;
break;
case 5:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeAppodeal;
break;
case 6:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeAdmost;
break;
case 7:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeTopon;
break;
case 8:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeTradplus;
break;
case 9:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeYandex;
break;
case 10:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeChartBoost;
break;
case 11:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeUnity;
break;
case 12:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeToponPte;
break;
case 13:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeCustom;
break;
case 14:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeDirectMonetization;
break;
default:
mediationNetworkType = AppsFlyerAdRevenueMediationNetworkTypeCustom;
break;
}
return mediationNetworkType;
}
static NSString* stringFromDeepLinkResultStatus(AFSDKDeepLinkResultStatus deepLinkResult){
NSString* result;
switch (deepLinkResult){
case AFSDKDeepLinkResultStatusFound:
result = @"FOUND";
break;
case AFSDKDeepLinkResultStatusFailure:
result = @"ERROR";
break;
case AFSDKDeepLinkResultStatusNotFound:
result = @"NOT_FOUND";
break;
default:
result = @"ERROR";
break;
}
return result;
}
static NSString* stringFromDeepLinkResultError(AppsFlyerDeepLinkResult *result){
NSString* res;
if (result && result.error){
if ([[result.error userInfo][NSUnderlyingErrorKey] code] == -1001) {
res = @"TIMEOUT";
} else if ([[result.error userInfo][NSUnderlyingErrorKey] code] == -1009) {
res = @"NETWORK";
}
}
res = @"UNKNOWN";
return res;
}
@@ -1,164 +0,0 @@
//
// AppsFlyer+AppController.m
// Unity-iPhone
//
// Created by Jonathan Wesfield on 24/07/2019.
//
#import <objc/runtime.h>
#import "UnityAppController.h"
#import "AppsFlyeriOSWrapper.h"
#if __has_include(<AppsFlyerLib/AppsFlyerLib.h>)
#import <AppsFlyerLib/AppsFlyerLib.h>
#else
#import "AppsFlyerLib.h"
#endif
@implementation UnityAppController (AppsFlyerSwizzledAppController)
static BOOL didEnteredBackGround __unused;
static IMP __original_applicationDidBecomeActive_Imp __unused;
static IMP __original_applicationDidEnterBackground_Imp __unused;
static IMP __original_didReceiveRemoteNotification_Imp __unused;
static IMP __original_continueUserActivity_Imp __unused;
static IMP __original_openUrl_Imp __unused;
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
#if !AFSDK_SHOULD_SWIZZLE
id swizzleFlag = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AppsFlyerShouldSwizzle"];
BOOL shouldSwizzle = swizzleFlag ? [swizzleFlag boolValue] : NO;
if(shouldSwizzle){
Method method1 = class_getInstanceMethod([self class], @selector(applicationDidBecomeActive:));
__original_applicationDidBecomeActive_Imp = method_setImplementation(method1, (IMP)__swizzled_applicationDidBecomeActive);
Method method2 = class_getInstanceMethod([self class], @selector(applicationDidEnterBackground:));
__original_applicationDidEnterBackground_Imp = method_setImplementation(method2, (IMP)__swizzled_applicationDidEnterBackground);
Method method3 = class_getInstanceMethod([self class], @selector(didReceiveRemoteNotification:));
__original_didReceiveRemoteNotification_Imp = method_setImplementation(method3, (IMP)__swizzled_didReceiveRemoteNotification);
Method method4 = class_getInstanceMethod([self class], @selector(application:openURL:options:));
__original_openUrl_Imp = method_setImplementation(method4, (IMP)__swizzled_openURL);
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
[self swizzleContinueUserActivity:[self class]];
}
#elif AFSDK_SHOULD_SWIZZLE
Method method1 = class_getInstanceMethod([self class], @selector(applicationDidBecomeActive:));
__original_applicationDidBecomeActive_Imp = method_setImplementation(method1, (IMP)__swizzled_applicationDidBecomeActive);
Method method2 = class_getInstanceMethod([self class], @selector(applicationDidEnterBackground:));
__original_applicationDidEnterBackground_Imp = method_setImplementation(method2, (IMP)__swizzled_applicationDidEnterBackground);
Method method3 = class_getInstanceMethod([self class], @selector(didReceiveRemoteNotification:));
__original_didReceiveRemoteNotification_Imp = method_setImplementation(method3, (IMP)__swizzled_didReceiveRemoteNotification);
Method method4 = class_getInstanceMethod([self class], @selector(application:openURL:options:));
__original_openUrl_Imp = method_setImplementation(method4, (IMP)__swizzled_openURL);
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
[self swizzleContinueUserActivity:[self class]];
#endif
});
}
+(void)swizzleContinueUserActivity:(Class)class {
SEL originalSelector = @selector(application:continueUserActivity:restorationHandler:);
Method defaultMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, @selector(__swizzled_continueUserActivity));
BOOL isMethodExists = !class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
if (isMethodExists) {
__original_continueUserActivity_Imp = method_setImplementation(defaultMethod, (IMP)__swizzled_continueUserActivity);
} else {
class_replaceMethod(class, originalSelector, (IMP)__swizzled_continueUserActivity, method_getTypeEncoding(swizzledMethod));
}
}
BOOL __swizzled_continueUserActivity(id self, SEL _cmd, UIApplication* application, NSUserActivity* userActivity, void (^restorationHandler)(NSArray*)) {
NSLog(@"swizzled continueUserActivity");
[[AppsFlyerAttribution shared] continueUserActivity:userActivity restorationHandler:restorationHandler];
if(__original_continueUserActivity_Imp){
return ((BOOL(*)(id, SEL, UIApplication*, NSUserActivity*, void (^)(NSArray*)))__original_continueUserActivity_Imp)(self, _cmd, application, userActivity, NULL);
}
return YES;
}
void __swizzled_applicationDidBecomeActive(id self, SEL _cmd, UIApplication* launchOptions) {
NSLog(@"swizzled applicationDidBecomeActive");
[[AppsFlyerLib shared] setDelegate:_AppsFlyerdelegate];
if(didEnteredBackGround && AppsFlyeriOSWarpper.didCallStart == YES){
[[AppsFlyerLib shared] start];
}
if(__original_applicationDidBecomeActive_Imp){
((void(*)(id,SEL, UIApplication*))__original_applicationDidBecomeActive_Imp)(self, _cmd, launchOptions);
}
}
void __swizzled_applicationDidEnterBackground(id self, SEL _cmd, UIApplication* application) {
NSLog(@"swizzled applicationDidEnterBackground");
didEnteredBackGround = YES;
if(__original_applicationDidEnterBackground_Imp){
((void(*)(id,SEL, UIApplication*))__original_applicationDidEnterBackground_Imp)(self, _cmd, application);
}
}
BOOL __swizzled_didReceiveRemoteNotification(id self, SEL _cmd, UIApplication* application, NSDictionary* userInfo,void (^UIBackgroundFetchResult)(void) ) {
NSLog(@"swizzled didReceiveRemoteNotification");
[[AppsFlyerLib shared] handlePushNotification:userInfo];
if(__original_didReceiveRemoteNotification_Imp){
return ((BOOL(*)(id, SEL, UIApplication*, NSDictionary*, int(UIBackgroundFetchResult)))__original_didReceiveRemoteNotification_Imp)(self, _cmd, application, userInfo, nil);
}
return YES;
}
BOOL __swizzled_openURL(id self, SEL _cmd, UIApplication* application, NSURL* url, NSDictionary * options) {
NSLog(@"swizzled openURL");
[[AppsFlyerAttribution shared] handleOpenUrl:url options:options];
if(__original_openUrl_Imp){
return ((BOOL(*)(id, SEL, UIApplication*, NSURL*, NSDictionary*))__original_openUrl_Imp)(self, _cmd, application, url, options);
}
return NO;
}
@end
@@ -1,131 +0,0 @@
//
// AppsFlyerAppController.mm
// Unity-iPhone
//
// Created by Jonathan Wesfield on 30/07/2019.
//
#import <Foundation/Foundation.h>
#import "UnityAppController.h"
#import "AppDelegateListener.h"
#import "AppsFlyeriOSWrapper.h"
#if __has_include(<AppsFlyerLib/AppsFlyerLib.h>)
#import <AppsFlyerLib/AppsFlyerLib.h>
#else
#import "AppsFlyerLib.h"
#endif
#import <objc/message.h>
/**
Note if you would like to use method swizzeling see AppsFlyer+AppController.m
If you are using swizzeling then comment out the method that is being swizzeled in AppsFlyerAppController.mm
Only use swizzeling if there are conflicts with other plugins that needs to be resolved.
*/
@interface AppsFlyerAppController : UnityAppController <AppDelegateListener>
{
BOOL didEnteredBackGround;
}
@end
@implementation AppsFlyerAppController
- (instancetype)init
{
self = [super init];
if (self) {
id swizzleFlag = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AppsFlyerShouldSwizzle"];
BOOL shouldSwizzle = swizzleFlag ? [swizzleFlag boolValue] : NO;
if(!shouldSwizzle){
UnityRegisterAppDelegateListener(self);
}
}
return self;
}
- (void)didFinishLaunching:(NSNotification*)notification {
NSLog(@"got didFinishLaunching = %@",notification.userInfo);
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
[[AppsFlyerLib shared] setDelegate:_AppsFlyerdelegate];
if (notification.userInfo[@"url"]) {
[self onOpenURL:notification];
}
}
-(void)didBecomeActive:(NSNotification*)notification {
NSLog(@"got didBecomeActive(out) = %@", notification.userInfo);
if (didEnteredBackGround == YES && AppsFlyeriOSWarpper.didCallStart == YES) {
[[AppsFlyerLib shared] start];
didEnteredBackGround = NO;
}
}
- (void)didEnterBackground:(NSNotification*)notification {
NSLog(@"got didEnterBackground = %@", notification.userInfo);
didEnteredBackGround = YES;
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler {
[[AppsFlyerAttribution shared] continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
- (void)onOpenURL:(NSNotification*)notification {
NSLog(@"got onOpenURL = %@", notification.userInfo);
NSURL *url = notification.userInfo[@"url"];
NSString *sourceApplication = notification.userInfo[@"sourceApplication"];
if (sourceApplication == nil) {
sourceApplication = @"";
}
if (url != nil) {
[[AppsFlyerAttribution shared] handleOpenUrl:url sourceApplication:sourceApplication annotation:nil];
}
}
- (void)didReceiveRemoteNotification:(NSNotification*)notification {
NSLog(@"got didReceiveRemoteNotification = %@", notification.userInfo);
[[AppsFlyerLib shared] handlePushNotification:notification.userInfo];
}
@end
#if !(AFSDK_SHOULD_SWIZZLE)
IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController)
#endif
/**
Note if you would not like to use IMPL_APP_CONTROLLER_SUBCLASS you can replace it with the code below.
<code>
+(void)load
{
[AppsFlyerAppController plugin];
}
// Singleton accessor.
+ (AppsFlyerAppController *)plugin
{
static AppsFlyerAppController *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[AppsFlyerAppController alloc] init];
});
return sharedInstance;
}
</code>
**/
@@ -1,34 +0,0 @@
//
// AppsFlyerAttribution.h
// UnityFramework
//
// Created by Margot Guetta on 11/04/2021.
//
#ifndef AppsFlyerAttribution_h
#define AppsFlyerAttribution_h
#endif /* AppsFlyerAttribution_h */
#if __has_include(<AppsFlyerLib/AppsFlyerLib.h>)
#import <AppsFlyerLib/AppsFlyerLib.h>
#else
#import "AppsFlyerLib.h"
#endif
@interface AppsFlyerAttribution : NSObject
@property NSUserActivity*_Nullable userActivity;
@property (nonatomic, copy) void (^ _Nullable restorationHandler)(NSArray *_Nullable );
@property NSURL * _Nullable url;
@property NSDictionary * _Nullable options;
@property NSString* _Nullable sourceApplication;
@property id _Nullable annotation;
@property BOOL isBridgeReady;
+ (AppsFlyerAttribution *_Nullable)shared;
- (void) continueUserActivity: (NSUserActivity*_Nullable) userActivity restorationHandler: (void (^_Nullable)(NSArray * _Nullable))restorationHandler;
- (void) handleOpenUrl:(NSURL*_Nullable)url options:(NSDictionary*_Nullable) options;
- (void) handleOpenUrl: (NSURL *_Nonnull)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation;
@end
static NSString * _Nullable const AF_BRIDGE_SET = @"bridge is set";
@@ -1,86 +0,0 @@
//
// NSObject+AppsFlyerAttribution.m
// UnityFramework
//
// Created by Margot Guetta on 11/04/2021.
//
#import <Foundation/Foundation.h>
#import "AppsFlyerAttribution.h"
@implementation AppsFlyerAttribution
+ (id)shared {
static AppsFlyerAttribution *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
});
return shared;
}
- (id)init {
if (self = [super init]) {
self.options = nil;
self.restorationHandler = nil;
self.url = nil;
self.userActivity = nil;
self.annotation = nil;
self.sourceApplication = nil;
self.isBridgeReady = NO;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveBridgeReadyNotification:)
name:AF_BRIDGE_SET
object:nil];
}
return self;
}
- (void) continueUserActivity: (NSUserActivity*_Nullable) userActivity restorationHandler: (void (^_Nullable)(NSArray * _Nullable))restorationHandler{
if(self.isBridgeReady == YES){
[[AppsFlyerLib shared] continueUserActivity:userActivity restorationHandler:restorationHandler];
}else{
[AppsFlyerAttribution shared].userActivity = userActivity;
[AppsFlyerAttribution shared].restorationHandler = restorationHandler;
}
}
- (void) handleOpenUrl:(NSURL *)url options:(NSDictionary *)options{
if(self.isBridgeReady == YES){
[[AppsFlyerLib shared] handleOpenUrl:url options:options];
}else{
[AppsFlyerAttribution shared].url = url;
[AppsFlyerAttribution shared].options = options;
}
}
- (void) handleOpenUrl:(NSURL *)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{
if(self.isBridgeReady == YES){
[[AppsFlyerLib shared] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:annotation];
}else{
[AppsFlyerAttribution shared].url = url;
[AppsFlyerAttribution shared].sourceApplication = sourceApplication;
[AppsFlyerAttribution shared].annotation = annotation;
}
}
- (void) receiveBridgeReadyNotification:(NSNotification *) notification
{
NSLog (@"AppsFlyer Debug: handle deep link");
if(self.url && self.sourceApplication){
[[AppsFlyerLib shared] handleOpenURL:self.url sourceApplication:self.sourceApplication withAnnotation:self.annotation];
self.url = nil;
self.sourceApplication = nil;
self.annotation = nil;
}else if(self.options && self.url){
[[AppsFlyerLib shared] handleOpenUrl:self.url options:self.options];
self.options = nil;
self.url = nil;
}else if(self.userActivity){
[[AppsFlyerLib shared] continueUserActivity:self.userActivity restorationHandler:nil];
self.userActivity = nil;
self.restorationHandler = nil;
}
}
@end
@@ -1,71 +0,0 @@
//
// AppsFlyeriOSWarpper.h
// Unity-iPhone
//
// Created by Jonathan Wesfield on 24/07/2019.
//
#import "AFUnityUtils.mm"
#import "UnityAppController.h"
#import "AppsFlyerAttribution.h"
#if __has_include(<AppsFlyerLib/AppsFlyerLib.h>)
#import <AppsFlyerLib/AppsFlyerLib.h>
#else
#import "AppsFlyerLib.h"
#endif
#if __has_include(<PurchaseConnector/PurchaseConnector.h>)
#import <PurchaseConnector/PurchaseConnector.h>
#else
#import "PurchaseConnector.h"
#endif
#import <PurchaseConnector/PurchaseConnector-Swift.h>
// Add StoreKit 2 support
#if __has_include(<StoreKit/StoreKit.h>)
#import <StoreKit/StoreKit.h>
#endif
@interface AppsFlyeriOSWarpper : NSObject <AppsFlyerLibDelegate, AppsFlyerDeepLinkDelegate, AppsFlyerPurchaseRevenueDelegate, AppsFlyerPurchaseRevenueDataSource, AppsFlyerPurchaseRevenueDataSourceStoreKit2>
+ (BOOL) didCallStart;
+ (void) setDidCallStart:(BOOL)val;
// Add StoreKit 2 methods
- (void)setStoreKitVersion:(int)storeKitVersion;
- (void)logConsumableTransaction:(id)transaction;
@end
static AppsFlyeriOSWarpper *_AppsFlyerdelegate;
static const int kPushNotificationSize = 32;
static NSString* ConversionDataCallbackObject = @"AppsFlyerObject";
static const char* VALIDATE_CALLBACK = "didFinishValidateReceipt";
static const char* VALIDATE_ERROR_CALLBACK = "didFinishValidateReceiptWithError";
static const char* GCD_CALLBACK = "onConversionDataSuccess";
static const char* GCD_ERROR_CALLBACK = "onConversionDataFail";
static const char* OAOA_CALLBACK = "onAppOpenAttribution";
static const char* OAOA_ERROR_CALLBACK = "onAppOpenAttributionFailure";
static const char* GENERATE_LINK_CALLBACK = "onInviteLinkGenerated";
static const char* OPEN_STORE_LINK_CALLBACK = "onOpenStoreLinkGenerated";
static const char* START_REQUEST_CALLBACK = "requestResponseReceived";
static const char* IN_APP_RESPONSE_CALLBACK = "inAppResponseReceived";
static const char* ON_DEEPLINKING = "onDeepLinking";
static const char* VALIDATE_AND_LOG_V2_CALLBACK = "onValidateAndLogComplete";
static const char* VALIDATE_AND_LOG_V2_ERROR_CALLBACK = "onValidateAndLogFailure";
static NSString* validateObjectName = @"";
static NSString* openStoreObjectName = @"";
static NSString* generateInviteObjectName = @"";
static NSString* validateAndLogObjectName = @"";
static NSString* startRequestObjectName = @"";
static NSString* inAppRequestObjectName = @"";
static NSString* onDeeplinkingObjectName = @"";
static const char* PURCHASE_REVENUE_VALIDATION_CALLBACK = "didReceivePurchaseRevenueValidationInfo";
static const char* PURCHASE_REVENUE_ERROR_CALLBACK = "didReceivePurchaseRevenueError";
static NSString* onPurchaseValidationObjectName = @"";
@@ -1,601 +0,0 @@
//
// AppsFlyeriOSWarpper.mm
// Unity-iPhone
//
// Created by Jonathan Wesfield on 24/07/2019.
//
#import "AppsFlyeriOSWrapper.h"
#import <objc/runtime.h>
#import <StoreKit/StoreKit.h>
#import "UnityFramework/UnityFramework-Swift.h"
#if __has_include(<PurchaseConnector/PurchaseConnector-Swift.h>)
#import <PurchaseConnector/PurchaseConnector-Swift.h>
#elif __has_include("PurchaseConnector-Swift.h")
#import "PurchaseConnector-Swift.h"
#endif
#if __has_include(<UnityFramework/UnityFramework-Swift.h>)
#import <UnityFramework/UnityFramework-Swift.h>
#elif __has_include("UnityFramework-Swift.h")
#import "UnityFramework-Swift.h"
#endif
static void unityCallBack(NSString* objectName, const char* method, const char* msg) {
if(objectName){
UnitySendMessage([objectName UTF8String], method, msg);
}
}
extern "C" {
const void _startSDK(bool shouldCallback, const char* objectName) {
[[AppsFlyerLib shared] setPluginInfoWith: AFSDKPluginUnity
pluginVersion:@"6.17.91"
additionalParams:nil];
startRequestObjectName = stringFromChar(objectName);
AppsFlyeriOSWarpper.didCallStart = YES;
[AppsFlyerAttribution shared].isBridgeReady = YES;
[[NSNotificationCenter defaultCenter] postNotificationName:AF_BRIDGE_SET object: [AppsFlyerAttribution shared]];
[[AppsFlyerLib shared] startWithCompletionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if(shouldCallback){
if (error) {
NSDictionary *callbackDictionary = @{@"statusCode":[NSNumber numberWithLong:[error code]]};
unityCallBack(startRequestObjectName, START_REQUEST_CALLBACK, stringFromdictionary(callbackDictionary));
return;
}
if (dictionary) {
unityCallBack(startRequestObjectName, START_REQUEST_CALLBACK, stringFromdictionary(dictionary));
return;
}
}
}];
}
const void _setCustomerUserID (const char* customerUserID) {
[[AppsFlyerLib shared] setCustomerUserID:stringFromChar(customerUserID)];
}
const void _setAdditionalData (const char* customData) {
[[AppsFlyerLib shared] setAdditionalData:dictionaryFromJson(customData)];
}
const void _setAppsFlyerDevKey (const char* appsFlyerDevKey) {
[AppsFlyerLib shared].appsFlyerDevKey = stringFromChar(appsFlyerDevKey);
}
const void _setAppleAppID (const char* appleAppID) {
[AppsFlyerLib shared].appleAppID = stringFromChar(appleAppID);
}
const void _setCurrencyCode (const char* currencyCode) {
[[AppsFlyerLib shared] setCurrencyCode:stringFromChar(currencyCode)];
}
const void _setDisableCollectAppleAdSupport (bool disableAdvertisingIdentifier) {
[AppsFlyerLib shared].disableAdvertisingIdentifier = disableAdvertisingIdentifier;
}
const void _setIsDebug (bool isDebug) {
[AppsFlyerLib shared].isDebug = isDebug;
}
const void _setShouldCollectDeviceName (bool shouldCollectDeviceName) {
[AppsFlyerLib shared].shouldCollectDeviceName = shouldCollectDeviceName;
}
const void _setAppInviteOneLinkID (const char* appInviteOneLinkID) {
[[AppsFlyerLib shared] setAppInviteOneLink:stringFromChar(appInviteOneLinkID)];
}
const void _setDeepLinkTimeout (long deepLinkTimeout) {
[AppsFlyerLib shared].deepLinkTimeout = deepLinkTimeout;
}
const void _anonymizeUser (bool anonymizeUser) {
[AppsFlyerLib shared].anonymizeUser = anonymizeUser;
}
const void _enableTCFDataCollection (bool shouldCollectTcfData) {
[[AppsFlyerLib shared] enableTCFDataCollection:shouldCollectTcfData];
}
const void _setConsentData(const char* isUserSubjectToGDPR, const char* hasConsentForDataUsage, const char* hasConsentForAdsPersonalization, const char* hasConsentForAdStorage) {
NSNumber *gdpr = intFromNullableBool(isUserSubjectToGDPR);
NSNumber *dataUsage = intFromNullableBool(hasConsentForDataUsage);
NSNumber *adsPersonalization = intFromNullableBool(hasConsentForAdsPersonalization);
NSNumber *adStorage = intFromNullableBool(hasConsentForAdStorage);
AppsFlyerConsent *consentData = [[AppsFlyerConsent alloc] initWithIsUserSubjectToGDPR:gdpr
hasConsentForDataUsage:dataUsage
hasConsentForAdsPersonalization:adsPersonalization
hasConsentForAdStorage:adStorage];
[[AppsFlyerLib shared] setConsentData:consentData];
}
const void _logAdRevenue(const char* monetizationNetwork, int mediationNetworkInt, const char* currencyIso4217Code, double eventRevenue, const char* additionalParameters) {
AppsFlyerAdRevenueMediationNetworkType mediationNetwork = mediationNetworkTypeFromInt(mediationNetworkInt);
NSNumber *number = [NSNumber numberWithDouble:eventRevenue];
AFAdRevenueData *adRevenue = [[AFAdRevenueData alloc] initWithMonetizationNetwork:stringFromChar(monetizationNetwork) mediationNetwork:mediationNetwork currencyIso4217Code:stringFromChar(currencyIso4217Code) eventRevenue:number];
[[AppsFlyerLib shared] logAdRevenue: adRevenue additionalParameters:dictionaryFromJson(additionalParameters)];
}
const void _setDisableCollectIAd (bool disableCollectASA) {
[AppsFlyerLib shared].disableCollectASA = disableCollectASA;
}
const void _setUseReceiptValidationSandbox (bool useReceiptValidationSandbox) {
[AppsFlyerLib shared].useReceiptValidationSandbox = useReceiptValidationSandbox;
}
const void _setUseUninstallSandbox (bool useUninstallSandbox) {
[AppsFlyerLib shared].useUninstallSandbox = useUninstallSandbox;
}
const void _setResolveDeepLinkURLs (int length, const char **resolveDeepLinkURLs) {
if(length > 0 && resolveDeepLinkURLs) {
[[AppsFlyerLib shared] setResolveDeepLinkURLs:NSArrayFromCArray(length, resolveDeepLinkURLs)];
}
}
const void _setOneLinkCustomDomains (int length, const char **oneLinkCustomDomains) {
if(length > 0 && oneLinkCustomDomains) {
[[AppsFlyerLib shared] setOneLinkCustomDomains:NSArrayFromCArray(length, oneLinkCustomDomains)];
}
}
const void _afSendEvent (const char* eventName, const char* eventValues, bool shouldCallback, const char* objectName) {
inAppRequestObjectName = stringFromChar(objectName);
[[AppsFlyerLib shared] logEventWithEventName:stringFromChar(eventName) eventValues:dictionaryFromJson(eventValues) completionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if(shouldCallback){
if (error) {
NSDictionary *callbackDictionary = @{@"statusCode":[NSNumber numberWithLong:[error code]]};
unityCallBack(inAppRequestObjectName, IN_APP_RESPONSE_CALLBACK, stringFromdictionary(callbackDictionary));
return;
}
if (dictionary) {
unityCallBack(inAppRequestObjectName, IN_APP_RESPONSE_CALLBACK, stringFromdictionary(dictionary));
return;
}
}
}];
}
const void _recordLocation (double longitude, double latitude) {
[[AppsFlyerLib shared] logLocation:longitude latitude:latitude];
}
const char* _getAppsFlyerId () {
return getCString([[[AppsFlyerLib shared] getAppsFlyerUID] UTF8String]);
}
const void _registerUninstall (unsigned char* deviceToken) {
if(deviceToken){
NSData* tokenData = [NSData dataWithBytes:(const void *)deviceToken length:sizeof(unsigned char)*kPushNotificationSize];
[[AppsFlyerLib shared] registerUninstall:tokenData];
}
}
const void _handlePushNotification (const char* pushPayload) {
[[AppsFlyerLib shared] handlePushNotification:dictionaryFromJson(pushPayload)];
}
const char* _getSDKVersion () {
return getCString([[[AppsFlyerLib shared] getSDKVersion] UTF8String]);
}
const void _setHost (const char* host, const char* hostPrefix) {
[[AppsFlyerLib shared] setHost:stringFromChar(host) withHostPrefix:stringFromChar(hostPrefix)];
}
const void _setMinTimeBetweenSessions (int minTimeBetweenSessions) {
[AppsFlyerLib shared].minTimeBetweenSessions = minTimeBetweenSessions;
}
const void _stopSDK (bool isStopped) {
[AppsFlyerLib shared].isStopped = isStopped;
}
const BOOL _isSDKStopped () {
return [AppsFlyerLib shared].isStopped;
}
const void _handleOpenUrl(const char *url, const char *sourceApplication, const char *annotation) {
[[AppsFlyerLib shared] handleOpenURL:[NSURL URLWithString:stringFromChar(url)] sourceApplication:stringFromChar(sourceApplication) withAnnotation:stringFromChar(annotation)]; }
const void _recordCrossPromoteImpression (const char* appID, const char* campaign, const char* parameters) {
[AppsFlyerCrossPromotionHelper logCrossPromoteImpression:stringFromChar(appID) campaign:stringFromChar(campaign) parameters:dictionaryFromJson(parameters)]; }
const void _attributeAndOpenStore (const char* appID, const char* campaign, const char* parameters, const char* objectName) {
openStoreObjectName = stringFromChar(objectName);
[AppsFlyerCrossPromotionHelper
logAndOpenStore:stringFromChar(appID)
campaign:stringFromChar(campaign)
parameters:dictionaryFromJson(parameters)
openStore:^(NSURLSession * _Nonnull urlSession, NSURL * _Nonnull clickURL) {
unityCallBack(openStoreObjectName, OPEN_STORE_LINK_CALLBACK, [clickURL.absoluteString UTF8String]);
}];
}
const void _generateUserInviteLink (const char* parameters, const char* objectName) {
generateInviteObjectName = stringFromChar(objectName);
[AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:^AppsFlyerLinkGenerator * _Nonnull(AppsFlyerLinkGenerator * _Nonnull generator) {
return generatorFromDictionary(dictionaryFromJson(parameters), generator);
} completionHandler:^(NSURL * _Nullable url) {
unityCallBack(generateInviteObjectName, GENERATE_LINK_CALLBACK, [url.absoluteString UTF8String]);
}];
}
const void _recordInvite (const char* channel, const char* parameters) {
[AppsFlyerShareInviteHelper logInvite:stringFromChar(channel) parameters:dictionaryFromJson(parameters)];
}
const void _setUserEmails (int emailCryptTypeInt , int length, const char **userEmails) {
if(length > 0 && userEmails) {
[[AppsFlyerLib shared] setUserEmails:NSArrayFromCArray(length, userEmails) withCryptType:emailCryptTypeFromInt(emailCryptTypeInt)];
}
}
const void _setPhoneNumber (const char* phoneNumber) {
[[AppsFlyerLib shared] setPhoneNumber:stringFromChar(phoneNumber)];
}
const void _setSharingFilterForAllPartners () {
[[AppsFlyerLib shared] setSharingFilterForAllPartners];
}
const void _setSharingFilter (int length, const char **partners) {
if(length > 0 && partners) {
[[AppsFlyerLib shared] setSharingFilter:NSArrayFromCArray(length, partners)];
}
}
const void _setSharingFilterForPartners (int length, const char **partners) {
if(length > 0 && partners) {
[[AppsFlyerLib shared] setSharingFilterForPartners:NSArrayFromCArray(length, partners)];
} else {
[[AppsFlyerLib shared] setSharingFilterForPartners:nil];
}
}
const void _validateAndSendInAppPurchase (const char* productIdentifier, const char* price, const char* currency, const char* transactionId, const char* additionalParameters, const char* objectName) {
validateObjectName = stringFromChar(objectName);
[[AppsFlyerLib shared]
validateAndLogInAppPurchase:stringFromChar(productIdentifier)
price:stringFromChar(price)
currency:stringFromChar(currency)
transactionId:stringFromChar(transactionId)
additionalParameters:dictionaryFromJson(additionalParameters)
success:^(NSDictionary *result){
unityCallBack(validateObjectName, VALIDATE_CALLBACK, stringFromdictionary(result));
} failure:^(NSError *error, id response) {
if(response && [response isKindOfClass:[NSDictionary class]]) {
NSDictionary* value = (NSDictionary*)response;
unityCallBack(validateObjectName, VALIDATE_ERROR_CALLBACK, stringFromdictionary(value));
} else {
unityCallBack(validateObjectName, VALIDATE_ERROR_CALLBACK, error ? [[error localizedDescription] UTF8String] : "error");
}
}];
}
const void _validateAndSendInAppPurchaseV2 (const char* product, const char* transactionId, int purchaseType, const char* purchaseAdditionalDetails, const char* objectName) {
validateAndLogObjectName = stringFromChar(objectName);
AFSDKPurchaseDetails *details = [[AFSDKPurchaseDetails alloc] initWithProductId:stringFromChar(product) transactionId:stringFromChar(transactionId) purchaseType:(AFSDKPurchaseType)purchaseType];
[[AppsFlyerLib shared]
validateAndLogInAppPurchase:details
purchaseAdditionalDetails:dictionaryFromJson(purchaseAdditionalDetails)
completion:^(NSDictionary * _Nullable response, NSError * _Nullable error) {
if (error) {
unityCallBack(validateAndLogObjectName, VALIDATE_AND_LOG_V2_ERROR_CALLBACK, stringFromdictionary(dictionaryFromNSError(error)));
} else {
unityCallBack(validateAndLogObjectName, VALIDATE_AND_LOG_V2_CALLBACK, stringFromdictionary(response));
}
}];
}
const void _getConversionData(const char* objectName) {
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
ConversionDataCallbackObject = stringFromChar(objectName);
[[AppsFlyerLib shared] setDelegate:_AppsFlyerdelegate];
}
const void _waitForATTUserAuthorizationWithTimeoutInterval (int timeoutInterval) {
[[AppsFlyerLib shared] waitForATTUserAuthorizationWithTimeoutInterval:timeoutInterval];
}
const void _disableSKAdNetwork (bool isDisabled) {
[AppsFlyerLib shared].disableSKAdNetwork = isDisabled;
}
const void _addPushNotificationDeepLinkPath (int length, const char **paths) {
if(length > 0 && paths) {
[[AppsFlyerLib shared] addPushNotificationDeepLinkPath:NSArrayFromCArray(length, paths)];
}
}
const void _subscribeForDeepLink (const char* objectName) {
onDeeplinkingObjectName = stringFromChar(objectName);
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
[[AppsFlyerLib shared] setDeepLinkDelegate:_AppsFlyerdelegate];
}
const void _setCurrentDeviceLanguage(const char* language) {
[[AppsFlyerLib shared] setCurrentDeviceLanguage:stringFromChar(language)];
}
const void _setPartnerData(const char* partnerId, const char* partnerInfo) {
[[AppsFlyerLib shared] setPartnerDataWithPartnerId: stringFromChar(partnerId) partnerInfo:dictionaryFromJson(partnerInfo)];
}
const void _disableIDFVCollection(bool isDisabled) {
[AppsFlyerLib shared].disableIDFVCollection = isDisabled;
}
// Purchase connector
const void _startObservingTransactions() {
[[PurchaseConnector shared] startObservingTransactions];
}
const void _stopObservingTransactions() {
[[PurchaseConnector shared] stopObservingTransactions];
}
const void _setIsSandbox(bool isSandBox) {
[[PurchaseConnector shared] setIsSandbox:isSandBox];
}
const void _setPurchaseRevenueDelegate() {
if (_AppsFlyerdelegate== nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
[[PurchaseConnector shared] setPurchaseRevenueDelegate:_AppsFlyerdelegate];
}
const void _setAutoLogPurchaseRevenue(int option) {
[[PurchaseConnector shared] setAutoLogPurchaseRevenue:option];
}
const void _initPurchaseConnector(const char* objectName) {
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
onPurchaseValidationObjectName = stringFromChar(objectName);
}
const void _setPurchaseRevenueDataSource(const char* objectName) {
if (_AppsFlyerdelegate == nil) {
_AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
}
if (strstr(objectName, "StoreKit2") != NULL) {
// Force protocol conformance
Protocol *sk2Protocol = @protocol(AppsFlyerPurchaseRevenueDataSourceStoreKit2);
class_addProtocol([_AppsFlyerdelegate class], sk2Protocol);
if (![_AppsFlyerdelegate conformsToProtocol:@protocol(AppsFlyerPurchaseRevenueDataSourceStoreKit2)]) {
NSLog(@"[AppsFlyer] Warning: SK2 protocol not conformed!");
}
}
[PurchaseConnector shared].purchaseRevenueDataSource = _AppsFlyerdelegate;
}
const void _setStoreKitVersion(int storeKitVersion) {
[[PurchaseConnector shared] setStoreKitVersion:(AFSDKStoreKitVersion)storeKitVersion];
}
const void _logConsumableTransaction(const char* transactionId) {
if (@available(iOS 15.0, *)) {
NSString *transactionIdStr = [NSString stringWithUTF8String:transactionId];
[AFUnityStoreKit2Bridge fetchAFSDKTransactionSK2WithTransactionId:transactionIdStr completion:^(AFSDKTransactionSK2 *afTransaction) {
if (afTransaction) {
[[PurchaseConnector shared] logConsumableTransaction:afTransaction];
} else {
NSLog(@"No AFSDKTransactionSK2 found for id %@", transactionIdStr);
}
}];
}
}
#ifdef __cplusplus
extern "C" {
#endif
typedef const char *(*UnityPurchaseCallback)(const char *, const char *);
UnityPurchaseCallback UnityPurchasesGetAdditionalParamsCallback = NULL;
UnityPurchaseCallback UnityPurchasesGetAdditionalParamsCallbackSK2 = NULL;
__attribute__((visibility("default")))
void RegisterUnityPurchaseRevenueParamsCallback(UnityPurchaseCallback callback) {
UnityPurchasesGetAdditionalParamsCallback = callback;
}
__attribute__((visibility("default")))
void RegisterUnityPurchaseRevenueParamsCallbackSK2(UnityPurchaseCallback callback) {
UnityPurchasesGetAdditionalParamsCallbackSK2 = callback;
}
#ifdef __cplusplus
}
#endif
}
@implementation AppsFlyeriOSWarpper
static BOOL didCallStart;
+ (BOOL) didCallStart
{ @synchronized(self) { return didCallStart; } }
+ (void) setDidCallStart:(BOOL)val
{ @synchronized(self) { didCallStart = val; } }
- (void)onConversionDataSuccess:(NSDictionary *)installData {
unityCallBack(ConversionDataCallbackObject, GCD_CALLBACK, stringFromdictionary(installData));
}
- (void)onConversionDataFail:(NSError *)error {
unityCallBack(ConversionDataCallbackObject, GCD_ERROR_CALLBACK, [[error localizedDescription] UTF8String]);
}
- (void)onAppOpenAttribution:(NSDictionary *)attributionData {
unityCallBack(ConversionDataCallbackObject, OAOA_CALLBACK, stringFromdictionary(attributionData));
}
- (void)onAppOpenAttributionFailure:(NSError *)error {
unityCallBack(ConversionDataCallbackObject, OAOA_ERROR_CALLBACK, [[error localizedDescription] UTF8String]);
}
- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *)result{
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:stringFromDeepLinkResultError(result) forKey:@"error"];
[dict setValue:stringFromDeepLinkResultStatus(result.status) forKey:@"status"];
if(result && result.deepLink){
[dict setValue:result.deepLink.description forKey:@"deepLink"];
[dict setValue:@(result.deepLink.isDeferred) forKey:@"is_deferred"];
}
unityCallBack(onDeeplinkingObjectName, ON_DEEPLINKING, stringFromdictionary(dict));
}
// Purchase Connector
- (void)didReceivePurchaseRevenueValidationInfo:(NSDictionary *)validationInfo error:(NSError *)error {
if (error != nil) {
unityCallBack(onPurchaseValidationObjectName, PURCHASE_REVENUE_ERROR_CALLBACK, [[error localizedDescription] UTF8String]);
} else {
unityCallBack(onPurchaseValidationObjectName, PURCHASE_REVENUE_VALIDATION_CALLBACK, stringFromdictionary(validationInfo));
}
}
- (NSDictionary *)purchaseRevenueAdditionalParametersForProducts:(NSSet<SKProduct *> *)products
transactions:(NSSet<SKPaymentTransaction *> *)transactions {
NSMutableArray *productsArray = [NSMutableArray array];
for (SKProduct *product in products) {
[productsArray addObject:@{
@"productIdentifier": product.productIdentifier ?: @"",
@"localizedTitle": product.localizedTitle ?: @"",
@"localizedDescription": product.localizedDescription ?: @"",
@"price": [product.price stringValue] ?: @""
}];
}
NSMutableArray *transactionsArray = [NSMutableArray array];
for (SKPaymentTransaction *txn in transactions) {
[transactionsArray addObject:@{
@"transactionIdentifier": txn.transactionIdentifier ?: @"",
@"transactionState": @(txn.transactionState),
@"transactionDate": txn.transactionDate ? [@(txn.transactionDate.timeIntervalSince1970) stringValue] : @""
}];
}
NSDictionary *input = @{
@"products": productsArray,
@"transactions": transactionsArray
};
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:input options:0 error:&error];
if (error || !jsonData) {
NSLog(@"[AppsFlyer] Failed to serialize Unity purchase data: %@", error);
return @{};
}
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
if (!jsonString || !UnityPurchasesGetAdditionalParamsCallback) {
NSLog(@"[AppsFlyer] Unity callback not registered");
return @{};
}
const char *resultCStr = UnityPurchasesGetAdditionalParamsCallback([jsonString UTF8String], "");
if (!resultCStr) {
NSLog(@"[AppsFlyer] Unity callback returned null");
return @{};
}
NSString *resultJson = [NSString stringWithUTF8String:resultCStr];
NSData *resultData = [resultJson dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *parsedResult = [NSJSONSerialization JSONObjectWithData:resultData options:0 error:&error];
if (error || ![parsedResult isKindOfClass:[NSDictionary class]]) {
NSLog(@"[AppsFlyer] Failed to parse Unity response: %@", error);
return @{};
}
return parsedResult;
}
#pragma mark - AppsFlyerPurchaseRevenueDataSourceStoreKit2
- (NSDictionary *)purchaseRevenueAdditionalParametersStoreKit2ForProducts:(NSSet<AFSDKProductSK2 *> *)products transactions:(NSSet<AFSDKTransactionSK2 *> *)transactions {
if (@available(iOS 15.0, *)) {
NSArray *productInfoArray = [AFUnityStoreKit2Bridge extractSK2ProductInfo:[products allObjects]];
NSArray *transactionInfoArray = [AFUnityStoreKit2Bridge extractSK2TransactionInfo:[transactions allObjects]];
NSDictionary *input = @{
@"products": productInfoArray,
@"transactions": transactionInfoArray
};
if (UnityPurchasesGetAdditionalParamsCallbackSK2) {
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:input options:0 error:&error];
if (error || !jsonData) {
NSLog(@"[AppsFlyer] Failed to serialize Unity purchase data: %@", error);
return @{};
}
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
const char *resultCStr = UnityPurchasesGetAdditionalParamsCallbackSK2([jsonString UTF8String], "");
if (!resultCStr) {
NSLog(@"[AppsFlyer] Unity callback returned null");
return @{};
}
NSString *resultJson = [NSString stringWithUTF8String:resultCStr];
NSData *resultData = [resultJson dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *parsedResult = [NSJSONSerialization JSONObjectWithData:resultData options:0 error:&error];
if (error || ![parsedResult isKindOfClass:[NSDictionary class]]) {
NSLog(@"[AppsFlyer] Failed to parse Unity response: %@", error);
return @{};
}
return parsedResult;
} else {
NSLog(@"[AppsFlyer] SK2 - Unity callback is NOT registered");
}
} else {
NSLog(@"[AppsFlyer] SK2 - iOS version not supported");
}
return @{};
}
@end
@@ -1,37 +0,0 @@
fileFormatVersion: 2
guid: 2bff3788f3d8747fe9679bd3818e1d76
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
iPhone: iOS
second:
enabled: 1
settings: {}
- first:
tvOS: tvOS
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:
+145 -145
View File
@@ -1,145 +1,145 @@
//#define AFSDK_WIN_DEBUG
//#define UNITY_WSA_10_0
//#define ENABLE_WINMD_SUPPORT
#if UNITY_WSA_10_0
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.ComponentModel;
using UnityEngine;
using System.Threading.Tasks;
#if ENABLE_WINMD_SUPPORT
using AppsFlyerLib;
#endif
namespace AppsFlyerSDK
{
public class AppsFlyerWindows
{
#if ENABLE_WINMD_SUPPORT
static private MonoBehaviour _gameObject = null;
#endif
public static void InitSDK(string devKey, string appId, MonoBehaviour gameObject)
{
#if ENABLE_WINMD_SUPPORT
#if AFSDK_WIN_DEBUG
// Remove callstack
Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.None);
#endif
Log("[InitSDK]: devKey: {0}, appId: {1}, gameObject: {2}", devKey, appId, gameObject == null ? "null" : gameObject.ToString());
AppsFlyerTracker tracker = AppsFlyerTracker.GetAppsFlyerTracker();
tracker.devKey = devKey;
tracker.appId = appId;
// Interface
_gameObject = gameObject;
#endif
}
public static string GetAppsFlyerId()
{
#if ENABLE_WINMD_SUPPORT
Log("[GetAppsFlyerId]");
return AppsFlyerTracker.GetAppsFlyerTracker().GetAppsFlyerUID();
#else
return "";
#endif
}
public static void SetCustomerUserId(string customerUserId)
{
#if ENABLE_WINMD_SUPPORT
Log("[SetCustomerUserId] customerUserId: {0}", customerUserId);
if (customerUserId.Contains("test_device:"))
{
string testDeviceId = customerUserId.Substring(12);
AppsFlyerTracker.GetAppsFlyerTracker().testDeviceId = testDeviceId;
}
AppsFlyerTracker.GetAppsFlyerTracker().customerUserId = customerUserId;
#endif
}
public static void Start()
{
#if ENABLE_WINMD_SUPPORT
Log("[Start]");
AppsFlyerTracker.GetAppsFlyerTracker().TrackAppLaunchAsync(Callback);
#endif
}
#if ENABLE_WINMD_SUPPORT
public static void Callback(AppsFlyerLib.ServerStatusCode code)
{
Log("[Callback]: {0}", code.ToString());
AppsFlyerRequestEventArgs eventArgs = new AppsFlyerRequestEventArgs((int)code, code.ToString());
if (_gameObject != null) {
var method = _gameObject.GetType().GetMethod("AppsFlyerOnRequestResponse");
if (method != null) {
method.Invoke(_gameObject, new object[] { AppsFlyerTracker.GetAppsFlyerTracker(), eventArgs });
}
}
}
#endif
public static void LogEvent(string eventName, Dictionary<string, string> eventValues)
{
#if ENABLE_WINMD_SUPPORT
if (eventValues == null)
{
eventValues = new Dictionary<string, string>();
}
IDictionary<string, object> result = new Dictionary<string, object>();
foreach (KeyValuePair<string, string> kvp in eventValues)
{
result.Add(kvp.Key.ToString(), kvp.Value);
}
Log("[LogEvent]: eventName: {0} result: {1}", eventName, result.ToString());
AppsFlyerTracker tracker = AppsFlyerTracker.GetAppsFlyerTracker();
tracker.TrackEvent(eventName, result);
#endif
}
public static void GetConversionData(string _reserved)
{
#if ENABLE_WINMD_SUPPORT
Task.Run(async () =>
{
AppsFlyerLib.AppsFlyerTracker tracker = AppsFlyerLib.AppsFlyerTracker.GetAppsFlyerTracker();
string conversionData = await tracker.GetConversionDataAsync();
IAppsFlyerConversionData conversionDataHandler = _gameObject as IAppsFlyerConversionData;
if (conversionDataHandler != null)
{
Log("[GetConversionData] Will call `onConversionDataSuccess` with: {0}", conversionData);
conversionDataHandler.onConversionDataSuccess(conversionData);
} else {
Log("[GetConversionData] Object with `IAppsFlyerConversionData` interface not found! Check `InitSDK` implementation");
}
// _gameObject.GetType().GetMethod("onConversionDataSuccess").Invoke(_gameObject, new[] { conversionData });
});
#endif
}
private static void Log(string format, params string[] args)
{
#if AFSDK_WIN_DEBUG
#if ENABLE_WINMD_SUPPORT
Debug.Log("AF_UNITY_WSA_10_0" + String.Format(format, args));
#endif
#endif
}
}
}
#endif
//#define AFSDK_WIN_DEBUG
//#define UNITY_WSA_10_0
//#define ENABLE_WINMD_SUPPORT
#if UNITY_WSA_10_0
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.ComponentModel;
using UnityEngine;
using System.Threading.Tasks;
#if ENABLE_WINMD_SUPPORT
using AppsFlyerLib;
#endif
namespace AppsFlyerSDK
{
public class AppsFlyerWindows
{
#if ENABLE_WINMD_SUPPORT
static private MonoBehaviour _gameObject = null;
#endif
public static void InitSDK(string devKey, string appId, MonoBehaviour gameObject)
{
#if ENABLE_WINMD_SUPPORT
#if AFSDK_WIN_DEBUG
// Remove callstack
Application.SetStackTraceLogType(LogType.Log, StackTraceLogType.None);
#endif
Log("[InitSDK]: devKey: {0}, appId: {1}, gameObject: {2}", devKey, appId, gameObject == null ? "null" : gameObject.ToString());
AppsFlyerTracker tracker = AppsFlyerTracker.GetAppsFlyerTracker();
tracker.devKey = devKey;
tracker.appId = appId;
// Interface
_gameObject = gameObject;
#endif
}
public static string GetAppsFlyerId()
{
#if ENABLE_WINMD_SUPPORT
Log("[GetAppsFlyerId]");
return AppsFlyerTracker.GetAppsFlyerTracker().GetAppsFlyerUID();
#else
return "";
#endif
}
public static void SetCustomerUserId(string customerUserId)
{
#if ENABLE_WINMD_SUPPORT
Log("[SetCustomerUserId] customerUserId: {0}", customerUserId);
if (customerUserId.Contains("test_device:"))
{
string testDeviceId = customerUserId.Substring(12);
AppsFlyerTracker.GetAppsFlyerTracker().testDeviceId = testDeviceId;
}
AppsFlyerTracker.GetAppsFlyerTracker().customerUserId = customerUserId;
#endif
}
public static void Start()
{
#if ENABLE_WINMD_SUPPORT
Log("[Start]");
AppsFlyerTracker.GetAppsFlyerTracker().TrackAppLaunchAsync(Callback);
#endif
}
#if ENABLE_WINMD_SUPPORT
public static void Callback(AppsFlyerLib.ServerStatusCode code)
{
Log("[Callback]: {0}", code.ToString());
AppsFlyerRequestEventArgs eventArgs = new AppsFlyerRequestEventArgs((int)code, code.ToString());
if (_gameObject != null) {
var method = _gameObject.GetType().GetMethod("AppsFlyerOnRequestResponse");
if (method != null) {
method.Invoke(_gameObject, new object[] { AppsFlyerTracker.GetAppsFlyerTracker(), eventArgs });
}
}
}
#endif
public static void LogEvent(string eventName, Dictionary<string, string> eventValues)
{
#if ENABLE_WINMD_SUPPORT
if (eventValues == null)
{
eventValues = new Dictionary<string, string>();
}
IDictionary<string, object> result = new Dictionary<string, object>();
foreach (KeyValuePair<string, string> kvp in eventValues)
{
result.Add(kvp.Key.ToString(), kvp.Value);
}
Log("[LogEvent]: eventName: {0} result: {1}", eventName, result.ToString());
AppsFlyerTracker tracker = AppsFlyerTracker.GetAppsFlyerTracker();
tracker.TrackEvent(eventName, result);
#endif
}
public static void GetConversionData(string _reserved)
{
#if ENABLE_WINMD_SUPPORT
Task.Run(async () =>
{
AppsFlyerLib.AppsFlyerTracker tracker = AppsFlyerLib.AppsFlyerTracker.GetAppsFlyerTracker();
string conversionData = await tracker.GetConversionDataAsync();
IAppsFlyerConversionData conversionDataHandler = _gameObject as IAppsFlyerConversionData;
if (conversionDataHandler != null)
{
Log("[GetConversionData] Will call `onConversionDataSuccess` with: {0}", conversionData);
conversionDataHandler.onConversionDataSuccess(conversionData);
} else {
Log("[GetConversionData] Object with `IAppsFlyerConversionData` interface not found! Check `InitSDK` implementation");
}
// _gameObject.GetType().GetMethod("onConversionDataSuccess").Invoke(_gameObject, new[] { conversionData });
});
#endif
}
private static void Log(string format, params string[] args)
{
#if AFSDK_WIN_DEBUG
#if ENABLE_WINMD_SUPPORT
Debug.Log("AF_UNITY_WSA_10_0" + String.Format(format, args));
#endif
#endif
}
}
}
#endif
View File
@@ -2,7 +2,6 @@ using System.Collections;
using UnityEngine;
using AppsFlyerSDK;
using System.Collections.Generic;
using Unity.Advertisement.IosSupport;
using BingoBrain;
using BingoBrain.Core;
using System;
+28 -5
View File
@@ -3,24 +3,32 @@ using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
public class PostProcessBuild : IPostprocessBuildWithReport
{
public int callbackOrder => 1;
public void OnPostprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
public void OnPostprocessBuild(BuildReport report)
{
//检查是否为 iOS 平台构建
// 检查是否为 iOS 平台构建
if (report.summary.platform == BuildTarget.iOS)
{
string projectPath = report.summary.outputPath;
string customControllerPath = "Assets/Editor/UnityAppController.mm"; // 自定义文件的路径
string projFilePath = PBXProject.GetPBXProjectPath(projectPath);
PBXProject proj = new PBXProject();
proj.ReadFromFile(projFilePath);
string targetGuid = proj.GetUnityFrameworkTargetGuid();
// 示例:复制自定义 UnityAppController.mm
string customControllerPath = "Assets/Editor/UnityAppController.mm";
string destinationPath = Path.Combine(projectPath, "Classes/UnityAppController.mm");
if (File.Exists(customControllerPath))
{
// 复制文件到 Xcode 项目中
File.Copy(customControllerPath, destinationPath, overwrite: true);
Debug.Log("Custom UnityAppController.mm has been copied to Xcode project.");
}
@@ -28,6 +36,21 @@ public class PostProcessBuild : IPostprocessBuildWithReport
{
Debug.LogError("Custom UnityAppController.mm file not found at " + customControllerPath);
}
// 示例:添加插件文件时避免重复
string pluginPath = Path.Combine(projectPath, "Libraries/Plugins/iOS/pluginIOs.mm");
if (!proj.ContainsFileByRealPath(pluginPath))
{
string fileGuid = proj.AddFile(pluginPath, "Libraries/Plugins/iOS/pluginIOs.mm", PBXSourceTree.Source);
proj.AddFileToBuild(targetGuid, fileGuid);
Debug.Log("pluginIOs.mm added to UnityFramework target.");
}
else
{
Debug.Log("pluginIOs.mm already exists, skip adding.");
}
File.WriteAllText(projFilePath, proj.WriteToString());
}
}
}
}
@@ -1,42 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0863bf92b4fcc45b0b9267325249bf0f, type: 3}
m_Name: NotificationSettings
m_EditorClassIdentifier:
toolbarInt: 0
iOSNotificationEditorSettingsValues:
keys:
- UnityNotificationRequestAuthorizationOnAppLaunch
- UnityNotificationDefaultAuthorizationOptions
- UnityAddRemoteNotificationCapability
- UnityNotificationRequestAuthorizationForRemoteNotificationsOnAppLaunch
- UnityRemoteNotificationForegroundPresentationOptions
- UnityUseAPSReleaseEnvironment
- UnityUseLocationNotificationTrigger
values:
- True
- 7
- False
- False
- -1
- False
- False
AndroidNotificationEditorSettingsValues:
keys:
- UnityNotificationAndroidRescheduleOnDeviceRestart
- UnityNotificationAndroidUseCustomActivity
- UnityNotificationAndroidCustomActivityString
values:
- False
- False
- com.unity3d.player.UnityPlayerActivity
TrackedResourceAssets: []
+20 -20
View File
@@ -1,20 +1,20 @@
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseAnalytics iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Analytics" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseAnalytics iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Analytics" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
View File
+24 -24
View File
@@ -1,24 +1,24 @@
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseApp iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Core" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-common:21.0.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.android.gms:play-services-base:18.6.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-app-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseApp iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Core" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-common:21.0.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.android.gms:play-services-base:18.6.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-app-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
View File
+22 -22
View File
@@ -1,22 +1,22 @@
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseCrashlytics iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Crashlytics" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-crashlytics-ndk:19.4.2">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-crashlytics-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseCrashlytics iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Crashlytics" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-crashlytics-ndk:19.4.2">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-crashlytics-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
View File
+26 -26
View File
@@ -1,26 +1,26 @@
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseMessaging iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Messaging" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-messaging:24.1.1">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-iid:21.1.0">
</androidPackage>
<androidPackage spec="com.google.flatbuffers:flatbuffers-java:1.12.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-messaging-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
<!-- Copyright (C) 2019 Google Inc. All Rights Reserved.
FirebaseMessaging iOS and Android Dependencies.
-->
<dependencies>
<iosPods>
<iosPod name="Firebase/Messaging" version="11.10.0" minTargetSdk="13.0">
</iosPod>
</iosPods>
<androidPackages>
<androidPackage spec="com.google.firebase:firebase-messaging:24.1.1">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-analytics:22.4.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-iid:21.1.0">
</androidPackage>
<androidPackage spec="com.google.flatbuffers:flatbuffers-java:1.12.0">
</androidPackage>
<androidPackage spec="com.google.firebase:firebase-messaging-unity:12.8.0">
<repositories>
<repository>Assets/Firebase/m2repository</repository>
</repositories>
</androidPackage>
</androidPackages>
</dependencies>
View File
Regular → Executable
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
@@ -1,9 +1,9 @@
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-analytics-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-analytics-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
@@ -1,9 +1,9 @@
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-app-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-app-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
@@ -1,9 +1,9 @@
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-crashlytics-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-crashlytics-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
@@ -1,9 +1,9 @@
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-messaging-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
<metadata>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-messaging-unity</artifactId>
<versioning>
<release>12.8.0</release>
<versions><version>12.8.0</version></versions>
<lastUpdated/>
</versioning>
</metadata>
View File
View File
View File
View File
+231 -231
View File
@@ -1,231 +1,231 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using MYp0ZVTT2QSDK;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
public class MYp0ZVTT2QSDKDemo : MonoBehaviour
{
public void ShowReward()
{
MYp0ZVTT2QSDKHelper.Instance.ShowRewardVideo("TAG", b =>
{
Debug.LogError($"reward result = {b}");
},(() =>
{
Debug.LogError($"reward close!!!");
}));
}
public void ShowInter()
{
MYp0ZVTT2QSDKHelper.Instance.ShowInter("TAG", () =>
{
Debug.LogError("inter hide");
});
}
public void ShowAdmobInter()
{
MYp0ZVTT2QSDKHelper.Instance.ShowAdmobInter("TAG", () =>
{
Debug.LogError("inter hide");
});
}
public void ShowSplash()
{
MYp0ZVTT2QSDKHelper.Instance.ShowSplash();
}
public void CheckReward(Image btnImg)
{
var isReady = MYp0ZVTT2QSDKHelper.Instance.IsVideoReady();
btnImg.color = isReady ? Color.green : Color.white;
Debug.Log($"Reward : {isReady}");
}
public void CheckInter(Image btnImg)
{
var isReady = MYp0ZVTT2QSDKHelper.Instance.IsInterReady();
btnImg.color = isReady ? Color.green : Color.white;
Debug.Log($"Inter : {isReady}");
}
public void CheckSplash(Image btnImg)
{
var isReady = MYp0ZVTT2QSDKHelper.Instance.IsSplashReady();
btnImg.color = isReady ? Color.green : Color.white;
Debug.Log($"Splash : {isReady}");
}
public void Track()
{
MYp0ZVTT2QSDKHelper.Instance.Track("test", new Dictionary<string, string>()
{
{"evt1", "1"},
{"evt2", "2"},
{"evt3", "3"},
{"evt4", "4"},
{"evt5", "5"},
{"evt6", "6"},
{"evt7", "7"},
{"evt8", "8"},
{"evt9", "9"},
});
}
public void GetCountryCode()
{
var code = MYp0ZVTT2QSDKHelper.Instance.GetCountryCode();
Debug.Log($"country : {code}");
}
public void ShowH5()
{
MYp0ZVTT2QSDKHelper.Instance.H5.ShowH5((() =>
{
Debug.Log("H5 close");
}), () =>
{
Debug.Log($"H5 show failed!");
});
}
public void ShowH5(RectTransform rectTransform)
{
MYp0ZVTT2QSDKHelper.Instance.H5.ShowH5(rectTransform);
}
public void HideH5()
{
MYp0ZVTT2QSDKHelper.Instance.H5.HideH5();
}
public void CheckShowH5(Image btnImg)
{
var show = MYp0ZVTT2QSDKHelper.Instance.H5.IsShowH5();
btnImg.color = show ? Color.green : Color.red;
Debug.Log($"CheckShowH5 : {show}");
}
private int _level = 1;
public void TrackLevel()
{
MYp0ZVTT2QSDKHelper.Instance.TrackLevelUp(_level);
if (Random.Range(0, 100) < 50)
{
_level++;
}
}
private string withDrawSceneId = "";
public void GetWithDrawConfigs()
{
MYp0ZVTT2QSDKHelper.Instance.GetWithDrawConfigs(((b, s) =>
{
Debug.Log($"GetWithDrawConfigs result : {b}, data : {s}");
if (b)
{
var cfgs = JsonConvert.DeserializeObject<List<WithDrawConfig>>(s);
int idx = 0;
foreach (WithDrawConfig config in cfgs)
{
Debug.Log($"index = {idx}, {config.ToString()}");
if (idx == 0)
withDrawSceneId = config.SecneId;
idx++;
}
}
}));
}
private int payIndex = 0;
public void CreateWithDrawOrder()
{
string taxNo = "";
string payAccount = "tom@gmail.com";
string accountType = "E";
PaymentTypeCode payCode = PaymentTypeCode.GOPAY;
//GOPAY DANA 收款账号需要为电话号码
if (payIndex == 1 || payIndex == 0)
{
payCode = payIndex == 1 ? PaymentTypeCode.DANA : payCode;
payAccount = "0881234567890";
accountType = "P";
}
if (payIndex == 2)
{
// PIX 需要填写税号
payCode = PaymentTypeCode.PIX;
taxNo = "99999999999";
}
if (payIndex == 3) payCode = PaymentTypeCode.MERCADOPAGO;
MYp0ZVTT2QSDKHelper.Instance.CreateWithDrawOrder(withDrawSceneId, payCode, payAccount, accountType, "testName", taxNo, b =>
{
Debug.Log($"CreateWithDrawOrder result : {b}");
});
payIndex++;
payIndex = payIndex > 3 ? 0 : payIndex;
}
public void GetWithDrawOrders()
{
MYp0ZVTT2QSDKHelper.Instance.GetWithDrawOrders(((b, s) =>
{
Debug.Log($"GetWithDrawOrders result : {b}, data : {s}");
if (b)
{
var cfgs = JsonConvert.DeserializeObject<List<WithDrawOrder>>(s);
int idx = 0;
foreach (WithDrawOrder config in cfgs)
{
Debug.Log($"index = {idx}, {config.ToString()}");
idx++;
}
}
}));
}
// Start is called before the first frame update
void Start()
{
Init();
Invoke("ShowSplash", 5);
}
// Update is called once per frame
void Update()
{
}
private void Init()
{
MYp0ZVTT2QSDKHelper.Instance.RegistIosParam((i =>
{
Debug.Log($"ios ab param : {i}");
}));
void GameConfig(bool result, string config)
{
Debug.Log($"************* game config result : {result}, config : {config}");
}
MYp0ZVTT2QSDKHelper.Instance.Init(null, "app_config", GameConfig);
}
public static string GetSdkVersion()
{
return MYp0ZVTT2QSDKHelper.SdkVersion;
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using MYp0ZVTT2QSDK;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
public class MYp0ZVTT2QSDKDemo : MonoBehaviour
{
public void ShowReward()
{
MYp0ZVTT2QSDKHelper.Instance.ShowRewardVideo("TAG", b =>
{
Debug.LogError($"reward result = {b}");
},(() =>
{
Debug.LogError($"reward close!!!");
}));
}
public void ShowInter()
{
MYp0ZVTT2QSDKHelper.Instance.ShowInter("TAG", () =>
{
Debug.LogError("inter hide");
});
}
public void ShowAdmobInter()
{
MYp0ZVTT2QSDKHelper.Instance.ShowAdmobInter("TAG", () =>
{
Debug.LogError("inter hide");
});
}
public void ShowSplash()
{
MYp0ZVTT2QSDKHelper.Instance.ShowSplash();
}
public void CheckReward(Image btnImg)
{
var isReady = MYp0ZVTT2QSDKHelper.Instance.IsVideoReady();
btnImg.color = isReady ? Color.green : Color.white;
Debug.Log($"Reward : {isReady}");
}
public void CheckInter(Image btnImg)
{
var isReady = MYp0ZVTT2QSDKHelper.Instance.IsInterReady();
btnImg.color = isReady ? Color.green : Color.white;
Debug.Log($"Inter : {isReady}");
}
public void CheckSplash(Image btnImg)
{
var isReady = MYp0ZVTT2QSDKHelper.Instance.IsSplashReady();
btnImg.color = isReady ? Color.green : Color.white;
Debug.Log($"Splash : {isReady}");
}
public void Track()
{
MYp0ZVTT2QSDKHelper.Instance.Track("test", new Dictionary<string, string>()
{
{"evt1", "1"},
{"evt2", "2"},
{"evt3", "3"},
{"evt4", "4"},
{"evt5", "5"},
{"evt6", "6"},
{"evt7", "7"},
{"evt8", "8"},
{"evt9", "9"},
});
}
public void GetCountryCode()
{
var code = MYp0ZVTT2QSDKHelper.Instance.GetCountryCode();
Debug.Log($"country : {code}");
}
public void ShowH5()
{
MYp0ZVTT2QSDKHelper.Instance.H5.ShowH5((() =>
{
Debug.Log("H5 close");
}), () =>
{
Debug.Log($"H5 show failed!");
});
}
public void ShowH5(RectTransform rectTransform)
{
MYp0ZVTT2QSDKHelper.Instance.H5.ShowH5(rectTransform);
}
public void HideH5()
{
MYp0ZVTT2QSDKHelper.Instance.H5.HideH5();
}
public void CheckShowH5(Image btnImg)
{
var show = MYp0ZVTT2QSDKHelper.Instance.H5.IsShowH5();
btnImg.color = show ? Color.green : Color.red;
Debug.Log($"CheckShowH5 : {show}");
}
private int _level = 1;
public void TrackLevel()
{
MYp0ZVTT2QSDKHelper.Instance.TrackLevelUp(_level);
if (Random.Range(0, 100) < 50)
{
_level++;
}
}
private string withDrawSceneId = "";
public void GetWithDrawConfigs()
{
MYp0ZVTT2QSDKHelper.Instance.GetWithDrawConfigs(((b, s) =>
{
Debug.Log($"GetWithDrawConfigs result : {b}, data : {s}");
if (b)
{
var cfgs = JsonConvert.DeserializeObject<List<WithDrawConfig>>(s);
int idx = 0;
foreach (WithDrawConfig config in cfgs)
{
Debug.Log($"index = {idx}, {config.ToString()}");
if (idx == 0)
withDrawSceneId = config.SecneId;
idx++;
}
}
}));
}
private int payIndex = 0;
public void CreateWithDrawOrder()
{
string taxNo = "";
string payAccount = "tom@gmail.com";
string accountType = "E";
PaymentTypeCode payCode = PaymentTypeCode.GOPAY;
//GOPAY DANA 收款账号需要为电话号码
if (payIndex == 1 || payIndex == 0)
{
payCode = payIndex == 1 ? PaymentTypeCode.DANA : payCode;
payAccount = "0881234567890";
accountType = "P";
}
if (payIndex == 2)
{
// PIX 需要填写税号
payCode = PaymentTypeCode.PIX;
taxNo = "99999999999";
}
if (payIndex == 3) payCode = PaymentTypeCode.MERCADOPAGO;
MYp0ZVTT2QSDKHelper.Instance.CreateWithDrawOrder(withDrawSceneId, payCode, payAccount, accountType, "testName", taxNo, b =>
{
Debug.Log($"CreateWithDrawOrder result : {b}");
});
payIndex++;
payIndex = payIndex > 3 ? 0 : payIndex;
}
public void GetWithDrawOrders()
{
MYp0ZVTT2QSDKHelper.Instance.GetWithDrawOrders(((b, s) =>
{
Debug.Log($"GetWithDrawOrders result : {b}, data : {s}");
if (b)
{
var cfgs = JsonConvert.DeserializeObject<List<WithDrawOrder>>(s);
int idx = 0;
foreach (WithDrawOrder config in cfgs)
{
Debug.Log($"index = {idx}, {config.ToString()}");
idx++;
}
}
}));
}
// Start is called before the first frame update
void Start()
{
Init();
Invoke("ShowSplash", 5);
}
// Update is called once per frame
void Update()
{
}
private void Init()
{
MYp0ZVTT2QSDKHelper.Instance.RegistIosParam((i =>
{
Debug.Log($"ios ab param : {i}");
}));
void GameConfig(bool result, string config)
{
Debug.Log($"************* game config result : {result}, config : {config}");
}
MYp0ZVTT2QSDKHelper.Instance.Init(null, "app_config", GameConfig);
}
public static string GetSdkVersion()
{
return MYp0ZVTT2QSDKHelper.SdkVersion;
}
}
+11 -11
View File
@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 959ec24a7131c9d488e5007fa82612be
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 959ec24a7131c9d488e5007fa82612be
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+653 -653
View File
File diff suppressed because it is too large Load Diff
View File
+16 -16
View File
@@ -1,17 +1,17 @@
package com.tool.countrycode;
import android.app.Activity;
import java.util.Locale;
public class AcquireCountryCode {
// 获取国家码
public static String getCountryCode()
{
Locale locale = Locale.getDefault();
return locale.getCountry();
}
public static String getCountryCode3() {
Locale currentLocale = Locale.getDefault();
return currentLocale.getISO3Country();
}
package com.tool.countrycode;
import android.app.Activity;
import java.util.Locale;
public class AcquireCountryCode {
// 获取国家码
public static String getCountryCode()
{
Locale locale = Locale.getDefault();
return locale.getCountry();
}
public static String getCountryCode3() {
Locale currentLocale = Locale.getDefault();
return currentLocale.getISO3Country();
}
}
View File
View File
+33 -33
View File
@@ -1,33 +1,33 @@
fileFormatVersion: 2
guid: 6e3da5c7fe21c1347a563e64e8f305d4
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 6e3da5c7fe21c1347a563e64e8f305d4
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:
View File
View File
+12 -12
View File
@@ -1,12 +1,12 @@
#import <Foundation/Foundation.h>
extern "C" {
__attribute__((visibility("default")))
const char* _GetDeviceCountryCode() {
@autoreleasepool {
NSLocale *currentLocale = [NSLocale currentLocale];
NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode];
return strdup([countryCode UTF8String]); // 使用strdup确保内存安全
}
}
}
#import <Foundation/Foundation.h>
extern "C" {
__attribute__((visibility("default")))
const char* _GetDeviceCountryCode() {
@autoreleasepool {
NSLocale *currentLocale = [NSLocale currentLocale];
NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode];
return strdup([countryCode UTF8String]); // 使用strdup确保内存安全
}
}
}
View File
+13 -13
View File
@@ -1,14 +1,14 @@
{
"name": "SDKConfig",
"rootNamespace": "",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
{
"name": "SDKConfig",
"rootNamespace": "",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}
+7 -7
View File
@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 8b6da46957b38914aa097a61bd86a16d
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 8b6da46957b38914aa097a61bd86a16d
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+234 -234
View File
@@ -1,234 +1,234 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MYp0ZVTT2QSDK
{
[System.Serializable]
public class SDKConfig : ScriptableObject
{
public string appsFlyerDevKey;
public string appsFlyerIosAppleAppId;
public string appKey;
public string appSecret;
public string logReportUrl;
public string maxAppKey;
public string splashUnitId;
public string bannerUnitId;
public string interUnitId;
public string videoUnitId;
public string kwaiAppId;
public List<string> kwaiVideoUnitId = new();
public List<string> kwaiInterUnitId = new();
public string bigoAppId;
public List<string> bigoVideoUnitId = new();
public List<string> bigoInterUnitId = new();
public string bigoSplashUnitId;
public string toponAppId;
public string toponAppkey;
public string toponVideoUnitId;
public string toponInterUnitId;
public string admobAppId;
public string admobVideoUnitId;
public string admobInterUnitId;
public string admobSplashUnitId;
public bool isDebug = false;
public bool isPrintLog = false;
public bool isUseAdmobSplash = false;
private static SDKConfig _instance;
public static SDKConfig Instance
{
get
{
if (_instance != null) return _instance;
_instance = AssetUtils.GetScriptableObject<SDKConfig>(typeof(SDKConfig).Name, "Assets/Resources", false, false);
return _instance;
}
set
{
_instance = value;
}
}
public static string AppsFlyerDevKey
{
get { return Instance.appsFlyerDevKey; }
}
public static string AppsFlyerIosAppleAppId
{
get { return Instance.appsFlyerIosAppleAppId; }
}
public static string AppKey
{
get { return Instance.appKey; }
}
public static string AppSecret
{
get { return Instance.appSecret; }
}
public static string LogReportUrl
{
get
{
if (!Instance.logReportUrl.StartsWith("http"))
{
return "https://" + Instance.logReportUrl.Replace(" ", ""); ;
}
return Instance.logReportUrl.Replace(" ", ""); ;
}
}
public static string MaxAppKey
{
get { return Instance.maxAppKey; }
}
public static string SplashUnitID
{
get { return Instance.splashUnitId; }
}
public static string BannerUnitId
{
get { return Instance.bannerUnitId; }
}
public static string InterUnitId
{
get { return Instance.interUnitId; }
}
public static string VideoUnitId
{
get { return Instance.videoUnitId; }
}
public static string KwaiAppId
{
get => Instance.kwaiAppId;
set => Instance.kwaiAppId = value;
}
public static List<string> KwaiVideoUnitId
{
get => Instance.kwaiVideoUnitId;
set => Instance.kwaiVideoUnitId = value;
}
public static List<string> KwaiInterUnitId
{
get => Instance.kwaiInterUnitId;
set => Instance.kwaiInterUnitId = value;
}
public static string BigoAppId
{
get => Instance.bigoAppId;
set => Instance.bigoAppId = value;
}
public static List<string> BigoVideoUnitId
{
get => Instance.bigoVideoUnitId;
set => Instance.bigoVideoUnitId = value;
}
public static List<string> BigoInterUnitId
{
get => Instance.bigoInterUnitId;
set => Instance.bigoInterUnitId = value;
}
public static string BigoSplashUnitId
{
get => Instance.bigoSplashUnitId;
set => Instance.bigoSplashUnitId = value;
}
public static string ToponAppId
{
get { return Instance.toponAppId; }
}
public static string ToponAppkey
{
get { return Instance.toponAppkey; }
}
public static string ToponVideoUnitId
{
get { return Instance.toponVideoUnitId; }
}
public static string ToponInterUnitId
{
get { return Instance.toponInterUnitId; }
}
public static string AdmobAppId
{
get => Instance.admobAppId;
set => Instance.admobAppId = value;
}
public static string AdmobVideoUnitId
{
get => Instance.admobVideoUnitId;
set => Instance.admobVideoUnitId = value;
}
public static string AdmobSplashUnitId
{
get => Instance.admobSplashUnitId;
set => Instance.admobSplashUnitId = value;
}
public static string AdmobInterUnitId
{
get => Instance.admobInterUnitId;
set => Instance.admobInterUnitId = value;
}
public static bool IsDebug => Instance.isDebug;
public static bool IsPrintLog => Instance.isPrintLog;
public static bool IsUseAdmobSplash => Instance.isUseAdmobSplash;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MYp0ZVTT2QSDK
{
[System.Serializable]
public class SDKConfig : ScriptableObject
{
public string appsFlyerDevKey;
public string appsFlyerIosAppleAppId;
public string appKey;
public string appSecret;
public string logReportUrl;
public string maxAppKey;
public string splashUnitId;
public string bannerUnitId;
public string interUnitId;
public string videoUnitId;
public string kwaiAppId;
public List<string> kwaiVideoUnitId = new();
public List<string> kwaiInterUnitId = new();
public string bigoAppId;
public List<string> bigoVideoUnitId = new();
public List<string> bigoInterUnitId = new();
public string bigoSplashUnitId;
public string toponAppId;
public string toponAppkey;
public string toponVideoUnitId;
public string toponInterUnitId;
public string admobAppId;
public string admobVideoUnitId;
public string admobInterUnitId;
public string admobSplashUnitId;
public bool isDebug = false;
public bool isPrintLog = false;
public bool isUseAdmobSplash = false;
private static SDKConfig _instance;
public static SDKConfig Instance
{
get
{
if (_instance != null) return _instance;
_instance = AssetUtils.GetScriptableObject<SDKConfig>(typeof(SDKConfig).Name, "Assets/Resources", false, false);
return _instance;
}
set
{
_instance = value;
}
}
public static string AppsFlyerDevKey
{
get { return Instance.appsFlyerDevKey; }
}
public static string AppsFlyerIosAppleAppId
{
get { return Instance.appsFlyerIosAppleAppId; }
}
public static string AppKey
{
get { return Instance.appKey; }
}
public static string AppSecret
{
get { return Instance.appSecret; }
}
public static string LogReportUrl
{
get
{
if (!Instance.logReportUrl.StartsWith("http"))
{
return "https://" + Instance.logReportUrl.Replace(" ", ""); ;
}
return Instance.logReportUrl.Replace(" ", ""); ;
}
}
public static string MaxAppKey
{
get { return Instance.maxAppKey; }
}
public static string SplashUnitID
{
get { return Instance.splashUnitId; }
}
public static string BannerUnitId
{
get { return Instance.bannerUnitId; }
}
public static string InterUnitId
{
get { return Instance.interUnitId; }
}
public static string VideoUnitId
{
get { return Instance.videoUnitId; }
}
public static string KwaiAppId
{
get => Instance.kwaiAppId;
set => Instance.kwaiAppId = value;
}
public static List<string> KwaiVideoUnitId
{
get => Instance.kwaiVideoUnitId;
set => Instance.kwaiVideoUnitId = value;
}
public static List<string> KwaiInterUnitId
{
get => Instance.kwaiInterUnitId;
set => Instance.kwaiInterUnitId = value;
}
public static string BigoAppId
{
get => Instance.bigoAppId;
set => Instance.bigoAppId = value;
}
public static List<string> BigoVideoUnitId
{
get => Instance.bigoVideoUnitId;
set => Instance.bigoVideoUnitId = value;
}
public static List<string> BigoInterUnitId
{
get => Instance.bigoInterUnitId;
set => Instance.bigoInterUnitId = value;
}
public static string BigoSplashUnitId
{
get => Instance.bigoSplashUnitId;
set => Instance.bigoSplashUnitId = value;
}
public static string ToponAppId
{
get { return Instance.toponAppId; }
}
public static string ToponAppkey
{
get { return Instance.toponAppkey; }
}
public static string ToponVideoUnitId
{
get { return Instance.toponVideoUnitId; }
}
public static string ToponInterUnitId
{
get { return Instance.toponInterUnitId; }
}
public static string AdmobAppId
{
get => Instance.admobAppId;
set => Instance.admobAppId = value;
}
public static string AdmobVideoUnitId
{
get => Instance.admobVideoUnitId;
set => Instance.admobVideoUnitId = value;
}
public static string AdmobSplashUnitId
{
get => Instance.admobSplashUnitId;
set => Instance.admobSplashUnitId = value;
}
public static string AdmobInterUnitId
{
get => Instance.admobInterUnitId;
set => Instance.admobInterUnitId = value;
}
public static bool IsDebug => Instance.isDebug;
public static bool IsPrintLog => Instance.isPrintLog;
public static bool IsUseAdmobSplash => Instance.isUseAdmobSplash;
}
}
View File
+152 -152
View File
@@ -1,152 +1,152 @@
using System;
using System.IO;
using UnityEngine;
#if UNITY_EDITOR
using System.Collections.Generic;
using UnityEditor;
#endif
namespace MYp0ZVTT2QSDK
{
public static class AssetUtils
{
/// <summary>
/// Returns a reference to a scriptable object of type T with the given fileName at the relative resourcesPath.
/// <para/> If the asset is not found, one will get created automatically (in the Editor only)
/// </summary>
/// <param name="fileName"></param>
/// <param name="resourcesPath"></param>
/// <param name="saveAssetDatabase"></param>
/// <param name="refreshAssetDatabase"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T GetScriptableObject<T>(string fileName,
string resourcesPath,
bool saveAssetDatabase,
bool refreshAssetDatabase)
where T : ScriptableObject
{
if (string.IsNullOrEmpty(resourcesPath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!resourcesPath[resourcesPath.Length - 1].Equals(@"\")) resourcesPath += @"\";
// resourcesPath = resourcesPath.Replace(@"\", "/");
resourcesPath = CleanPath(resourcesPath);
var obj = (T)Resources.Load(fileName, typeof(T));
if (obj == null)
{
string simpleResourcesPath = resourcesPath.Replace(resourcesPath.Substring(0, resourcesPath.LastIndexOf("Resources", StringComparison.Ordinal)), "");
simpleResourcesPath = simpleResourcesPath.Replace("Resources", "").Remove(0, 1);
obj = (T)Resources.Load(Path.Combine(simpleResourcesPath, fileName), typeof(T));
}
#if UNITY_EDITOR
if (obj != null) return obj;
if (!Directory.Exists("Assets/Resources"))
{
Directory.CreateDirectory("Assets/Resources");
}
obj = CreateAsset<T>(resourcesPath, fileName, ".asset", saveAssetDatabase, refreshAssetDatabase);
#endif
return obj;
}
public static T GetResource<T>(string resourcesPath, string fileName) where T : ScriptableObject
{
if (string.IsNullOrEmpty(resourcesPath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
resourcesPath = CleanPath(resourcesPath);
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!resourcesPath[resourcesPath.Length - 1].Equals(@"\")) resourcesPath += @"\";
// resourcesPath = resourcesPath.Replace(@"\", "/");
return (T)Resources.Load(resourcesPath + fileName, typeof(T));
}
public static string CleanPath(string path)
{
// ReSharper disable once SuspiciousTypeConversion.Global
if (!path[path.Length - 1].Equals(@"\")) path += @"\";
path = path.Replace(@"\\", @"\");
path = path.Replace(@"\", "/");
return path;
}
#if UNITY_EDITOR
public static T CreateAsset<T>(string relativePath,
string fileName,
string extension = ".asset",
bool saveAssetDatabase = true,
bool refreshAssetDatabase = true)
where T : ScriptableObject
{
if (string.IsNullOrEmpty(relativePath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
relativePath = CleanPath(relativePath);
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!relativePath[relativePath.Length - 1].Equals(@"\")) relativePath += @"\";
// relativePath = relativePath.Replace(@"\\", @"\");
var asset = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(asset, relativePath + fileName + extension);
EditorUtility.SetDirty(asset);
if (saveAssetDatabase) AssetDatabase.SaveAssets();
if (refreshAssetDatabase) AssetDatabase.Refresh();
return asset;
}
public static List<T> GetAssets<T>() where T : ScriptableObject
{
var list = new List<T>();
string[] guids = AssetDatabase.FindAssets("t:" + typeof(T).Name);
foreach (string guid in guids)
{
var asset = AssetDatabase.LoadAssetAtPath<T>(AssetDatabase.GUIDToAssetPath(guid));
if (asset == null) continue;
list.Add(asset);
}
return list;
}
public static void MoveAssetToTrash(string relativePath, string fileName, bool saveAssetDatabase = true,
bool refreshAssetDatabase = true, bool printDebugMessage = true)
{
if (string.IsNullOrEmpty(relativePath)) return;
if (string.IsNullOrEmpty(fileName)) return;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!relativePath[relativePath.Length - 1].Equals(@"\")) relativePath += @"\";
relativePath = CleanPath(relativePath);
if (!AssetDatabase.MoveAssetToTrash(relativePath + fileName + ".asset")) return;
if (printDebugMessage) Debug.Log("The " + fileName + ".asset file has been moved to trash.");
if (saveAssetDatabase) AssetDatabase.SaveAssets();
if (refreshAssetDatabase) AssetDatabase.Refresh();
}
public static Texture GetTexture(string filePath, string fileName, string fileExtension = ".png")
{
if (string.IsNullOrEmpty(filePath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!filePath[filePath.Length - 1].Equals(@"\")) filePath += @"\";
filePath = CleanPath(filePath);
return AssetDatabase.LoadAssetAtPath<Texture>(filePath + fileName + fileExtension);
}
public static Texture2D GetTexture2D(string filePath, string fileName, string fileExtension = ".png")
{
if (string.IsNullOrEmpty(filePath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!filePath[filePath.Length - 1].Equals(@"\")) filePath += @"\";
filePath = CleanPath(filePath);
return AssetDatabase.LoadAssetAtPath<Texture2D>(filePath + fileName + fileExtension);
}
#endif
}
}
using System;
using System.IO;
using UnityEngine;
#if UNITY_EDITOR
using System.Collections.Generic;
using UnityEditor;
#endif
namespace MYp0ZVTT2QSDK
{
public static class AssetUtils
{
/// <summary>
/// Returns a reference to a scriptable object of type T with the given fileName at the relative resourcesPath.
/// <para/> If the asset is not found, one will get created automatically (in the Editor only)
/// </summary>
/// <param name="fileName"></param>
/// <param name="resourcesPath"></param>
/// <param name="saveAssetDatabase"></param>
/// <param name="refreshAssetDatabase"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T GetScriptableObject<T>(string fileName,
string resourcesPath,
bool saveAssetDatabase,
bool refreshAssetDatabase)
where T : ScriptableObject
{
if (string.IsNullOrEmpty(resourcesPath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!resourcesPath[resourcesPath.Length - 1].Equals(@"\")) resourcesPath += @"\";
// resourcesPath = resourcesPath.Replace(@"\", "/");
resourcesPath = CleanPath(resourcesPath);
var obj = (T)Resources.Load(fileName, typeof(T));
if (obj == null)
{
string simpleResourcesPath = resourcesPath.Replace(resourcesPath.Substring(0, resourcesPath.LastIndexOf("Resources", StringComparison.Ordinal)), "");
simpleResourcesPath = simpleResourcesPath.Replace("Resources", "").Remove(0, 1);
obj = (T)Resources.Load(Path.Combine(simpleResourcesPath, fileName), typeof(T));
}
#if UNITY_EDITOR
if (obj != null) return obj;
if (!Directory.Exists("Assets/Resources"))
{
Directory.CreateDirectory("Assets/Resources");
}
obj = CreateAsset<T>(resourcesPath, fileName, ".asset", saveAssetDatabase, refreshAssetDatabase);
#endif
return obj;
}
public static T GetResource<T>(string resourcesPath, string fileName) where T : ScriptableObject
{
if (string.IsNullOrEmpty(resourcesPath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
resourcesPath = CleanPath(resourcesPath);
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!resourcesPath[resourcesPath.Length - 1].Equals(@"\")) resourcesPath += @"\";
// resourcesPath = resourcesPath.Replace(@"\", "/");
return (T)Resources.Load(resourcesPath + fileName, typeof(T));
}
public static string CleanPath(string path)
{
// ReSharper disable once SuspiciousTypeConversion.Global
if (!path[path.Length - 1].Equals(@"\")) path += @"\";
path = path.Replace(@"\\", @"\");
path = path.Replace(@"\", "/");
return path;
}
#if UNITY_EDITOR
public static T CreateAsset<T>(string relativePath,
string fileName,
string extension = ".asset",
bool saveAssetDatabase = true,
bool refreshAssetDatabase = true)
where T : ScriptableObject
{
if (string.IsNullOrEmpty(relativePath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
relativePath = CleanPath(relativePath);
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!relativePath[relativePath.Length - 1].Equals(@"\")) relativePath += @"\";
// relativePath = relativePath.Replace(@"\\", @"\");
var asset = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(asset, relativePath + fileName + extension);
EditorUtility.SetDirty(asset);
if (saveAssetDatabase) AssetDatabase.SaveAssets();
if (refreshAssetDatabase) AssetDatabase.Refresh();
return asset;
}
public static List<T> GetAssets<T>() where T : ScriptableObject
{
var list = new List<T>();
string[] guids = AssetDatabase.FindAssets("t:" + typeof(T).Name);
foreach (string guid in guids)
{
var asset = AssetDatabase.LoadAssetAtPath<T>(AssetDatabase.GUIDToAssetPath(guid));
if (asset == null) continue;
list.Add(asset);
}
return list;
}
public static void MoveAssetToTrash(string relativePath, string fileName, bool saveAssetDatabase = true,
bool refreshAssetDatabase = true, bool printDebugMessage = true)
{
if (string.IsNullOrEmpty(relativePath)) return;
if (string.IsNullOrEmpty(fileName)) return;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!relativePath[relativePath.Length - 1].Equals(@"\")) relativePath += @"\";
relativePath = CleanPath(relativePath);
if (!AssetDatabase.MoveAssetToTrash(relativePath + fileName + ".asset")) return;
if (printDebugMessage) Debug.Log("The " + fileName + ".asset file has been moved to trash.");
if (saveAssetDatabase) AssetDatabase.SaveAssets();
if (refreshAssetDatabase) AssetDatabase.Refresh();
}
public static Texture GetTexture(string filePath, string fileName, string fileExtension = ".png")
{
if (string.IsNullOrEmpty(filePath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!filePath[filePath.Length - 1].Equals(@"\")) filePath += @"\";
filePath = CleanPath(filePath);
return AssetDatabase.LoadAssetAtPath<Texture>(filePath + fileName + fileExtension);
}
public static Texture2D GetTexture2D(string filePath, string fileName, string fileExtension = ".png")
{
if (string.IsNullOrEmpty(filePath)) return null;
if (string.IsNullOrEmpty(fileName)) return null;
// ReSharper disable once SuspiciousTypeConversion.Global
// if (!filePath[filePath.Length - 1].Equals(@"\")) filePath += @"\";
filePath = CleanPath(filePath);
return AssetDatabase.LoadAssetAtPath<Texture2D>(filePath + fileName + fileExtension);
}
#endif
}
}
View File
+3 -3
View File
@@ -1,3 +1,3 @@
{
"name": "BigoAds"
}
{
"name": "BigoAds"
}

Some files were not shown because too many files have changed in this diff Show More