// // KWMUserDao.m // iOrangeBusiness // // Created by Yaotian on 10/28/14. // Copyright (c) 2014 kwm. All rights reserved. // #import "KWMUserDao.h" #import "KWMStringUtil.h" #import "KWMUser.h" #import "NSString+SAMAdditions.h" #import "KWMAPIManager.h" #import "AppDelegate.h" //#import "JPUSHService.h" #import "PSPDFAlertView.h" #import "KWMStringUtil.h" //#import <Mobile-Buy-SDK/Buy/BUYClient.h> #import "KWMUserModel.h" #import <SAMKeychain/SAMKeychain.h> #define SESSID @"PHPSESSID" static NSString *kwmKeySessionId = @"sessionId"; static NSString *kwmKeyUser = @"KWMUser"; static NSString *kwmKeyExchangeRate = @"KWMExangeRate"; static NSString *kwmKeyCheckoutCache = @"KWMCheckoutCache"; static NSString *kwmKeySavedAccountPassword = @"savedAccountPassword"; //static NSString *secretKey = @"!@#EQRGEQ$#Y%>O:"; @interface KWMUserDao () @end @implementation KWMUserDao { KWMUser *current; NSString *sessionId; NSString *hxAccount; NSString *hxPassword; NSDictionary *_savedAccountPassword; BOOL isSkipLoginChat; BOOL isLoginedChat; BOOL isLogingChat; NSDecimalNumber *_exchangeRate; } @synthesize customsClearance = _customsClearance; @synthesize currencyCode = _currencyCode; + (KWMUserDao *)shareDao { static KWMUserDao *_userDao = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _userDao =[[self alloc] init]; // _userDao->isSkipLoginChat = NO; //#ifdef DEBUG // _userDao->isSkipLoginChat = YES; //#endif [[NSNotificationCenter defaultCenter] addObserverForName:KWMReceiverNoLogin object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { if ([_userDao isLogin]) { [_userDao logout]; AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; // [app toLogin]; } }]; }); return _userDao; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:KWMReceiverNoLogin object:nil]; } - (BOOL)checkSession { if ([KWMStringUtil isEmpty:sessionId]) { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; sessionId = [defaults objectForKey:kwmKeySessionId]; } [self updateSession:sessionId]; return ![KWMStringUtil isEmpty:sessionId]; } - (void)deleteSession { //#ifdef DEBUG // NSAssert(NO, @"不许登出"); //#endif sessionId = @""; NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setObject:@"" forKey:kwmKeySessionId]; [defaults synchronize]; } - (void)saveSession:(NSString *)value { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; sessionId = value; [defaults setObject:value forKey:kwmKeySessionId]; [defaults synchronize]; } - (void)saveImageUrl:(NSString *)imageUrl key:(NSString *)key{ NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setObject:imageUrl forKey:key]; [defaults synchronize]; } - (NSString *)getImageUrl:(NSString *)key{ NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; NSString *exists = [defaults objectForKey:key]; if (![KWMStringUtil isEmpty:exists]) { return exists; }else{ return @""; } } - (void)login { KWMUserModel *user= [KWMUserModel shareUser]; NSString *account = user.email; NSString *password = user.password; if (!password) { password = [SAMKeychain passwordForService:@"cemarose.account" account:account]; } if (!(account && password)) { return; } NSArray *items = @[ [BUYAccountCredentialItem itemWithEmail:account], [BUYAccountCredentialItem itemWithPassword:password], ]; BUYAccountCredentials *credentials = [BUYAccountCredentials credentialsWithItems:items]; // [weakSelf requestLoginAPI:credentials]; [self.client loginCustomerWithCredentials:credentials callback:^(BUYCustomer * _Nullable customer, BUYCustomerToken * _Nullable token, NSError * _Nullable error) { if (customer && token && !error) { [KWMUserModel saveAccountByCredentials:credentials]; _customer = customer; // _token = token; // _userModel.customerJSON = customer.JSONDictionary; // _userModel.tokenJSON = token.JSONDictionary; //异步保存数据 dispatch_async(dispatch_get_global_queue(0, 0), ^{ // [self saveData]; // [_userModel login]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:_customer.JSONDictionary forKey:@"customer"]; [defaults setObject:token.JSONDictionary forKey:@"token"]; [defaults synchronize]; [[KWMAPIManager sharedManager] loginWebSuccess:nil failure:nil]; }); }else{ NSLog(@"requestLoginAPI error: %@",error); [user logout]; [self logout]; } }]; } - (KWMUser *)loginUser { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; NSString *userJSON = [defaults objectForKey:kwmKeyUser]; NSData *jsonData = userJSON != nil ? [userJSON dataUsingEncoding:NSUTF8StringEncoding] : nil; if (jsonData) { NSError *error; NSDictionary *userDict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error]; if (!error) { KWMUser *tmpUser = [[KWMUser alloc]initWithDictionary:userDict error:&error]; if (!error && [tmpUser isValidated]) { current = tmpUser; } } } return current; } - (void)setLoginUser:(KWMUser *)user session:(NSString *)session{ current = user; if (current == nil || ![current isValidated]) { [self logout]; return; } [self saveUser:user]; [self saveSession:session]; } - (void)saveUser:(KWMUser *)user { NSString *userJSON = user.toJSONString; NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setObject:userJSON forKey:kwmKeyUser]; [defaults synchronize]; // [self registerJpush]; } - (void)deleteUser { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:kwmKeyUser]; } - (BUYClient *)client { if (_client == nil){ _client = [[BUYClient alloc] initWithShopDomain:Shopify_SHOP_DOMAIN apiKey:Shopify_API_KEY appId:Shopify_APP_ID]; } _client.pageSize = 20; NSDictionary *tokenDic = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"]; NSString *path = NSHomeDirectory();//主目录 NSLog(@"NSHomeDirectory:%@",path); if (tokenDic != nil) { BUYCustomerToken *token = [BUYCustomerToken customerTokenWithJSONDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]]; if (token != nil) { _client.customerToken = token; } } return _client; } -(BUYCustomer *)customer { if (!_customer) { NSDictionary *customerDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"customer"]; _customer = [[BUYCustomer alloc] initWithModelManager:self.client.modelManager JSONDictionary:customerDict]; } return _customer; } -(void)requestTags { [[KWMAPIManager sharedManager] adminUserSuccess:^(NSURLSessionDataTask *task, KWMDictionaryResult *result) { NSString *tags = result.data[@"customer"][@"tags"]; self.tags = [tags componentsSeparatedByString:@", "]; } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"%@",error); }]; } -(NSDictionary *)checkOutCache{ NSString *filePath = [self getCheckoutCachePath]; // 解档 NSData *cacheData = [NSData dataWithContentsOfFile:filePath]; if(!cacheData){ return nil; } NSDictionary *checkout = [NSJSONSerialization JSONObjectWithData:cacheData options:NSJSONReadingMutableContainers error:nil]; return checkout; // if(checkout){ // return [[BUYModelManager modelManager] insertCheckoutWithJSONDictionary:checkout]; // }else{ // return nil; // } } -(void)saveCheckoutCache:(NSDictionary *)dictionary{ if(dictionary){ NSData *cacheData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; if([cacheData writeToFile:[self getCheckoutCachePath] atomically:YES]){ NSLog(@"订单缓存成功"); }else{ NSLog(@"订单缓存失败"); } } } -(void)deleteCheckoutCache{ NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL isDelete=[fileManager removeItemAtPath:[self getCheckoutCachePath] error:nil]; } - (void)saveExchangeRate:(NSNumber *)exchangeRate { if(exchangeRate == nil){ return; } _exchangeRate = [NSDecimalNumber decimalNumberWithDecimal:exchangeRate.decimalValue]; NSString *exchangeString = exchangeRate.stringValue; NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; [defaults setObject:exchangeString forKey:kwmKeyExchangeRate]; [defaults synchronize]; } - (NSDecimalNumber *)exchangeRate { if (!_exchangeRate) { NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; NSString *exchageRateString = [defaults objectForKey:kwmKeyExchangeRate]; // NSNumber *rate = [KWMStringUtil stringToNumber:exchageRateString]; // return rate; if ([KWMStringUtil isEmpty:exchageRateString]) { _exchangeRate = [NSDecimalNumber decimalNumberWithString:ExchangeRateString]; } else { _exchangeRate = [NSDecimalNumber decimalNumberWithString:exchageRateString]; } } return _exchangeRate; } -(void)saveCollectionCache:(NSArray *)products collectionId:(NSNumber *)collectionId tags:(NSArray *)tags{ if(!products || products.count == 0){ return; } if(!collectionId){ return; } //初始化用于保存数据的key NSString *filePath= [self getCollectionCachePath:collectionId tags:tags]; //用于保存的字典列表 NSMutableArray *cacheArray =[NSMutableArray arrayWithCapacity:20]; for(BUYProduct *product in products){ if(product.JSONDictionary!=nil){ [cacheArray addObject:product.JSONDictionary]; } } if (![cacheArray writeToFile:filePath atomically:YES]){ NSLog(@"缓存失败"); } } -(NSArray *)getCollectionCache:(NSNumber *)collectionId tags:(NSArray *)tags{ NSString *filePath = [self getCollectionCachePath:collectionId tags:tags]; // 解档 NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; if(!arr||arr.count == 0){ return nil; } NSArray *cacheArr = [[BUYModelManager modelManager] insertProductsWithJSONArray:arr]; return cacheArr; } -(NSString *)getCollectionCachePath:(NSNumber *)collectionId tags:(NSArray *)tags{ if(!collectionId){ return @" "; } //初始化用于保存数据的key NSString *key =collectionId.stringValue; if(tags && tags.count>0){ for(NSString *tag in tags){ key = [NSString stringWithFormat:@"%@、%@",key,tag]; } } NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject; NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",key]]; return filePath; } -(NSString *)getCheckoutCachePath{ NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject; NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",kwmKeyCheckoutCache]]; return filePath; } - (BOOL)isLogin { return [self.loginUser isValidated] && [self checkSession]; } - (void)logout{ [self deleteSession]; // [self unRegisterJpush]; [self deleteUser]; // [self logoutChat]; } #pragma mark DES encrypt & decrypt /** * DES加密 * * @param plain data * * @return secret data */ //- (NSData *)DES_Encrypt:(NSData *)plainData{ // if (!plainData) { // return plainData; // } // // NSData *keyData = [secretKey dataUsingEncoding:NSASCIIStringEncoding]; // Byte iv[]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef}; // NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)]; // // NSData *secretData = [STEncryptorDES encryptData:plainData key:keyData iv:ivData]; // return secretData; //} /** * DES解密 * * @param secret data * * @return plain data */ //- (NSData *)DES_DEcrypt:(NSData *)secretData{ // if (!secretData) { // return secretData; // } // // NSData *keyData = [secretKey dataUsingEncoding:NSASCIIStringEncoding]; // Byte iv [] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef}; // NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)]; // NSData *plainData = [STEncryptorDES decryptData:secretData key:keyData iv:ivData]; // return plainData; //} #pragma mark JPush // //-(void)registerJpush{ // NSString *alias = [KWMStringUtil MD5:[NSString stringWithFormat:@"%@", self.loginUser.id.stringValue]]; // // NSSet *tags = [NSSet setWithArray:@[]]; // //注册极光推送 // [JPUSHService setTags:nil alias:alias callbackSelector:@selector(registerCallbackJpushAlias:tags:alias:) object:self]; //} // //-(void)unRegisterJpush{ // //反注册极光推送 // NSString *alias = @""; // NSSet *tags = [NSSet setWithArray:@[]]; // [JPUSHService setTags:nil alias:alias callbackSelector:@selector(unRegisterCallbackJpushAlias:tags:alias:) object:self]; //} // //- (void)registerCallbackJpushAlias:(int)iResCode tags:(NSSet*)tags alias:(NSString*)alias { // if(iResCode == 6002){//如果返回 6002 (超时)则建议重试 // [self registerJpush]; // return; // } // // NSLog(@"++++registerJpush: registrationID=%@", [JPUSHService registrationID]); //} // //- (void)unRegisterCallbackJpushAlias:(int)iResCode tags:(NSSet*)tags alias:(NSString*)alias { // if(iResCode == 6002){//如果返回 6002 (超时)则建议重试 // [self unRegisterJpush]; // return; // } //} #pragma mark login session - (void (^)(NSURLSessionDataTask *, KWMRequestResult *))getLoginSuccessCallback:(void (^)(NSURLSessionDataTask *task, KWMRequestResult *result))callback { __weak KWMUserDao *weakSelf = self; void (^success)(NSURLSessionDataTask *, KWMRequestResult *) = ^(NSURLSessionDataTask *task, KWMRequestResult *result) { BOOL isSuccess = result != nil && result.code == 0; if (isSuccess) { KWMUser *user = (KWMUser *)result.data; if (user != nil) { [weakSelf fetchSession:(NSHTTPURLResponse *)task.response user:user]; } } if (callback != nil) { callback(task, result); } }; return success; } - (void)fetchSession:(NSHTTPURLResponse *)httpResponse user:(KWMUser *)user { NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSArray<NSHTTPCookie *> *cookies = cookieStorage.cookies; for (NSHTTPCookie *cookie in cookies) { if ([SESSID isEqualToString:cookie.name] && [API_HOST isEqualToString:cookie.domain]) { NSString *session = cookie.value; KWMUserDao *userDao = [KWMUserDao shareDao]; [userDao setLoginUser:user session:session]; break; } } } - (void)updateSession:(NSString *)session { NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSArray<NSHTTPCookie *> *cookies = cookieStorage.cookies; //delete if empty if ([KWMStringUtil isEmpty:session]) { for (NSHTTPCookie *cookie in cookies) { [cookieStorage deleteCookie:cookie]; } return; } BOOL isExists = NO; //1.check if exists for (NSHTTPCookie *cookie in cookies) { if ([SESSID isEqualToString:cookie.name]) { NSString *exists = cookie.value; isExists = [session isEqualToString:exists]; break; } } //2.set session value if (!isExists) { for (NSHTTPCookie *cookie in cookies) { [cookieStorage deleteCookie:cookie]; } NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{ NSHTTPCookieName : SESSID, NSHTTPCookieValue : session, NSHTTPCookieDomain : API_HOST, NSHTTPCookiePath : @"/" }]; [cookieStorage setCookie:cookie]; } } -(NSString *)currencyCode { if (!_currencyCode) { _currencyCode = [[NSUserDefaults standardUserDefaults] stringForKey:@"_current_currency_code"]; if (!_currencyCode) { // _currencyCode = [@"zh" isEqualToString:[[NSLocale currentLocale] languageCode]] ? @"CNY" : @"EUR"; NSString *language = [[NSLocale preferredLanguages] firstObject]; _currencyCode = [language isMatchedByRegex:@"^zh"] ? @"CNY" : @"EUR"; } } return _currencyCode; } -(void)setCurrencyCode:(NSString *)currencyCode { _currencyCode = currencyCode; [[NSUserDefaults standardUserDefaults] setObject:currencyCode forKey:@"_current_currency_code"]; [[NSUserDefaults standardUserDefaults] synchronize]; } -(KWMCustomsClearance *)customsClearance{ if(!_customsClearance){ _customsClearance = [[NSUserDefaults standardUserDefaults] objectForKey:@"_customs_clearance"]; } return _customsClearance; } -(void)setCustomsClearance:(KWMCustomsClearance *)customsClearance{ _customsClearance = customsClearance; [[NSUserDefaults standardUserDefaults]setObject:customsClearance forKey:@"_customs_clearance"]; [[NSUserDefaults standardUserDefaults] synchronize]; } @end