@@ -242,10 +242,63 @@ - (void)saveDiffs {
242242 }
243243}
244244
245+ - (void )loadVariants {
246+ @try {
247+ NSString *fileName = [self dataArchiveVariantsFileName ];
248+ NSString *filePath = [CTPreferences filePathfromFileName: fileName];
249+ NSData *variantsData = [NSData dataWithContentsOfFile: filePath];
250+
251+ if (!variantsData) {
252+ @synchronized (self) {
253+ self.variants = @[];
254+ }
255+ CleverTapLogDebug (self.config .logLevel , @" %@ : No cached variants found" , self);
256+ return ;
257+ }
258+
259+ NSKeyedUnarchiver *unarchiver;
260+ if (@available (iOS 12.0 , tvOS 11.0 , *)) {
261+ NSError *error = nil ;
262+ unarchiver = [[NSKeyedUnarchiver alloc ] initForReadingFromData: variantsData error: &error];
263+ if (error != nil ) {
264+ CleverTapLogDebug (self.config .logLevel , @" %@ : Error loading variants: %@ " , self, error.localizedDescription );
265+ @synchronized (self) {
266+ self.variants = @[];
267+ }
268+ return ;
269+ }
270+ unarchiver.requiresSecureCoding = NO ;
271+ } else {
272+ #pragma clang diagnostic push
273+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
274+ unarchiver = [[NSKeyedUnarchiver alloc ] initForReadingWithData: variantsData];
275+ #pragma clang diagnostic pop
276+ }
277+
278+ NSArray *loadedVariants = (NSArray *)[unarchiver decodeObjectForKey: CLEVERTAP_DEFAULTS_VARIANTS_KEY];
279+
280+ @synchronized (self) {
281+ self.variants = loadedVariants ?: @[];
282+ }
283+
284+ CleverTapLogDebug (self.config .logLevel , @" %@ : Loaded %lu variants from cache" , self, (unsigned long )[self .variants count ]);
285+
286+ } @catch (NSException *exception) {
287+ CleverTapLogDebug (self.config .logLevel , @" %@ : Exception loading variants: %@ " , self, exception.debugDescription );
288+ @synchronized (self) {
289+ self.variants = @[];
290+ }
291+ }
292+ }
293+
245294- (NSString *)dataArchiveFileName {
246295 return [NSString stringWithFormat: @" clevertap-%@ -%@ -pe-vars.plist" , _config.accountId, _deviceInfo.deviceId];
247296}
248297
298+ - (NSString *)dataArchiveVariantsFileName {
299+ return [NSString stringWithFormat: @" clevertap-%@ -%@ -pe-variants.plist" , _config.accountId, _deviceInfo.deviceId];
300+ }
301+
249302- (void )applyVariableDiffs : (NSDictionary *)diffs_ {
250303 CleverTapLogDebug (self.config .logLevel , @" %@ : Applying Variables: %@ " , self, diffs_);
251304 @synchronized (self.vars ) {
@@ -291,9 +344,39 @@ - (void)applyVariableDiffs:(NSDictionary *)diffs_ {
291344 }
292345}
293346
347+ - (void )handleVariantsData : (NSArray <NSDictionary<NSString *, id> *> *)variantsData {
348+ @synchronized (self) {
349+ self.variants = variantsData;
350+ }
351+
352+ NSMutableData *diffsData = [[NSMutableData alloc ] init ];
353+ #pragma clang diagnostic push
354+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
355+ NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc ] initForWritingWithMutableData: diffsData];
356+ #pragma clang diagnostic pop
357+ [archiver encodeObject: variantsData forKey: CLEVERTAP_DEFAULTS_VARIANTS_KEY];
358+ [archiver finishEncoding ];
359+
360+ NSError *writeError = nil ;
361+ NSString *variantsFileName = [self dataArchiveVariantsFileName ];
362+ NSString *filePath = [CTPreferences filePathfromFileName: variantsFileName];
363+ NSDataWritingOptions fileProtectionOption = _config.enableFileProtection ?
364+ NSDataWritingFileProtectionComplete : NSDataWritingAtomic;
365+ [diffsData writeToFile: filePath options: fileProtectionOption error: &writeError];
366+ if (writeError) {
367+ CleverTapLogStaticInternal (@" %@ failed to write data at %@ : %@ " , self, filePath, writeError);
368+ }
369+ }
370+
294371- (void )clearUserContent {
295372 // Disable callbacks and wait until fetch is finished
296373 [self setHasVarsRequestCompleted: NO ];
374+
375+ // Clear variants for the old user
376+ @synchronized (self) {
377+ self.variants = @[];
378+ }
379+
297380 // Clear Var state to allow callback invocation when server values are downloaded
298381 [self .vars enumerateKeysAndObjectsUsingBlock: ^(NSString * _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
299382 CTVar *var = (CTVar *)obj;
0 commit comments