持续创作,加速成长!这是我参与「日新方案 10 月更文应战」的第3天,点击检查活动概况

导言

登录处理流程: 上篇:前置常识blog.csdn.net/u011018979/… 下篇:中心实现(翻开app,如果 token不过期,就运用最近一次登录的token进行接口恳求)blog.csdn.net/u011018979/…

iOS小技能: app侧退出登录处理流程

本文解说退出登录处理流程:

  1. 退出登录时整理相关的数据:token、音讯推送别号

  2. 移除相关告诉:退出登录,切换UIWindow的主控制器之前,最好移除相关控制器监听的告诉。

在 ARC 环境下,viewController 或许被放在 autorelease 池中,因此 viewController 被pop后不一定立即被毁掉,所以一些对实时性要求很高的内存管理逻辑能够写在退出登录逻辑这儿(而不是写在dealloc内)

I 整理当时账户相关信息(token、音讯推送别号)

1.1 退出登录(token过期)的处理

/**
 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];
    }];
}

铲除本地数据库的token

+ (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;
}

退出登录时整理音讯推送的订单相关的打印数据


//     退出登录时整理音讯推送的订单相关的打印数据
    [ERPPrintInfo bg_clearAsync:QCTSNPrinterInfoTableName4push complete:^(BOOL isSuccess) {
    }];

1.2 移除音讯推送别号

blog.csdn.net/z929118967/… 需求:账号退出登陆后无法收到推送功能

- (void)deleteAliaWithblock:(void (^)(id sender))block
{
    WEAKSELF
    //Method - deleteAlias:completion:seq:
    [JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {
        if (iResCode == 6002 || iResCode == 6014 || iResCode == 6020 || iResCode == 6021 || iResCode == 6022) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [weakSelf deleteAliaWithblock:block];
            });
        } else if(iResCode == 0){
//            NSLog(@"铲除别号成功");
            if (block) {
                block(nil);
            }
            return ;
        }else{
            NSLog(@"铲除别号 失败code:%ld",(long)iResCode);
        }
    } seq:[_store.id integerValue]];
}

II 移除相关告诉

2.1 背景

在 ARC 环境下,viewController 或许被放在 autorelease 池中,因此 viewController 被pop后不一定立即被毁掉,所以一些对实时性要求很高的内存管理逻辑能够写在退出登录逻辑这儿(而不是写在dealloc内)

2.2 问题

没有移除主页等控制器的相关告诉,有或许引起发起屡次的接口恳求,尤其是登录之后恳求的第一个接口。

处理办法:退出登录时,遍历TabBarController的子控制器移除相关告诉。

+ (void)removeNoti{
    UIViewController *rootViewController =UIApplication.sharedApplication.delegate.window.rootViewController;
    if(![NSStringFromClass(rootViewController.class) isEqualToString:@"HWTabBarController"] ){
        return ;
    }
    for (HWNavigationController* nav in rootViewController.childViewControllers) {
        NSLog(@"removeObserver:%@",nav);
        if(![NSStringFromClass(nav.class) isEqualToString:@"HWNavigationController"] ){
            [[NSNotificationCenter defaultCenter]removeObserver:nav];
            break ;
        }
        for (UIViewController* vc in nav.childViewControllers) {
            NSLog(@"removeObservervc:%@",vc);
            [[NSNotificationCenter defaultCenter]removeObserver:vc];
        }
    }
}

[[NSNotificationCenter defaultCenter]removeObserver:vc]; 办法只能移除- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject; 办法增加的告诉,无法移除rac_addObserverForName增加的告诉。