76 lines
3.6 KiB
Mathematica
76 lines
3.6 KiB
Mathematica
|
//
|
||
|
// AdjustUnityAppDelegate.mm
|
||
|
// Adjust SDK
|
||
|
//
|
||
|
// Copyright © 2012-2021 Adjust GmbH. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import <objc/runtime.h>
|
||
|
#import <AdjustSdk/AdjustSdk.h>
|
||
|
#import "AdjustUnityAppDelegate.h"
|
||
|
|
||
|
typedef BOOL (*openURL_t)(id, SEL, UIApplication *, NSURL *, NSDictionary *);
|
||
|
typedef BOOL (*continueUserActivity_t)(id, SEL, UIApplication *, NSUserActivity *, void (^)(NSArray *restorableObjects));
|
||
|
static openURL_t original_openURL = NULL;
|
||
|
static continueUserActivity_t original_continueUserActivity = NULL;
|
||
|
|
||
|
@implementation AdjustUnityAppDelegate
|
||
|
|
||
|
+ (void)swizzleAppDelegateCallbacks {
|
||
|
NSLog(@"[Adjust] Swizzling AppDelegate callbacks...");
|
||
|
static dispatch_once_t onceToken;
|
||
|
dispatch_once(&onceToken, ^{
|
||
|
original_openURL = (openURL_t)[self swizzleOriginalSelector:@selector(application:openURL:options:)
|
||
|
withSelector:@selector(adjust_application:openURL:options:)];
|
||
|
original_continueUserActivity = (continueUserActivity_t)[self swizzleOriginalSelector:@selector(application:continueUserActivity:restorationHandler:)
|
||
|
withSelector:@selector(adjust_application:continueUserActivity:restorationHandler:)];
|
||
|
});
|
||
|
}
|
||
|
|
||
|
+ (IMP)swizzleOriginalSelector:(SEL)originalSelector
|
||
|
withSelector:(SEL)swizzledSelector {
|
||
|
// The Unity base app controller class name.
|
||
|
extern const char* AppControllerClassName;
|
||
|
Class originalClass = NSClassFromString([NSString stringWithUTF8String:AppControllerClassName]);
|
||
|
Class swizzledClass = [self class];
|
||
|
IMP originalImp = NULL;
|
||
|
IMP swizzledImp = class_getMethodImplementation(swizzledClass, swizzledSelector);
|
||
|
|
||
|
// Replace original implementation by the custom one.
|
||
|
Method originalMethod = class_getInstanceMethod(originalClass, originalSelector);
|
||
|
if (originalMethod) {
|
||
|
originalImp = method_setImplementation(originalMethod, swizzledImp);
|
||
|
} else if (![originalClass instancesRespondToSelector:originalSelector]) {
|
||
|
// Add the method to the original class if it doesn't implement the selector.
|
||
|
Method swizzledMethod = class_getInstanceMethod(swizzledClass, swizzledSelector);
|
||
|
BOOL methodAdded = class_addMethod(originalClass, originalSelector, swizzledImp, method_getTypeEncoding(swizzledMethod));
|
||
|
if (!methodAdded) {
|
||
|
NSLog(@"[Adjust] Cannot swizzle selector '%@' of class '%@'.", NSStringFromSelector(originalSelector), originalClass);
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
NSLog(@"[Adjust] Selector '%@' of class '%@' is swizzled.", NSStringFromSelector(originalSelector), originalClass);
|
||
|
return originalImp;
|
||
|
}
|
||
|
|
||
|
- (BOOL)adjust_application:(UIApplication *)application
|
||
|
openURL:(NSURL *)url
|
||
|
options:(NSDictionary *)options {
|
||
|
ADJDeeplink *deeplink = [[ADJDeeplink alloc] initWithDeeplink:url];
|
||
|
[Adjust processDeeplink:deeplink];
|
||
|
return original_openURL ? original_openURL(self, _cmd, application, url, options) : YES;
|
||
|
}
|
||
|
|
||
|
- (BOOL)adjust_application:(UIApplication *)application
|
||
|
continueUserActivity:(NSUserActivity *)userActivity
|
||
|
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
|
||
|
if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
|
||
|
NSURL *url = [userActivity webpageURL];
|
||
|
ADJDeeplink *deeplink = [[ADJDeeplink alloc] initWithDeeplink:url];
|
||
|
[Adjust processDeeplink:deeplink];
|
||
|
}
|
||
|
return original_continueUserActivity ? original_continueUserActivity(self, _cmd, application, userActivity, restorationHandler) : YES;
|
||
|
}
|
||
|
|
||
|
@end
|