1616@interface ADJSKAdNetwork ()
1717
1818@property (nonatomic , weak ) id <ADJLogger> logger;
19- @property (nonatomic , strong ) Class clsSkAdNetwork;
20- @property (nonatomic , assign ) SEL selRegisterAppForAdNetworkAttribution;
21- @property (nonatomic , assign ) SEL selUpdateConversionValue;
22- @property (nonatomic , assign ) SEL selUpdatePostbackConversionValueCompletionHandler;
23- @property (nonatomic , assign ) SEL selUpdatePostbackConversionValueCoarseValueCompletionHandler;
24- @property (nonatomic , assign ) SEL selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler;
2519
2620@end
2721
@@ -45,34 +39,41 @@ - (instancetype)init {
4539 }
4640
4741 self.logger = [ADJAdjustFactory logger ];
48- self.clsSkAdNetwork = NSClassFromString (@" SKAdNetwork" );
49- self.selRegisterAppForAdNetworkAttribution = NSSelectorFromString (@" registerAppForAdNetworkAttribution" );
50- self.selUpdateConversionValue = NSSelectorFromString (@" updateConversionValue:" );
51- self.selUpdatePostbackConversionValueCompletionHandler = NSSelectorFromString (@" updatePostbackConversionValue:completionHandler:" );
52- self.selUpdatePostbackConversionValueCoarseValueCompletionHandler = NSSelectorFromString (@" updatePostbackConversionValue:coarseValue:completionHandler:" );
53- self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler = NSSelectorFromString (@" updatePostbackConversionValue:coarseValue:lockWindow:completionHandler:" );
5442
5543 return self;
5644}
5745
5846#pragma mark - SKAdNetwork API
5947
6048- (void )registerAppForAdNetworkAttribution {
49+ Class class = [self getSKAdNetworkClass ];
50+ SEL selector = NSSelectorFromString (@" registerAppForAdNetworkAttribution" );
6151 if (@available (iOS 14.0 , *)) {
62- if ([self isStoreKitAvailable ]) {
63- ((id (*)(id , SEL ))[self .clsSkAdNetwork methodForSelector: self .selRegisterAppForAdNetworkAttribution])(self.clsSkAdNetwork , self.selRegisterAppForAdNetworkAttribution );
64- [self .logger debug: @" Called SKAdNetwork's registerAppForAdNetworkAttribution method" ];
52+ if ([self isApiAvailableForClass: class andSelector: selector]) {
53+ NSMethodSignature *methodSignature = [class methodSignatureForSelector: selector];
54+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature];
55+ [invocation setSelector: selector];
56+ [invocation setTarget: class];
57+ [invocation invoke ];
58+ [self .logger verbose: @" Call to SKAdNetwork's registerAppForAdNetworkAttribution method made" ];
6559 }
6660 } else {
6761 [self .logger warn: @" SKAdNetwork's registerAppForAdNetworkAttribution method not available for this operating system version" ];
6862 }
6963}
7064
7165- (void )updateConversionValue : (NSInteger )conversionValue {
66+ Class class = [self getSKAdNetworkClass ];
67+ SEL selector = NSSelectorFromString (@" updateConversionValue:" );
7268 if (@available (iOS 14.0 , *)) {
73- if ([self isStoreKitAvailable ]) {
74- ((id (*)(id , SEL , NSInteger ))[self .clsSkAdNetwork methodForSelector: self .selUpdateConversionValue])(self.clsSkAdNetwork , self.selUpdateConversionValue , conversionValue);
75- [self .logger verbose: @" Called SKAdNetwork's updateConversionValue: method made with conversion value: %d " , conversionValue];
69+ if ([self isApiAvailableForClass: class andSelector: selector]) {
70+ NSMethodSignature *methodSignature = [class methodSignatureForSelector: selector];
71+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature];
72+ [invocation setSelector: selector];
73+ [invocation setTarget: class];
74+ [invocation setArgument: &conversionValue atIndex: 2 ];
75+ [invocation invoke ];
76+ [self .logger verbose: @" Call to SKAdNetwork's updateConversionValue: method made with value %d " , conversionValue];
7677 }
7778 } else {
7879 [self .logger warn: @" SKAdNetwork's updateConversionValue: method not available for this operating system version" ];
@@ -81,10 +82,17 @@ - (void)updateConversionValue:(NSInteger)conversionValue {
8182
8283- (void )updatePostbackConversionValue : (NSInteger )conversionValue
8384 completionHandler : (void (^)(NSError *error))completion {
85+ Class class = [self getSKAdNetworkClass ];
86+ SEL selector = NSSelectorFromString (@" updatePostbackConversionValue:completionHandler:" );
8487 if (@available (iOS 15.4 , *)) {
85- if ([self isStoreKitAvailable ]) {
86- ((id (*)(id , SEL , NSInteger , void (^)(NSError *error)))[self .clsSkAdNetwork methodForSelector: self .selUpdatePostbackConversionValueCompletionHandler])(self.clsSkAdNetwork , self.selUpdatePostbackConversionValueCompletionHandler , conversionValue, completion);
87- // call is made, success / failure will be checked and logged inside of the completion block
88+ if ([self isApiAvailableForClass: class andSelector: selector]) {
89+ NSMethodSignature *methodSignature = [class methodSignatureForSelector: selector];
90+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature];
91+ [invocation setSelector: selector];
92+ [invocation setTarget: class];
93+ [invocation setArgument: &conversionValue atIndex: 2 ];
94+ [invocation setArgument: &completion atIndex: 3 ];
95+ [invocation invoke ];
8896 }
8997 } else {
9098 [self .logger warn: @" SKAdNetwork's updatePostbackConversionValue:completionHandler: method not available for this operating system version" ];
@@ -94,10 +102,18 @@ - (void)updatePostbackConversionValue:(NSInteger)conversionValue
94102- (void )updatePostbackConversionValue : (NSInteger )fineValue
95103 coarseValue : (NSString *)coarseValue
96104 completionHandler : (void (^)(NSError *error))completion {
105+ Class class = [self getSKAdNetworkClass ];
106+ SEL selector = NSSelectorFromString (@" updatePostbackConversionValue:coarseValue:completionHandler:" );
97107 if (@available (iOS 16.1 , *)) {
98- if ([self isStoreKitAvailable ]) {
99- ((id (*)(id , SEL , NSInteger , NSString *, void (^)(NSError *error)))[self .clsSkAdNetwork methodForSelector: self .selUpdatePostbackConversionValueCoarseValueCompletionHandler])(self.clsSkAdNetwork , self.selUpdatePostbackConversionValueCoarseValueCompletionHandler , fineValue, coarseValue, completion);
100- // call is made, success / failure will be checked and logged inside of the completion block
108+ if ([self isApiAvailableForClass: class andSelector: selector]) {
109+ NSMethodSignature *methodSignature = [class methodSignatureForSelector: selector];
110+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature];
111+ [invocation setSelector: selector];
112+ [invocation setTarget: class];
113+ [invocation setArgument: &fineValue atIndex: 2 ];
114+ [invocation setArgument: &coarseValue atIndex: 3 ];
115+ [invocation setArgument: &completion atIndex: 4 ];
116+ [invocation invoke ];
101117 }
102118 } else {
103119 [self .logger warn: @" SKAdNetwork's updatePostbackConversionValue:coarseValue:completionHandler: method not available for this operating system version" ];
@@ -108,10 +124,19 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue
108124 coarseValue : (NSString *)coarseValue
109125 lockWindow : (BOOL )lockWindow
110126 completionHandler : (void (^)(NSError *error))completion {
127+ Class class = [self getSKAdNetworkClass ];
128+ SEL selector = NSSelectorFromString (@" updatePostbackConversionValue:coarseValue:lockWindow:completionHandler:" );
111129 if (@available (iOS 16.1 , *)) {
112- if ([self isStoreKitAvailable ]) {
113- ((id (*)(id , SEL , NSInteger , NSString *, BOOL , void (^)(NSError *error)))[self .clsSkAdNetwork methodForSelector: self .selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler])(self.clsSkAdNetwork , self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler , fineValue, coarseValue, lockWindow, completion);
114- // call is made, success / failure will be checked and logged inside of the completion block
130+ if ([self isApiAvailableForClass: class andSelector: selector]) {
131+ NSMethodSignature *methodSignature = [class methodSignatureForSelector: selector];
132+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: methodSignature];
133+ [invocation setSelector: selector];
134+ [invocation setTarget: class];
135+ [invocation setArgument: &fineValue atIndex: 2 ];
136+ [invocation setArgument: &coarseValue atIndex: 3 ];
137+ [invocation setArgument: &lockWindow atIndex: 4 ];
138+ [invocation setArgument: &completion atIndex: 5 ];
139+ [invocation invoke ];
115140 }
116141 } else {
117142 [self .logger warn: @" SKAdNetwork's updatePostbackConversionValue:coarseValue:lockWindow:completionHandler: method not available for this operating system version" ];
@@ -172,11 +197,19 @@ - (void)adjUpdateConversionValue:(NSInteger)conversionValue
172197
173198#pragma mark - Private
174199
175- - (BOOL )isStoreKitAvailable {
176- if (self. clsSkAdNetwork == nil ) {
200+ - (BOOL )isApiAvailableForClass : ( Class ) class andSelector : ( SEL ) selector {
201+ if (class == nil ) {
177202 [self .logger warn: @" StoreKit.framework not found in the app (SKAdNetwork class not found)" ];
178203 return NO ;
179204 }
205+ if (!selector) {
206+ [self .logger warn: @" Selector for given method was not found" ];
207+ return NO ;
208+ }
209+ if ([class respondsToSelector: selector] == NO ) {
210+ [self .logger warn: @" %@ method implementation not found" , NSStringFromSelector (selector)];
211+ return NO ;
212+ }
180213 return YES ;
181214}
182215
@@ -204,4 +237,8 @@ - (NSString *)getSkAdNetworkCoarseConversionValue:(NSString *)adjustCoarseValue
204237 }
205238}
206239
240+ - (Class )getSKAdNetworkClass {
241+ return NSClassFromString (@" SKAdNetwork" );
242+ }
243+
207244@end
0 commit comments