diff --git a/CleverPush/Source/CPUtils.h b/CleverPush/Source/CPUtils.h index 1426958a..b260dbf1 100644 --- a/CleverPush/Source/CPUtils.h +++ b/CleverPush/Source/CPUtils.h @@ -49,6 +49,7 @@ + (void)tryOpenURL:(NSURL *)url; + (BOOL)isValidURL:(NSURL *)url; + (NSURL *)removeQueryParametersFromURL:(NSURL *)url; ++ (NSString *)getQueryParameterFromURL:(NSURL *)url forKey:(NSString *)key; + (NSDictionary *)convertConnectionOptionsToLaunchOptions:(UISceneConnectionOptions* )connectionOptions API_AVAILABLE(ios(13.0)); + (UIImage *)resizedImageNamed:(NSString *)imageName withSize:(CGSize)newSize; diff --git a/CleverPush/Source/CPUtils.m b/CleverPush/Source/CPUtils.m index 86ebf73f..dcc617e3 100644 --- a/CleverPush/Source/CPUtils.m +++ b/CleverPush/Source/CPUtils.m @@ -1016,6 +1016,25 @@ + (NSURL *)removeQueryParametersFromURL:(NSURL *)url { return components.URL; } ++ (NSString *)getQueryParameterFromURL:(NSURL *)url forKey:(NSString *)key { + if (!url || !key) { + return nil; + } + + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + if (!components || !components.queryItems) { + return nil; + } + + for (NSURLQueryItem *queryItem in components.queryItems) { + if ([queryItem.name isEqualToString:key]) { + return queryItem.value; + } + } + + return nil; +} + #pragma mark - Converts UISceneConnectionOptions to launch options. + (NSDictionary *)convertConnectionOptionsToLaunchOptions:(UISceneConnectionOptions *)connectionOptions API_AVAILABLE(ios(13.0)) { NSMutableDictionary *launchOptions = [NSMutableDictionary dictionary]; diff --git a/CleverPush/Source/CleverPushInstance.m b/CleverPush/Source/CleverPushInstance.m index 01abffd7..4feb3d73 100644 --- a/CleverPush/Source/CleverPushInstance.m +++ b/CleverPush/Source/CleverPushInstance.m @@ -1938,6 +1938,25 @@ - (void)handleNotificationOpened:(NSDictionary* _Nullable)payload isActive:(BOOL } } + NSString *notificationDeeplinkId = nil; + NSString *notificationUrl = [notification objectForKey:@"url"]; + + if (notificationUrl != nil && ![notificationUrl isKindOfClass:[NSNull class]] && [notificationUrl length] > 0) { + NSURL *notificationURL = [NSURL URLWithString:notificationUrl]; + if (notificationURL) { + notificationDeeplinkId = [CPUtils getQueryParameterFromURL:notificationURL forKey:@"deeplinkId"]; + } + } + + if (notificationDeeplinkId && ![CPUtils isNullOrEmpty:notificationDeeplinkId]) { + [userDefaults setObject:notificationDeeplinkId forKey:CLEVERPUSH_LAST_DEEPLINK_ID_KEY]; + [userDefaults setObject:[NSDate date] forKey:CLEVERPUSH_LAST_DEEPLINK_TIME_KEY]; + } else { + [userDefaults removeObjectForKey:CLEVERPUSH_LAST_DEEPLINK_ID_KEY]; + [userDefaults removeObjectForKey:CLEVERPUSH_LAST_DEEPLINK_TIME_KEY]; + } + [userDefaults synchronize]; + BOOL hasValidUrl = notification != nil && [notification objectForKey:@"url"] != nil && ![[notification objectForKey:@"url"] isKindOfClass:[NSNull class]] && @@ -3411,6 +3430,16 @@ - (void)trackEvent:(NSString* _Nullable)eventName properties:(NSDictionary* _Nul [dataDic setObject:lastClickedNotificationId forKey:@"notificationId"]; } } + + NSString* lastDeeplinkId = [userDefaults stringForKey:CLEVERPUSH_LAST_DEEPLINK_ID_KEY]; + NSDate* lastDeeplinkTimeStamp = [userDefaults objectForKey:CLEVERPUSH_LAST_DEEPLINK_TIME_KEY]; + + if (![CPUtils isNullOrEmpty:lastDeeplinkId] && lastDeeplinkTimeStamp != nil && [lastDeeplinkTimeStamp isKindOfClass:[NSDate class]]) { + NSTimeInterval secondsSinceLastDeeplinkClick = [[NSDate date] timeIntervalSinceDate:lastDeeplinkTimeStamp]; + if (secondsSinceLastDeeplinkClick <= 60 * 60) { + [dataDic setObject:lastDeeplinkId forKey:@"deeplinkId"]; + } + } NSData* postData = [NSJSONSerialization dataWithJSONObject:dataDic options:0 error:nil]; [request setHTTPBody:postData]; diff --git a/CleverPush/Source/CleverPushUserDefaults.h b/CleverPush/Source/CleverPushUserDefaults.h index 45426fcb..982987b3 100644 --- a/CleverPush/Source/CleverPushUserDefaults.h +++ b/CleverPush/Source/CleverPushUserDefaults.h @@ -3,6 +3,8 @@ #define CLEVERPUSH_LAST_NOTIFICATION_ID_KEY @"CleverPush_LAST_NOTIFICATION_ID" #define CLEVERPUSH_LAST_CLICKED_NOTIFICATION_ID_KEY @"CleverPush_LAST_CLICKED_NOTIFICATION_ID" #define CLEVERPUSH_LAST_CLICKED_NOTIFICATION_TIME_KEY @"CleverPush_LAST_CLICKED_NOTIFICATION_TIME" +#define CLEVERPUSH_LAST_DEEPLINK_ID_KEY @"CleverPush_LAST_DEEPLINK_ID" +#define CLEVERPUSH_LAST_DEEPLINK_TIME_KEY @"CleverPush_LAST_DEEPLINK_TIME" #define CLEVERPUSH_NOTIFICATION_CATEGORIES_KEY @"CleverPush_NOTIFICATION_CATEGORIES" #define CLEVERPUSH_CHANNEL_ID_KEY @"CleverPush_CHANNEL_ID"