153 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| #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
 |