// // RASingleton.m // Apex And Drivers // // Created by Jack on 2018/6/6. // Copyright © 2018年 USAI. All rights reserved. // #import "RASingleton.h" static RASingleton *singleton; @interface RASingleton () @property (nonatomic,strong) NSMutableString *log; @end @implementation RASingleton { NSString *_secretKey; } @synthesize backgroundReportType = _backgroundReportType; + (instancetype)sharedInstance { static dispatch_once_t tocken; dispatch_once(&tocken, ^{ singleton = [[RASingleton alloc] init]; singleton->_secretKey = @"usai"; singleton->_savePassword = [[[NSUserDefaults standardUserDefaults] objectForKey:@"savePassword"] boolValue]; }); return singleton; } - (void)setSavePassword:(BOOL)savePassword { _savePassword = savePassword; NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setObject:@(_savePassword) forKey:@"savePassword"]; } #pragma mark - User - (NSString *)secretKey { return _secretKey; } - (NSString *)encryptUser { if (!self.user) { return nil; } return [self encryptString:self.user]; } - (NSString *)encryptPassword { if (!self.password) { return nil; } return [self encryptString:self.password]; } - (void)saveUserInfo { if (self.user && self.password) { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"user"]; [defaults removeObjectForKey:@"password"]; [defaults removeObjectForKey:@"firstName"]; [defaults setValue:self.encryptUser forKey:@"user"]; [defaults setValue:self.encryptPassword forKey:@"password"]; [defaults setObject:self.firstName forKey:@"firstName"]; [defaults setBool:TRUE forKey:@"autologin"]; [defaults synchronize]; } } - (NSString *)savedUser { NSString * user = [self decryptString:[[NSUserDefaults standardUserDefaults] stringForKey:@"user"]]; return user; } - (NSString *)savedPassword { NSString * password = [self decryptString:[[NSUserDefaults standardUserDefaults] stringForKey:@"password"]]; return password; } - (NSString *)savedFirstName { return [[NSUserDefaults standardUserDefaults] stringForKey:@"firstName"]; } - (void)loginUser:(NSString *)user password:(NSString *)password firstName:(NSString *)firstName { _user = user; _password = password; _firstName = firstName; [self saveUserInfo]; [self bindUserWithNotificationToken]; [self setShouldAutoLogin:YES]; } - (BOOL)autoLogin { _user = [self savedUser]; _password = [self savedPassword]; _firstName = [self savedFirstName]; if ([self shouldAutoLogin]) { return _user.length && _password.length; } return NO; } - (void)setNotificationToken:(NSString *)notificationToken { _notificationToken = notificationToken; [self bindUserWithNotificationToken]; } - (void)bindUserWithNotificationToken { if (_user.length && _password.length && _notificationToken.length) { dispatch_async(dispatch_get_global_queue(0, 0), ^{ [RADataProvider bindNotificationToken:self.notificationToken]; }); } } - (void)logout { _user = nil; _password = nil; _firstName = nil; if (!self.savePassword) { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"user"]; [defaults removeObjectForKey:@"password"]; [defaults removeObjectForKey:@"firstName"]; [defaults synchronize]; } self.requiredBackgroundLocation = NO; [self setShouldAutoLogin:NO]; } - (void)changePassword:(NSString *)password { _password = password; [self saveUserInfo]; } - (BOOL)shouldAutoLogin { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; return [defaults boolForKey:@"autoLogin"]; } - (void)setShouldAutoLogin:(BOOL)login { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setBool:login forKey:@"autoLogin"]; [defaults synchronize]; } #pragma mark - Location - (void)setRequiredBackgroundLocation:(BOOL)requiredLocation { _requiredBackgroundLocation = requiredLocation; // NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; // [defaults setBool:_requiredBackgroundLocation forKey:@"requiredBackgroundLocation"]; // [defaults synchronize]; [self sendRequiredLocationNotification]; } - (void)loadSavedReuqiredLocation { // 启动的时候 // NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; // _requiredLocation = [[defaults objectForKey:@"requiredBackgroundLocation"] boolValue]; // [self sendRequiredLocationNotification]; } - (void)sendRequiredLocationNotification { if (_requiredBackgroundLocation) { [[NSNotificationCenter defaultCenter] postNotificationName:RANotificationStartBackgroundLocation object:nil]; } else { [[NSNotificationCenter defaultCenter] postNotificationName:RANotificationStopBackgroundLocation object:nil]; } } #pragma mark - Utils - (NSString *)encryptString:(NSString *)str { if (str == nil) { return nil; } return [AESCrypt encrypt:str password:self.secretKey]; } - (NSString *)decryptString:(NSString *)str { if (str == nil) { return nil; } return [AESCrypt decrypt:str password:self.secretKey]; } #pragma mark - NetworkQueue - (NSOperationQueue *)networkQueue { if (!_networkQueue) { _networkQueue = [[NSOperationQueue alloc] init]; _networkQueue.maxConcurrentOperationCount = 5; _networkQueue.qualityOfService = NSQualityOfServiceUtility; } return _networkQueue; } #pragma mark - Backgroud Report Location Permission - (void)setBackgroundReportType:(RABackgroundReportType)backgroundReportType { _backgroundReportType = backgroundReportType; NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setInteger:_backgroundReportType forKey:@"backgroundReportLocationPermissionType"]; [defaults synchronize]; } - (RABackgroundReportType)backgroundReportType { if (_backgroundReportType == 0) { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; _backgroundReportType = (RABackgroundReportType)[defaults integerForKey:@"backgroundReportLocationPermissionType"]; } return _backgroundReportType; } #pragma mark - Log - (NSMutableString *)log { if (!_log) { _log = [NSMutableString string]; } return _log; } - (void)writeLog:(NSString *)log { if (log.length) { [self.log appendFormat:@"\n%@",log]; } } - (void)saveLogs { if (self.log.length > 0) { NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *logPath = [cacheDir stringByAppendingPathComponent:@"log"]; [self.log writeToFile:logPath atomically:NO encoding:NSUTF8StringEncoding error:nil]; } } @end