iOS 短信验证码倒计时按钮

栏目: IOS · 发布时间: 6年前

内容简介:级别: ★★☆☆☆标签:「iOS 验证码后台倒计时」「NSTimer后台运行」「iOS 定时器后台运行」作者: Xs·H

级别: ★★☆☆☆

标签:「iOS 验证码后台倒计时」「NSTimer后台运行」「iOS 定时器后台运行」

作者: Xs·H

审校:QiShare团队

短信验证码登录在app中十分常见,相对于账号+密码的登录方式,短信验证码登录既免去了用户记忆密码的繁琐,也在很大程度上降低了密码泄露的风险。但是,对app运营方来说,每发一条短信就会支付相对应的短信费,所以,为了防止恶意频繁访问,在设计发送短信验证码接口时会加上限制逻辑。比如,针对同一手机号,接口会控制在120秒内不可重复发送短信验证码。为了优化用户体验,app往往会做出对应的逻辑控制:在点击“获取验证码”按钮后将按钮设置成不可点击状态,并开始120秒的倒计时,倒计时结束后恢复按钮为可点击状态。

按照上述需求,实现一个倒计时按钮并不难,使用NSTimer就可以。但由于在app进入后台时NSTimer会被暂停,直到app进入前台,NSTimer才会继续工作(如果NSTimer还没被释放的话),这就会导致按钮上的倒计时会缺失app在后台的那段时间。所以,开发者要想办法补上这段时间。

如何补上这段时间,就是本文探讨的内容。在此之前,先通过下图看一下短信验证码倒计时场景。

iOS 短信验证码倒计时按钮

要补上app进入后台的时间,有两个思路:

    1. 记录下app在后台的时间,在app进入前台后补给定时器;
    1. 想办法让NSTimer在app进入后台后能够运行120秒以上。

思路1:记录app在后台的时间

通过监听 UIApplicationDidEnterBackgroundNotificationUIApplicationWillEnterForegroundNotification 可以获取到app进入后台和回到前台的时间戳,将这两个时间戳取差,就是app在后台的时间,然后用这个时间对计时器的时间进行补偿就能实现需求。代码如下:

#pragma mark - Notifications

- (void)applicationDidEnterBackground:(id)sender {
    NSLog(@"%s", __func__);
    
    _didEnterBackgroundTimestamp = [[NSDate date] timeIntervalSince1970];
}

- (void)applicationWillEnterForeground:(id)sender {
    NSLog(@"%s", __func__);
    
    NSTimeInterval willEnterForegroundTimestamp = [[NSDate date] timeIntervalSince1970];
    
    NSInteger onBackgroundSeconds = floor((_didEnterBackgroundTimestamp == 0)? 0: (willEnterForegroundTimestamp - _didEnterBackgroundTimestamp));
    _currentInteger -= onBackgroundSeconds;
}
复制代码
didEnterBackgroundTimestamp
onBackgroundSeconds

思路2:使NSTimer在后台保持运行

首先,Apple允许开发者向系统申请后台运行权限,比如使用“位置服务”的“高德地图”、“滴滴出行”等app和使用“音频服务”的“QQ音乐”、“网易云音乐”等app。但如果申请了权限,就得保证app提供相应的服务,不然在上线App Store时会被拒绝。所以,对于简单的倒计时场景,不考虑使用这种方式。 好在,iOS向开发者提供了临时借用后台运行权限的API,以向app提供最多180秒的后台运行权限。说到“借用”,就得有个“借条”(凭证),还得有借有还。 通过监听 UIApplicationDidEnterBackgroundNotification ,在app进入后台时,调用API向系统借用180秒的后台运行权限,并保留借用凭证。在借用时间即将到期时或者做完需要做的事情后调用API将后台权限还给系统,并将借用凭证标识为失效状态。具体代码如下。

- (void)stopCountdown {
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
    
    [self endBackgroundTask];
    [self setEnabled:YES];
    
    [_timer invalidate];
    _timer = nil;
}


#pragma mark - Private functions

- (void)startBackgroundTask {
    
    __weak typeof(self) weakSelf = self;
    _backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [weakSelf endBackgroundTask];
    }];
}

- (void)endBackgroundTask {
    
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskId];
    _backgroundTaskId = UIBackgroundTaskInvalid;
}


#pragma mark - Notifications

- (void)applicationDidEnterBackground:(id)sender {
    NSLog(@"%s", __func__);
    
    [self startBackgroundTask];
}
复制代码
backgroundTaskId
beginBackgroundTaskWithExpirationHandler
stopCountdown

以上是作者实现短信验证码倒计时按钮常用到的两种方式。为了方便复用,作者将倒计时功能封装进了按钮中,工程代码可从 QiCountdownButton 中获取。

小编微信:可加并拉入《QiShare技术交流群》。

iOS 短信验证码倒计时按钮

关注我们的途径有:

QiShare(简书)

QiShare(掘金)

QiShare(知乎)

QiShare(GitHub)

QiShare(CocoaChina)

QiShare(StackOverflow)

QiShare(微信公众号)


以上所述就是小编给大家介绍的《iOS 短信验证码倒计时按钮》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

An Introduction to Probability Theory and Its Applications

An Introduction to Probability Theory and Its Applications

William Feller / Wiley / 1991-1-1 / USD 120.00

Major changes in this edition include the substitution of probabilistic arguments for combinatorial artifices, and the addition of new sections on branching processes, Markov chains, and the De Moivre......一起来看看 《An Introduction to Probability Theory and Its Applications》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器