¡Continúe creando, acelere el crecimiento! Este es el sexto día de mi participación en el "Nuggets Daily New Plan · October Update Challenge", haz clic para ver los detalles del evento
Introducción
Parte 1 : conocimiento previo blog.csdn.net/u011018979/… Parte 2: implementación principal (abra la aplicación, si el token no caduca, use el último token conectado para realizar una solicitud de interfaz) blog.csdn.net/ u011018979/…
Proceso de cierre de sesión del lado de la aplicación: blog.csdn.net/z929118967/…
I implementación central
1.1 Creación del objeto Sesión
Use la clase de herramienta HSSingleton para implementar un singleton y use el objeto userInfo que contiene el token de inicio de sesión y otros campos relacionados con el estado como propiedades del objeto singleton.
HSSingletonH(Session);
HSSingletonM(Session);
+ (void)SaveUserInfo:(UserInfoModel *)userInfo{
QCTSession.shareQCTSession.userInfo = userInfo;
}
复制代码
Almacenar información de fichas
#pragma mark - ******** iOS 优化登录流程:【打开app,如果 token不过期,就使用最近一次登录的tokenn进行接口请求。】(现状是每次打开app都会重新登录)
+ (void)saveModelWithModel:(UserInfoModel*)userModel{
[self emptySeeionLocal];
userModel.bg_tableName = QCTUserInfoModelTableName;
BOOL isSave = [userModel bg_save];// 保存方法
if (isSave) {
NSLog(@"token保存成功:%@",userModel.mj_keyValues);
}else{
NSLog(@"token保存失败:%@",userModel.mj_keyValues);
}
}
+(void)emptySeeionLocal{
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:nil] ];
// 先删除
for (UserInfoModel *loginModel in tmparr) {
NSString *where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"bg_id"),bg_sqlValue(loginModel.bg_id)];
BOOL isDelete = [UserInfoModel bg_delete:[NSString stringWithFormat:@"%@",QCTUserInfoModelTableName] where:where];
NSLog(@"删除重复数据%@:%@",isDelete?@"成功":@"失败",loginModel.mj_keyValues);
// break;
//
}
}
复制代码
Obtener información de fichas
+ (instancetype)getmodel4LoginSeesion{
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:nil] ];
if(tmparr.count>0 ){
UserInfoModel *userModel = tmparr.firstObject;
// QCTSession.shareQCTSession.userInfo = userModel;
[ QCTSession SaveUserInfo:userModel];
NSLog(@"获取的token 信息%@",userModel);
return tmparr.firstObject;
}
NSLog(@"获取的token userModel.shareUserInfoModel %@",UserInfoModel.shareUserInfoModel);
//
return UserInfoModel.shareUserInfoModel;
}
复制代码
1.2 Cuándo guardar el token en el objeto UserInfoModel
- al iniciar sesión
[ Session SaveUserInfo:userModel];
[UserInfoModel saveModelWithModel:userModel];
复制代码
- Cuando la aplicación sale: applicationWillTerminate, applicationWillResignActive
- (void)applicationWillTerminate:(UIApplication *)application {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
[UserInfoModel saveModelWithModel:UserInfoModel.shareUserInfoModel];
}
复制代码
1.3 Obtenga el token cuando vuelva a abrir la aplicación
#pragma mark - ******** 获取token信息
- (void)initInfo{
QCTSession.shareQCTSession.tmpUserInfoModel = nil;
[UserInfoModel getmodel4LoginSeesion];// 获取会话
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self initInfo];
}
复制代码
1.4 Cierre de sesión o invalidación (token) para borrar información
- Escuche en la aplicación :didFinishLaunchingWithOptions: método
__weak __typeof__(self) weakSelf = self;
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:kExitlogshowLoginViewNotification object:nil] subscribeNext:^(NSNotification *notification) {
NSString *tmp = @"";
if(notification.object){
tmp = notification.object;
[weakSelf.window showHUDMessage:tmp afterBlock:^(id _Nonnull sender) {
[weakSelf setupExitlogout];
}];
}else{
// tmp = @"";
[weakSelf setupExitlogout];
}
}];
复制代码
- Procesamiento de cierre de sesión (token caducado)
/**
1、移除极光的别名
2、初始化一些信息
3、清除账户信息缓存(本地数据库和内存中的token信息)
*/
- (void)setupExitlogout
{
[JPUSHService setTags:nil alias:@"" callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];
[UserInfoModel cleanInfoWithblock:^(id sender) {
//3、登录
UserInfoModel.shareUserInfoModel.token = nil;
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate setupLoginV];
}];
}
复制代码
- Borrar el token de la base de datos local
+ (void)cleanInfoWithblock:(void (^)(id sender))block{
[[UserInfoModel shareUserInfoModel] cleanInfo];
if(block){
block(nil);
}
}
- (void)cleanInfo{
#pragma mark - ******** 包括清除本地数据库的token
[[self class] emptySeeionLocal];//
[self setToken:nil];
_CurrentSysUser = nil;
// _
[QCTSession shareQCTSession].tmpUserInfoModel = nil;
}
复制代码
1.5 Juzgar si ingresar a la página de inicio directamente en viewDidLoad de la interfaz de inicio de sesión
- viewDidLoad juzga al crear SubView temprano, si ingresar directamente a la página de inicio
if(UserInfoModel.shareUserInfoModel.isLoginByToken){
[[self class] jumpHome];
return;
}
复制代码
- Determinar si hay un token
/**
判断是否有token
*/
- (BOOL)isLoginByToken{
if(![NSStringQCTtoll isBlankString:UserInfoModel.shareUserInfoModel.token]){
return YES;
}
return NO;
}
复制代码
II Preste atención a la implementación
2.1 El almacenamiento de tokens distingue entre un entorno formal y un entorno de prueba
-
El objeto UserInfoModel agrega una propiedad de nombre de dominio currentHost del token actual, que se usa para consultar el entorno de juicio
-
Si agrega un nuevo campo a BGFMDB, debe cambiar el nombre de la tabla
#warning BGFMDB如果新增字段,就需要更换一下表名,否则在旧表会找不到字段,无法更新数据
2021-01-29 17:16:10.418453+0800 Housekeeper[15013:1071895] [logging] table QCTUserInfoModelTableName0401 has no column named BG_IsreqGetCurrentSysUsering in "insert into QCTUserInfoModelTableName0401(BG_currentHost,BG_BearerToken,BG_token,BG_DictionariesEnum,BG_DictionariesEnumDictionary,BG_loginCode,BG_isGotoChangePassword,BG_HaveDefaultLevel,BG_bg_updateTime,BG_loginMessage,BG_IsreqGetCurrentSysUsering,BG_IsTobacco,BG_bg_createTime,BG_MsgsourceStr,BG_isShowBindingMobileNote) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"
复制代码
- Token de acceso basado en el nombre de dominio
NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"currentHost"),bg_sqlValue(currentHost)];
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:where] ];
复制代码
Almacenar información de fichas
+ (void)saveModelWithModel:(UserInfoModel*)userModel{
[self emptySeeionLocal];
userModel.bg_tableName = QCTUserInfoModelTableName;
userModel.currentHost = currentHost;
BOOL isSave = [userModel bg_save];// 保存方法
if (isSave) {
NSLog(@"token保存成功:%@",userModel.mj_keyValues);
}else{
NSLog(@"token保存失败:%@",userModel.mj_keyValues);
}
}
复制代码
2.2 Almacenamiento de datos
2020-03-30 19:23:12.877204+0800 Housekeeper[5577:1118700] DB Error: 1 "duplicate column name: BG_CompanyId"
BGFMDB no admite mayúsculas y minúsculas, por lo que el objeto guardado no puede tener dos campos en mayúsculas y minúsculas
@property (copy, nonatomic) NSString *companyId;
//@property (strong, nonatomic) NSString *CompanyId;
复制代码
2020-04-01 16:18:32.127564+0800 retail[8875:1402725] [logging] table QCTUserInfoModelTableName has no column named BG_currentHost
Consejos de depuración
Si se agrega un nuevo campo a la tabla de BGFMDB, puede cambiar el nombre de la tabla para evitar encontrar el campo y no poder actualizar los datos.
Si agrega un nuevo campo, debe cambiar el nombre de la tabla
2.3 Limpiar datos relacionados al cerrar sesión
// 3. 退出登录时清理消息推送的订单相关的打印数据
[ERPPrintInfo bg_clearAsync:QCTSNPrinterInfoTableName4push complete:^(BOOL isSuccess) {
}];
复制代码
III ver también
- Inicio de sesión único (Single Sign On): conocido como SSO, es que en múltiples sistemas de aplicaciones, los usuarios solo necesitan iniciar sesión una vez para acceder a todos los sistemas de aplicaciones de confianza mutua.
Por ejemplo, el SSO compatible con la aplicación Feishu
Cuando el superadministrador del equipo activa esta función y completa la configuración en segundo plano de administración, los usuarios del equipo pueden elegir SSO al iniciar sesión y usar el nombre de dominio corporativo para iniciar sesión en Feishu directamente. Esta función está disponible para los usuarios del equipo, no para los usuarios individuales.
- Solo se instalan las bibliotecas recién agregadas, las actualizadas se ignoran: blog.csdn.net/z929118967/…
➜ retail git:(develop) ✗ cat ~/bin/knpod
#!/bin/sh
#该命令只安装新添加的库,已更新的库忽略
pod install --verbose --no-repo-update
#该命令只更新指定的库,其它库忽略
#pod update 库名 --verbose --no-repo-update
exit 0% ➜ retail git:(develop) ✗
复制代码