153 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
		
		
			
		
	
	
			153 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
| 
								 | 
							
								#import "TDDeviceInfo.h"
							 | 
						||
| 
								 | 
							
								#import "TDPublicConfig.h"
							 | 
						||
| 
								 | 
							
								#import "TDKeychainHelper.h"
							 | 
						||
| 
								 | 
							
								#import "TDFile.h"
							 | 
						||
| 
								 | 
							
								#import "TDKeychainHelper.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if __has_include(<ThinkingDataCore/TDCoreDeviceInfo.h>)
							 | 
						||
| 
								 | 
							
								#import <ThinkingDataCore/TDCoreDeviceInfo.h>
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#import "TDCoreDeviceInfo.h"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if __has_include(<ThinkingDataCore/TDCoreKeychainHelper.h>)
							 | 
						||
| 
								 | 
							
								#import <ThinkingDataCore/TDCoreKeychainHelper.h>
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#import "TDCoreKeychainHelper.h"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#import "ThinkingAnalyticsSDKPrivate.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@interface TDDeviceInfo ()
							 | 
						||
| 
								 | 
							
								@property (nonatomic, copy, readwrite) NSString *uniqueId;
							 | 
						||
| 
								 | 
							
								@property (nonatomic, assign, readwrite) BOOL isFirstOpen;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@implementation TDDeviceInfo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								+ (TDDeviceInfo *)sharedManager {
							 | 
						||
| 
								 | 
							
								    static dispatch_once_t onceToken;
							 | 
						||
| 
								 | 
							
								    static TDDeviceInfo *manager;
							 | 
						||
| 
								 | 
							
								    dispatch_once(&onceToken, ^{
							 | 
						||
| 
								 | 
							
								        manager = [[TDDeviceInfo alloc] init];
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    return manager;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (instancetype)init {
							 | 
						||
| 
								 | 
							
								    self = [super init];
							 | 
						||
| 
								 | 
							
								    if (self) {
							 | 
						||
| 
								 | 
							
								        self.libName = @"iOS";
							 | 
						||
| 
								 | 
							
								        self.libVersion = [TDPublicConfig version];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return self;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								+ (NSString *)libVersion {
							 | 
						||
| 
								 | 
							
								    return [self sharedManager].libVersion;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (NSString *)uniqueId {
							 | 
						||
| 
								 | 
							
								    static dispatch_once_t onceToken;
							 | 
						||
| 
								 | 
							
								    static NSString *uniqueId = nil;
							 | 
						||
| 
								 | 
							
								    dispatch_once(&onceToken, ^{
							 | 
						||
| 
								 | 
							
								        uniqueId = [self getDeviceUniqueId];
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    return uniqueId;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if TARGET_OS_OSX
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (nullable NSString *)getSystemSerialNumber {
							 | 
						||
| 
								 | 
							
								    io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
							 | 
						||
| 
								 | 
							
								    if (platformExpert) {
							 | 
						||
| 
								 | 
							
								        CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0);
							 | 
						||
| 
								 | 
							
								        IOObjectRelease(platformExpert);
							 | 
						||
| 
								 | 
							
								        if (serialNumberAsCFString) {
							 | 
						||
| 
								 | 
							
								            NSString *serialNumber = (__bridge_transfer NSString *)serialNumberAsCFString;
							 | 
						||
| 
								 | 
							
								            return serialNumber;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return nil;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (NSString *)getDeviceUniqueId {
							 | 
						||
| 
								 | 
							
								    NSString *keyExistFirstRecord = @"thinking_isfirst";
							 | 
						||
| 
								 | 
							
								    BOOL isExistFirstRecord = [[[NSUserDefaults standardUserDefaults] objectForKey:keyExistFirstRecord] boolValue];
							 | 
						||
| 
								 | 
							
								    if (!isExistFirstRecord) {
							 | 
						||
| 
								 | 
							
								        self.isFirstOpen = YES;
							 | 
						||
| 
								 | 
							
								        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:keyExistFirstRecord];
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        self.isFirstOpen = NO;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    NSString *keyDefaultDistinctId = @"thinking_data_default_distinct_id";
							 | 
						||
| 
								 | 
							
								    NSString *defaultDistinctId = [[NSUserDefaults standardUserDefaults] stringForKey:keyDefaultDistinctId];
							 | 
						||
| 
								 | 
							
								    if (!defaultDistinctId) {
							 | 
						||
| 
								 | 
							
								        defaultDistinctId = [TDCoreDeviceInfo deviceId];
							 | 
						||
| 
								 | 
							
								        [[NSUserDefaults standardUserDefaults] setObject:defaultDistinctId forKey:keyDefaultDistinctId];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    return defaultDistinctId;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if TARGET_OS_IOS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (NSString *)getDeviceUniqueId {
							 | 
						||
| 
								 | 
							
								    NSString *uniqueId = nil;
							 | 
						||
| 
								 | 
							
								    @synchronized (self) {
							 | 
						||
| 
								 | 
							
								        NSString *deviceId = [TDCoreDeviceInfo deviceId];
							 | 
						||
| 
								 | 
							
								        NSString *installTimes = [TDKeychainHelper readInstallTimes];
							 | 
						||
| 
								 | 
							
								        BOOL isExistFirstRecord = [[[NSUserDefaults standardUserDefaults] objectForKey:@"thinking_isfirst"] boolValue];
							 | 
						||
| 
								 | 
							
								        if (!isExistFirstRecord) {
							 | 
						||
| 
								 | 
							
								            self.isFirstOpen = YES;
							 | 
						||
| 
								 | 
							
								            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"thinking_isfirst"];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            self.isFirstOpen = NO;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        TDFile *file = [[TDFile alloc] initWithAppid:[ThinkingAnalyticsSDK defaultInstance].config.appid];
							 | 
						||
| 
								 | 
							
								        if (deviceId.length == 0) {
							 | 
						||
| 
								 | 
							
								            deviceId = [file unarchiveDeviceId];
							 | 
						||
| 
								 | 
							
								            if (deviceId.length > 0) {
							 | 
						||
| 
								 | 
							
								                [TDCoreKeychainHelper saveDeviceId:deviceId];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (installTimes.length == 0) {
							 | 
						||
| 
								 | 
							
								            installTimes = [file unarchiveInstallTimes];
							 | 
						||
| 
								 | 
							
								            if (installTimes.length > 0) {
							 | 
						||
| 
								 | 
							
								                [TDKeychainHelper saveInstallTimes:installTimes];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (installTimes.length == 0) {
							 | 
						||
| 
								 | 
							
								            installTimes = @"1";
							 | 
						||
| 
								 | 
							
								            [file archiveInstallTimes:installTimes];
							 | 
						||
| 
								 | 
							
								            [TDKeychainHelper saveInstallTimes:installTimes];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            if (!isExistFirstRecord) {
							 | 
						||
| 
								 | 
							
								                int setup_int = [installTimes intValue];
							 | 
						||
| 
								 | 
							
								                setup_int++;
							 | 
						||
| 
								 | 
							
								                installTimes = [NSString stringWithFormat:@"%d", setup_int];
							 | 
						||
| 
								 | 
							
								                [file archiveInstallTimes:installTimes];
							 | 
						||
| 
								 | 
							
								                [TDKeychainHelper saveInstallTimes:installTimes];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        if ([installTimes isEqualToString:@"1"]) {
							 | 
						||
| 
								 | 
							
								            uniqueId = deviceId;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            uniqueId = [NSString stringWithFormat:@"%@_%@",deviceId, installTimes];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return uniqueId;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end
							 |