iOS 短信验证码倒计时按钮

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

内容简介:级别: ★★☆☆☆标签:「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 短信验证码倒计时按钮》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

网络共和国

网络共和国

[美] 凯斯·桑斯坦 / 黄维明 / 上海人民出版社 / 2003-6-1 / 15.00元

本书主要讨论网络中的民主问题。网络技术已经深刻地影响了我们的生活,我们随时可以获得我们需要的信息,我们也随时可以与别人联系,那么网络技术是不是就是民主的福音呢?作者回答说不,他认为通过网络人们更容易获得的是自己喜欢的信息,而拒绝接受自己不喜欢的信息,事实上人们得到的是窄化的信息,很多的网站也不和与自己立场相反的网站链接。而在一个真正的民主的环境中,信息应是多元的并且不是我们事先选择的,在其中我们还......一起来看看 《网络共和国》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具