288 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
		
		
			
		
	
	
			288 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
|  | //
 | ||
|  | //  TDFile.m
 | ||
|  | //  ThinkingSDK
 | ||
|  | //
 | ||
|  | //  Created by LiHuanan on 2020/9/8.
 | ||
|  | //  Copyright © 2020 thinkingdata. All rights reserved.
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #import "TDFile.h"
 | ||
|  | #import "TDLogging.h"
 | ||
|  | #if __has_include(<ThinkingDataCore/TDJSONUtil.h>)
 | ||
|  | #import <ThinkingDataCore/TDJSONUtil.h>
 | ||
|  | #else
 | ||
|  | #import "TDJSONUtil.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | @implementation TDFile
 | ||
|  | 
 | ||
|  | - (instancetype)initWithAppid:(NSString*)appid
 | ||
|  | {
 | ||
|  |     self = [super init];
 | ||
|  |     if(self)
 | ||
|  |     {
 | ||
|  |         self.appid = appid;
 | ||
|  |     }
 | ||
|  |     return self;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveSessionID:(long long)sessionid {
 | ||
|  |     NSString *filePath = [self sessionIdFilePath];
 | ||
|  |     if (![self archiveObject:@(sessionid) withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive identifyId", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | - (long long)unarchiveSessionID {
 | ||
|  |     return [[self unarchiveFromFile:[self sessionIdFilePath] asClass:[NSNumber class]] longLongValue];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | - (void)archiveIdentifyId:(NSString *)identifyId {
 | ||
|  |     
 | ||
|  |     NSString *filePath = [self identifyIdFilePath];
 | ||
|  |     if (![self archiveObject:[identifyId copy] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive identifyId", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString*)unarchiveIdentifyID {
 | ||
|  |     return [self unarchiveFromFile:[self identifyIdFilePath] asClass:[NSString class]];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString*)unarchiveAccountID {
 | ||
|  |     return [self unarchiveFromFile:[self accountIDFilePath] asClass:[NSString class]];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveUploadSize:(NSNumber *)uploadSize {
 | ||
|  |     NSString *filePath = [self uploadSizeFilePath];
 | ||
|  |     if (![self archiveObject:uploadSize withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive uploadSize", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | - (NSNumber*)unarchiveUploadSize {
 | ||
|  |     NSNumber*  uploadSize = [self unarchiveFromFile:[self uploadSizeFilePath] asClass:[NSNumber class]];
 | ||
|  |     if (!uploadSize) {
 | ||
|  |         uploadSize = [NSNumber numberWithInteger:30];
 | ||
|  |     }
 | ||
|  |     return uploadSize;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveUploadInterval:(NSNumber *)uploadInterval {
 | ||
|  |     NSString *filePath = [self uploadIntervalFilePath];
 | ||
|  |     if (![self archiveObject:uploadInterval withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive uploadInterval", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSNumber*)unarchiveUploadInterval {
 | ||
|  |     NSNumber* uploadInterval = [self unarchiveFromFile:[self uploadIntervalFilePath] asClass:[NSNumber class]];
 | ||
|  |     if (!uploadInterval) {
 | ||
|  |         uploadInterval = [NSNumber numberWithInteger:30];
 | ||
|  |     }
 | ||
|  |     return uploadInterval;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveAccountID:(NSString *)accountID {
 | ||
|  |     NSString *filePath = [self accountIDFilePath];
 | ||
|  |     if (![self archiveObject:[accountID copy] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive accountID", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveSuperProperties:(NSDictionary *)superProperties {
 | ||
|  |     NSString *filePath = [self superPropertiesFilePath];
 | ||
|  |     if (![self archiveObject:[superProperties copy] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive superProperties", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSDictionary*)unarchiveSuperProperties {
 | ||
|  |     return [self unarchiveFromFile:[self superPropertiesFilePath] asClass:[NSDictionary class]];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveTrackPause:(BOOL)trackPause {
 | ||
|  |     NSString *filePath = [self trackPauseFilePath];
 | ||
|  |     if (![self archiveObject:[NSNumber numberWithBool:trackPause] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive trackPause", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (BOOL)unarchiveTrackPause {
 | ||
|  |     NSNumber *trackPause = (NSNumber *)[self unarchiveFromFile:[self trackPauseFilePath] asClass:[NSNumber class]];
 | ||
|  |     return [trackPause boolValue];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveOptOut:(BOOL)optOut {
 | ||
|  |     NSString *filePath = [self optOutFilePath];
 | ||
|  |     if (![self archiveObject:[NSNumber numberWithBool:optOut] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive isOptOut", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (BOOL)unarchiveOptOut {
 | ||
|  |     NSNumber *optOut = (NSNumber *)[self unarchiveFromFile:[self optOutFilePath] asClass:[NSNumber class]];
 | ||
|  |     return [optOut boolValue];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveIsEnabled:(BOOL)isEnabled {
 | ||
|  |     NSString *filePath = [self enabledFilePath];
 | ||
|  |     if (![self archiveObject:[NSNumber numberWithBool:isEnabled] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive isEnabled", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (BOOL)unarchiveEnabled {
 | ||
|  |     NSNumber *enabled = (NSNumber *)[self unarchiveFromFile:[self enabledFilePath] asClass:[NSNumber class]];
 | ||
|  |     if (enabled == nil) {
 | ||
|  |        return YES;
 | ||
|  |     } else {
 | ||
|  |         return [enabled boolValue];
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveDeviceId:(NSString *)deviceId {
 | ||
|  |     NSString *filePath = [self deviceIdFilePath];
 | ||
|  |     if (![self archiveObject:[deviceId copy] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive deviceId", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)unarchiveDeviceId {
 | ||
|  |     return [self unarchiveFromFile:[self deviceIdFilePath] asClass:[NSString class]];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)archiveInstallTimes:(NSString *)installTimes {
 | ||
|  |     NSString *filePath = [self installTimesFilePath];
 | ||
|  |     if (![self archiveObject:[installTimes copy] withFilePath:filePath]) {
 | ||
|  |         TDLogError(@"%@ unable to archive installTimes", self);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)unarchiveInstallTimes {
 | ||
|  |     return [self unarchiveFromFile:[self installTimesFilePath] asClass:[NSString class]];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (BOOL)archiveObject:(id)object withFilePath:(NSString *)filePath {
 | ||
|  |     @try {
 | ||
|  |         if (![NSKeyedArchiver archiveRootObject:object toFile:filePath]) {
 | ||
|  |             return NO;
 | ||
|  |         }
 | ||
|  |     } @catch (NSException *exception) {
 | ||
|  |         TDLogError(@"Got exception: %@, reason: %@. You can only send to Thinking values that inherit from NSObject and implement NSCoding.", exception.name, exception.reason);
 | ||
|  |         return NO;
 | ||
|  |     }
 | ||
|  |     
 | ||
|  |     [self addSkipBackupAttributeToItemAtPath:filePath];
 | ||
|  |     return YES;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *)filePathString {
 | ||
|  |     NSURL *URL = [NSURL fileURLWithPath:filePathString];
 | ||
|  |     assert([[NSFileManager defaultManager] fileExistsAtPath:[URL path]]);
 | ||
|  |     
 | ||
|  |     NSError *error = nil;
 | ||
|  |     BOOL success = [URL setResourceValue:[NSNumber numberWithBool:YES]
 | ||
|  |                                   forKey:NSURLIsExcludedFromBackupKey error:&error];
 | ||
|  |     if (!success) {
 | ||
|  |         TDLogError(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
 | ||
|  |     }
 | ||
|  |     return success;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (id)unarchiveFromFile:(NSString *)filePath asClass:(Class)class {
 | ||
|  |     id unarchivedData = nil;
 | ||
|  |     @try {
 | ||
|  |         unarchivedData = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
 | ||
|  |         if (![unarchivedData isKindOfClass:class]) {
 | ||
|  |             unarchivedData = nil;
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  |     @catch (NSException *exception) {
 | ||
|  |         TDLogError(@"Error unarchive in %@", filePath);
 | ||
|  |         unarchivedData = nil;
 | ||
|  |         NSError *error = NULL;
 | ||
|  |         BOOL removed = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
 | ||
|  |         if (!removed) {
 | ||
|  |             TDLogDebug(@"Error remove file in %@, error: %@", filePath, error);
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  |     return unarchivedData;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)superPropertiesFilePath {
 | ||
|  |     return [self persistenceFilePath:@"superProperties"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)accountIDFilePath {
 | ||
|  |     return [self persistenceFilePath:@"accountID"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)uploadSizeFilePath {
 | ||
|  |     return [self persistenceFilePath:@"uploadSize"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)uploadIntervalFilePath {
 | ||
|  |     return [self persistenceFilePath:@"uploadInterval"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)identifyIdFilePath {
 | ||
|  |     return [self persistenceFilePath:@"identifyId"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)sessionIdFilePath {
 | ||
|  |     return [self persistenceFilePath:@"sessionId"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)enabledFilePath {
 | ||
|  |     return [self persistenceFilePath:@"isEnabled"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)trackPauseFilePath {
 | ||
|  |     return [self persistenceFilePath:@"trackPause"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)optOutFilePath {
 | ||
|  |     return [self persistenceFilePath:@"optOut"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)deviceIdFilePath {
 | ||
|  |     return [self persistenceFilePath:@"deviceId"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)installTimesFilePath {
 | ||
|  |     return [self persistenceFilePath:@"installTimes"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)persistenceFilePath:(NSString *)data{
 | ||
|  |     NSString *filename = [NSString stringWithFormat:@"thinking-%@-%@.plist", self.appid, data];
 | ||
|  |     return [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]
 | ||
|  |             stringByAppendingPathComponent:filename];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString*)unarchiveOldLoginId {
 | ||
|  |     return [[NSUserDefaults standardUserDefaults] objectForKey:@"thinkingdata_accountId"];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)deleteOldLoginId {
 | ||
|  |     [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"thinkingdata_accountId"];
 | ||
|  |     [[NSUserDefaults standardUserDefaults] synchronize];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)description {
 | ||
|  |     NSMutableDictionary *dic = [NSMutableDictionary dictionary];
 | ||
|  |     [dic setObject:self.appid forKey:@"appid"];
 | ||
|  |     [dic setObject:[self unarchiveIdentifyID]?:@"" forKey:@"distincid"];
 | ||
|  |     [dic setObject:[self unarchiveAccountID]?:@"" forKey:@"accountID"];
 | ||
|  |     [dic setObject:[self unarchiveUploadSize] forKey:@"uploadSize"];
 | ||
|  |     [dic setObject:[self unarchiveUploadInterval] forKey:@"uploadInterval"];
 | ||
|  |     [dic setObject:[self unarchiveSuperProperties]?:@{}  forKey:@"superProperties"];
 | ||
|  |     [dic setObject:[NSNumber numberWithBool:[self unarchiveOptOut] ]forKey:@"optOut"];
 | ||
|  |     [dic setObject:[NSNumber numberWithBool:[self unarchiveEnabled]] forKey:@"isEnabled"];
 | ||
|  |     [dic setObject:[NSNumber numberWithBool:[self unarchiveTrackPause]] forKey:@"isTrackPause"];
 | ||
|  |     [dic setObject:[self unarchiveDeviceId]?:@"" forKey:@"deviceId"];
 | ||
|  |     [dic setObject:[self unarchiveInstallTimes]?:@"" forKey:@"installTimes"];
 | ||
|  |     return [TDJSONUtil JSONStringForObject:dic];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | @end
 |