iOS 获取验证码读秒时,按下home键,重新进app时,保证读秒正常进行

http://blog.csdn.net/m13215519957/article/details/51802187

(iOS)移动app很多时候会遇到注册,获取验证码倒计时的时候,按下home键进入后台,倒计时就会停止,这里提供一种方法,来保证时间会正常进行下去。

 1:从appDelegate中这两个方法分别发送通知

#define sendNotification(key)     [[NSNotificationCenter defaultCenter] postNotificationName:key object:self userInfo:nil];  //发送通知

#define WeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o; //引用self

- (void)applicationDidEnterBackground:(UIApplication*)application{

//进入后台时要进行的处理

sendNotification(kRegisterBackgroundNoti)

}

- (void)applicationWillEnterForeground:(UIApplication*)application{

//进入前台时要进行的处理

sendNotification(kRegisterFrontNoti)

}

 

2:在目标控制器中,接收这两个通知,在各自的通知方法中获取一次当前系统时间,然后就可以计算出从按下home键退出应用到重新进入应用的时间差

@property(nonatomic,assign)NSDate *backDate;//进入后台时的时间

@property(nonatomic,assign)NSDate *frontDate;//重新打开应用时的时间

@property(nonatomic,assign)dispatch_source_t timer;

- (void)viewDidLoad {

[super viewDidLoad];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setBackgroundTask) name:kRegisterBackgroundNoti object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setFrontTask) name:kRegisterFrontNoti object:nil];

}

-(void)setBackgroundTask{

self.backDate=[NSDate date];

}

-(void)setFrontTask{

self.frontDate=[NSDate date];

}

这里是读秒的方法

-(void)getStartTime{

__block int timeout=60; //倒计时时间

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

self.timer=timer;

dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行

@WeakObj(self);

dispatch_source_set_event_handler(timer, ^{

if(timeout<=0){ //倒计时结束,关闭

dispatch_source_cancel(timer);

dispatch_async(dispatch_get_main_queue(), ^{

//设置界面的按钮显示 根据自己需求设置

// NSLog(@"时间到,停止动作");

});

}else{

if (selfWeak.frontDate&&selfWeak.backDate) {   //这里面就是判断进出应用两次之间的时间差

NSTimeInterval backDate = [selfWeak.backDate timeIntervalSinceReferenceDate];

NSTimeInterval frontDate = [selfWeak.frontDate timeIntervalSinceReferenceDate];

int interval = frontDate - backDate;

timeout=timeout-interval;

selfWeak.backDate=nil;

selfWeak.frontDate=nil;

}

int seconds = timeout % 61;

NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];

dispatch_async(dispatch_get_main_queue(), ^{

//NSLog(@"每秒执行一次");

});

timeout--;

}

});

dispatch_resume(timer);

}

3 注意事项:如果还在读秒时,就执行了返回上一级操作,此时就应该暂停该队列

-(void)viewDidDisappear:(BOOL)animated{

[super viewDidDisappear:animated];

dispatch_suspend(self.timer);//退出界面时,读秒还在进行中,这时候应该暂停该队列

}

时间: 2024-10-23 12:04:09

iOS 获取验证码读秒时,按下home键,重新进app时,保证读秒正常进行的相关文章

iOS获取.ipa程序包

iOS获取.ipa程序包 原文在此 首先肯定不是获取自己的ipa包. 为什么要获取ipa包呢?比如,在仿写一些程序时,避免不了获取它的图片素材等等,那么最快也是最有效的方式就是获取原程序的ipa包.更或者,你想要逆向分析某一款APP时,那么只有获取了ipa后才能进行class-dump,ida等等后续工作. 一.通过越狱设备 如果有越狱手机,那么就变得很简单,只需要从AppStore下载到越狱手机,然后用iTools/PP助手等工具将ipa包备份到电脑即可,下图是使用PP助手: 如果只是为了获取

ios开发获取验证码按钮读秒效果

方法一: - (void)startCountDown { _seconds = 60; NSString *str = [NSString stringWithFormat:@"%d秒后可重新获取", _seconds]; [_btnVerify setTitle:str forState:UIControlStateDisabled]; [_btnVerify.titleLabel setFont:[UIFont systemFontOfSize:12]]; [_btnVerify

iOS滑动解锁/滑动获取验证码效果实现

最近短信服务商要求公司的app在获取短信验证码时加上校验码,目前比较流行的是采用类似滑动解锁的方式,我们公司采取的就是这种方式,设计图如下所示: 这里校验内部的处理逻辑不作介绍,主要分享一下界面效果的实现, 下面贴出代码: 先子类化UISlider #import <UIKit/UIKit.h> #define SliderWidth 240 #define SliderHeight 40 #define SliderLabelTextColor [UIColor colorWithRed:1

iOS项目中获取验证码倒计时及闪烁问题解决方案

大家在做验证码的时候一般都会用到倒计时,基本上大家实现的方式都差不多,先贴出一些代码来.. -(void)startTime{ __block int timeout= 59; //倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE

IOS 仿某某获取验证码方式,xib+自动布局实现

GetCodeViewController 仿某某获取验证码,并验证方式.提供很多自定义接口,高度自定义.也可以自己更改源代码,界面用xib文件,加自动布局实现,直观易懂. 运行项目,请先cd到该目录后,pod update一下,即可运行,因为用到了POP动画库. 用法 将 项目中 popCodeViewController 整个文件夹拖到你的项目里面. 导入依赖库POP动画库 自定义控制器中,导入GetCodeViewController.PresentingAnimator.Dismissi

iOS获取app图标和启动图片名字(AppIcon and LaunchImage&#39;s name)

在某种场景下,可能我们需要获取app的图标名称和启动图片的名称.比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做个模拟通知提示,需要用到icon名称:再比如在加载某个控制器时,想设置该控制器的背景图片为启动图片,需要用到启动图片名称. 而事实上icon图片放在系统AppIcon文件夹里,启动图片放在系统LaunchImage文件夹里,取这些图片的名称和其他一般资源图片名称不一样. 为了方便举例子,咱们先简单粗暴点 假设当前项目只支持iPhone设备,并且只支持竖屏:而

iOS获取设备型号、装置类型等信息

iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设备标识:idfa和idfv idfa:全称advertisingIdentifier,官方解释是广告标识,适用于广告推广,这个建议不要轻易使用,如果用了,则App里必须提供广告功能,否则很有可能会在AppStore审核时被拒.而且idfa是可以被用户关闭的(设置->隐私),一旦被关闭,就获取不到了.

iOS获取uuid

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定.如此一来,每个人都可以建立不与其它人冲突的 UUID.在这样的情况下,就不需考虑数据库建立时的名称重复问题. UUID由以下几部分的组合: (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同. (2)时钟序列. (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得

iOS 获取文件的目录路径的几种方法 [转]

iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory())手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该