前言
今天整理一下一般項(xiàng)目中都會(huì)有的兩個(gè)類(lèi)。它們本身并無(wú)難度,主要是對(duì)這些細(xì)碎的東西梳理一下。都是比較基礎(chǔ)的東西,而且代碼里的注釋比較多,所以主要上代碼了。
公共類(lèi):PublicFunction
我們可以把項(xiàng)目中一些公用的、基礎(chǔ)功能的的東西,且多以類(lèi)方法的形式定義統(tǒng)一定義在一個(gè)公共類(lèi)里,以便項(xiàng)目開(kāi)發(fā)中調(diào)用。
** PublicFunction.h **
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface PublicFunction : NSObject
// app的版本號(hào)
+ (NSString *)appVersion;
// 系統(tǒng)版本號(hào)
+ (NSString *)OSVersion;
// 設(shè)備(iPhone)的固件版本
+ (NSString *)deviceInfo;
// 獲取當(dāng)前的window
+ (UIWindow *)getCurrentWindow;
// 第一次使用APP時(shí)保存記號(hào)
+ (void)saveAPPFirstUserd:(BOOL)isFirst;
// 判斷APP是否是第一次使用
+ (BOOL)isAPPFirstUsered;
// 保存服務(wù)器時(shí)間和本地時(shí)間的差值
+ (void)saveDifferenceWithServerTime:(NSString *)serverTime;
// 獲取服務(wù)器時(shí)間和本地時(shí)間的差值
+ (NSTimeInterval)differenceOfLocalAndServer;
// ----- 新添加
// 清除字符串首尾空格
+ (NSString *)clearSpaceOfString:(NSString *)str;
// 清除字符串所有空格
+ (NSString *)clearAllSpaceOfString:(NSString *)str;
@end
** PublicFunction.m **
#import "PublicFunction.h"
#import "sys/utsname.h"
@implementation PublicFunction
// app的版本號(hào)
+ (NSString *)appVersion
{
NSDictionary *dict = [[NSBundle mainBundle] infoDictionary];
NSString *appVersion = dict[@"CFBundleShortVersionString"]; // 注意區(qū)分CFBundleShortVersionString和CFBundleVersion
if(appVersion.length == 0){
return @"";
}
return appVersion;
}
// 系統(tǒng)版本號(hào)
+ (NSString *)OSVersion
{
return [[UIDevice currentDevice] systemVersion];
}
// 設(shè)備(iPhone)的固件版本
+ (NSString *)deviceInfo
{
struct utsname systemInfo;
uname(&systemInfo);
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
if (platform.length==0){
return @"";
}
return platform;
}
// 獲取當(dāng)前的window
+ (UIWindow *)getCurrentWindow
{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if(!window){
window = [[UIApplication sharedApplication].windows firstObject];
}
return window;
}
// 第一次使用APP時(shí)保存記號(hào)
+ (void)saveAPPFirstUserd:(BOOL)isFirst
{
[[NSUserDefaults standardUserDefaults] setBool:isFirst forKey:@"IsFirstUserAPP"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 判斷APP是否是第一次使用
+ (BOOL)isAPPFirstUsered
{
return [[NSUserDefaults standardUserDefaults] boolForKey:@"IsFirstUserAPP"];
}
// 保存服務(wù)器時(shí)間和本地時(shí)間的差值
+ (void)saveDifferenceWithServerTime:(NSString *)serverTime
{
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
dateFormat.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *serverDate = [dateFormat dateFromString:serverTime];
NSTimeInterval server = [serverDate timeIntervalSince1970];
NSDate *localDate = [NSDate date];
NSTimeInterval local = [localDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setInteger:server-local forKey:@"TimeDifferenceOfLocalAndServer"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 獲取服務(wù)器時(shí)間和本地時(shí)間的差值
+ (NSTimeInterval)differenceOfLocalAndServer
{
return [[NSUserDefaults standardUserDefaults] integerForKey:@"TimeDifferenceOfLocalAndServer"];
}
// ----- 新添加
// 清除字符串首尾空格
+ (NSString *)clearSpaceOfString:(NSString *)str
{
if(str.length == 0){
return @"";
}
NSString *string = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
return string;
}
// 清除字符串所有空格
+ (NSString *)clearAllSpaceOfString:(NSString *)str
{
if(str.length == 0){
return @"";
}
NSString *string = [str stringByReplacingOccurrencesOfString:@"" withString:@" "];
return string;
}
@end
用戶(hù)信息類(lèi):UserModel
在項(xiàng)目中我們用一個(gè)UserModel類(lèi)來(lái)統(tǒng)一管理有關(guān)用戶(hù)信息等的東西。
** UserModel.h **
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface UserModel : NSObject
@property (nonatomic, copy)NSString *userId;
@property (nonatomic, copy)NSString *name;
@property (nonatomic, copy)NSString *nickName;
@property (nonatomic, copy)NSString *sex;
@property (nonatomic, copy)NSString *age;
@property (nonatomic, copy)NSString *mobile;
@property (nonatomic, copy)NSString *email;
@property (nonatomic, copy)NSString *token;
@property (nonatomic, assign)BOOL isLogin; // 登錄狀態(tài),是否登錄
@property (nonatomic, copy)NSString *isSetPayPsd; // 是否設(shè)置支付密碼
+ (instancetype)shareInstance;
// 保存賬號(hào)和密碼
+ (void)saveAccount:(NSString *)account password:(NSString *)password;
// 保存用戶(hù)信息到本地
+ (void)saveUserInfoLocal:(NSDictionary *)infoDict;
// 從本地獲取用戶(hù)信息
+ (NSDictionary *)userInfoFromLocal;
// 登錄成功后做的一些處理
- (void)handleAfterLoginSuccess:(NSDictionary *)infoDict token:(NSString *)token;
// 退出登錄
- (void)handleForLoginOut;
// 彈出登錄界面
+ (void)showLoginViewController:(UIViewController *)viewController;
@end
** UserModel.m **
#import "UserModel.h"
#import "LoginViewController.h"
@implementation UserModel
+ (instancetype)shareInstance
{
static UserModel *userModel = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
userModel = [[UserModel alloc] init];
});
return userModel;
}
- (instancetype)init
{
self = [super init];
if(self)
{
// 從本地緩存得到用戶(hù)信息,成為單例UserModel的內(nèi)存緩存
[self infoFromDict:[UserModel userInfoFromLocal]];
_isLogin = [[NSUserDefaults standardUserDefaults] boolForKey:@"LoginState"];
_token = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserToken"];
}
return self;
}
// 保存賬號(hào)和密碼
+ (void)saveAccount:(NSString *)account password:(NSString *)password
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if(userDefaults){
[userDefaults setObject:account forKey:@"account"];
[userDefaults setObject:password forKey:@"password"];
[userDefaults synchronize];
}
}
// 保存用戶(hù)信息到本地
+ (void)saveUserInfoLocal:(NSDictionary *)infoDict
{
if(infoDict.count == 0){
return;
}
NSData *infoData = [NSKeyedArchiver archivedDataWithRootObject:infoDict];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setValue:infoData forKey:@"UserInfoData"];
[userDefaults synchronize];
}
// 從本地獲取用戶(hù)信息
+ (NSDictionary *)userInfoFromLocal
{
NSData *infoData = [[NSUserDefaults standardUserDefaults] valueForKey:@"UserInfoData"];
NSDictionary *infoDict = [NSKeyedUnarchiver unarchiveObjectWithData:infoData];
return infoDict;
}
// 退出登錄
- (void)handleForLoginOut
{
[self changeLoginState:NO];
_token = nil;
[[NSNotificationCenter defaultCenter] postNotificationName:@"QuitLogin" object:nil];
}
// 登錄成功后做的一些處理
- (void)handleAfterLoginSuccess:(NSDictionary *)infoDict token:(NSString *)token
{
if(infoDict.count == 0 || token.length == 0){
return;
}
// 登錄狀態(tài)變?yōu)閅ES
[self changeLoginState:YES];
// 保存token到本地
[self saveToken:token];
// 保存用戶(hù)信息
[self infoFromDict:infoDict];
[UserModel saveUserInfoLocal:infoDict];
}
// 彈出登錄界面
+ (void)showLoginViewController:(UIViewController *)viewController
{
LoginViewController *loginVC = [LoginViewController new];
UINavigationController *loginNavC = [[UINavigationController alloc] initWithRootViewController:loginVC];
[viewController presentViewController:loginNavC animated:YES completion:nil];
}
#pragma mark ---- private method
// 改變登錄狀態(tài)
- (void)changeLoginState:(BOOL)loginState
{
_isLogin = loginState;
[[NSUserDefaults standardUserDefaults] setBool:loginState forKey:@"LoginState"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 保存token
- (void)saveToken:(NSString *)token
{
if(token.length == 0){
return;
}
_token = token;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:token forKey:@"UserToken"];
[userDefaults synchronize];
}
// 保存用戶(hù)信息——內(nèi)存
- (void)infoFromDict:(NSDictionary *)dict
{
if(dict.count == 0){
return;
}
_userId = [dict valueForKey:@"userId"];
_name = [dict valueForKey:@"name"];
_nickName = [dict valueForKey:@"nickName"];
_sex = [dict valueForKey:@"sex"];
_age = [dict valueForKey:@"age"];
_mobile = [dict valueForKey:@"mobile"];
_email = [dict valueForKey:@"email"];
_isLogin = [dict valueForKey:@"isLogin"];
_isSetPayPsd = [dict valueForKey:@"isSetPayPsd"];
}
@end
我們用假數(shù)據(jù)模擬一下登錄成功后的處理:
// 模擬用戶(hù)登錄請(qǐng)求的網(wǎng)絡(luò)回調(diào)數(shù)據(jù)
NSDictionary *resultInfo = @{@"userId":@"06",
@"name":@"wang",
@"nickName":@"wang66",
@"sex":@"1",
@"age":@"23",
@"mobile":@"wang",
@"email":@"wang@164.com"};
NSString *token = @"xxx";
[[UserModel shareInstance] handleAfterLoginSuccess:resultInfo token:token]; // 登錄成功需要的處理