|
15 | 15 |
|
16 | 16 | #include <sys/xattr.h> |
17 | 17 |
|
18 | | -static NSString * const kBaseUrl = @"https://app.adjust.com"; |
19 | | -static NSString * const kClientSdk = @"ios4.5.3"; |
20 | | - |
21 | | -static NSString * const kDateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z"; |
22 | 18 | static NSDateFormatter *dateFormat; |
23 | 19 |
|
| 20 | +static NSString * const kClientSdk = @"ios4.5.4"; |
| 21 | +static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; |
| 22 | +static NSString * const kUniversalLinkPattern = @"https://[^.]*\\.ulink\\.adjust\\.com/ulink/?(.*)"; |
| 23 | +static NSString * const kBaseUrl = @"https://app.adjust.com"; |
| 24 | +static NSString * const kDateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z"; |
| 25 | +static NSRegularExpression * universalLinkRegex = nil; |
| 26 | + |
24 | 27 | #pragma mark - |
25 | 28 | @implementation ADJUtil |
26 | 29 |
|
@@ -201,6 +204,10 @@ + (BOOL)isNull:(id)value { |
201 | 204 | return value == nil || value == (id)[NSNull null]; |
202 | 205 | } |
203 | 206 |
|
| 207 | ++ (BOOL)isNotNull:(id)value { |
| 208 | + return value != nil && value != (id)[NSNull null]; |
| 209 | +} |
| 210 | + |
204 | 211 | + (NSString *)formatErrorMessage:(NSString *)prefixErrorMessage |
205 | 212 | systemErrorMessage:(NSString *)systemErrorMessage |
206 | 213 | suffixErrorMessage:(NSString *)suffixErrorMessage |
@@ -354,4 +361,80 @@ + (NSDictionary *)convertDictionaryValues:(NSDictionary *)dictionary |
354 | 361 |
|
355 | 362 | return convertedDictionary; |
356 | 363 | } |
| 364 | + |
| 365 | ++ (NSString *)idfa { |
| 366 | + return [[UIDevice currentDevice] adjIdForAdvertisers]; |
| 367 | +} |
| 368 | + |
| 369 | ++ (NSURL *)convertUniversalLink:(NSURL *)url scheme:(NSString *)scheme { |
| 370 | + id<ADJLogger> logger = ADJAdjustFactory.logger; |
| 371 | + |
| 372 | + if ([ADJUtil isNull:scheme] || [scheme length] == 0) { |
| 373 | + [logger warn:@"Non-empty scheme required, using the scheme \"AdjustUniversalScheme\""]; |
| 374 | + scheme = kDefaultScheme; |
| 375 | + } |
| 376 | + |
| 377 | + if ([ADJUtil isNull:url]) { |
| 378 | + [logger error:@"Received universal link is nil"]; |
| 379 | + return nil; |
| 380 | + } |
| 381 | + |
| 382 | + NSString *urlString = [url absoluteString]; |
| 383 | + |
| 384 | + if ([ADJUtil isNull:urlString]) { |
| 385 | + [logger error:@"Parsed universal link is nil"]; |
| 386 | + return nil; |
| 387 | + } |
| 388 | + |
| 389 | + if (universalLinkRegex == nil) { |
| 390 | + NSError *error = NULL; |
| 391 | + |
| 392 | + NSRegularExpression *regex = [NSRegularExpression |
| 393 | + regularExpressionWithPattern:kUniversalLinkPattern |
| 394 | + options:NSRegularExpressionCaseInsensitive |
| 395 | + error:&error]; |
| 396 | + |
| 397 | + if ([ADJUtil isNotNull:error]) { |
| 398 | + [logger error:@"Universal link regex rule error (%@)", [error description]]; |
| 399 | + return nil; |
| 400 | + } |
| 401 | + |
| 402 | + universalLinkRegex = regex; |
| 403 | + } |
| 404 | + |
| 405 | + NSArray<NSTextCheckingResult *> *matches = [universalLinkRegex matchesInString:urlString options:0 range:NSMakeRange(0, [urlString length])]; |
| 406 | + |
| 407 | + if ([matches count] == 0) { |
| 408 | + [logger error:@"Url doesn't match as universal link with format https://[hash].ulink.adjust.com/ulink/..."]; |
| 409 | + return nil; |
| 410 | + } |
| 411 | + |
| 412 | + if ([matches count] > 1) { |
| 413 | + [logger error:@"Url match as universal link multiple times"]; |
| 414 | + return nil; |
| 415 | + } |
| 416 | + |
| 417 | + NSTextCheckingResult *match = matches[0]; |
| 418 | + |
| 419 | + if ([match numberOfRanges] != 2) { |
| 420 | + [logger error:@"Wrong number of ranges matched"]; |
| 421 | + return nil; |
| 422 | + } |
| 423 | + |
| 424 | + NSString *tailSubString = [urlString substringWithRange:[match rangeAtIndex:1]]; |
| 425 | + |
| 426 | + NSString *extractedUrlString = [NSString stringWithFormat:@"%@://%@", scheme, tailSubString]; |
| 427 | + |
| 428 | + [logger info:@"Converted deeplink from universal link %@", extractedUrlString]; |
| 429 | + |
| 430 | + NSURL *extractedUrl = [NSURL URLWithString:extractedUrlString]; |
| 431 | + |
| 432 | + if ([ADJUtil isNull:extractedUrl]) { |
| 433 | + [logger error:@"Unable to parse converted deeplink from universal link %@", extractedUrlString]; |
| 434 | + return nil; |
| 435 | + } |
| 436 | + |
| 437 | + return extractedUrl; |
| 438 | +} |
| 439 | + |
357 | 440 | @end |
0 commit comments