iOS 闹钟功能实现+本地通知+音频播放

特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!

问题描述:通过picker设置时间,到了设定好的时间 闹钟响起,并弹出提示框,点击确定,停止播放音频。如果设置好了闹钟,没有停在该页面,而是返回了手机主屏幕或是手机锁屏,当到了闹钟设定的时间,会弹出消息通知。(如果设定的时间是已经过去的时间,页面不会有响应,直到设置正确的时间为止.)

效果图如下:

iOS 闹钟功能实现+本地通知+音频播放    iOS 闹钟功能实现+本地通知+音频播放      iOS 闹钟功能实现+本地通知+音频播放

具体代码如下:

NaoZhongViewController.m文件

#import "NaoZhongViewController.h"

#import <AVFoundation/AVFoundation.h>

#define kW self.view.frame.size.width

#define kH self.view.frame.size.height


@interface NaoZhongViewController ()

{

    NSTimer * _timer;  //定时器

    AVAudioPlayer * _player;

}

@property(nonatomic, weak)UIDatePicker * picker;

@property(nonatomic,weak) UILabel * label;

@property(nonatomic,assign)NSInteger lt;

@property(nonatomic,weak) UIButton * button;

@end

@implementation NaoZhongViewController 

- (void)viewDidLoad {

    [super viewDidLoad];   

    self.title=@"闹钟";

    self.view.backgroundColor=[UIColor whiteColor];

    [self _loadView];

}

- (void) _loadView

{

    //view

    UIView * view=[[UIView alloc]initWithFrame:CGRectMake(, 20+45, kW, kH)];

    UIDatePicker * picker=[[UIDatePicker alloc]init];

    picker.backgroundColor=[UIColor colorWithRed:0.1 green:0.1 blue:0.5 alpha:0.1];

    [view addSubview:picker];

    _picker=picker;

    [self.view addSubview:view];

    UIButton * button=[[UIButton alloc]initWithFrame:CGRectMake(, , 100, 50)];

    button.backgroundColor=[UIColor colorWithRed:0.1 green:0.5 blue:0.8 alpha:0.2];

    button.center=self.view.center;

    [button setTitle:@"确定" forState:UIControlStateNormal];

    [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

    [button addTarget:self action:@selector(countTime:) forControlEvents:UIControlEventTouchUpInside];

        [button setTitle:@"确定" forState:UIControlStateSelected];

    [button setTitleColor:[UIColor grayColor] forState:UIControlStateSelected];

    _button=button;

    [self.view addSubview:button];    

        UILabel * label=[[UILabel alloc]initWithFrame:CGRectMake(20, 400, kW-40, kH-400-80)];

    label.backgroundColor=[UIColor colorWithRed:0.2 green:0.2 blue:0.6 alpha:0.2];

    label.text=@"00:00:00";

    label.textAlignment=NSTextAlignmentCenter;

    [label setFont:[UIFont fontWithName:nil size:80]];

    _label=label;

    [self.view addSubview:label];

    
    UILabel * label1=[[UILabel alloc]initWithFrame:CGRectMake(25, 400, kW-40, 40)];

    label1.text=@"闹钟还剩时间:";

    [self.view addSubview: label1];

}

- (void) countTime:(UIButton *) button
{

    button.selected=!button.selected;

//求从现在到设置时间的时长秒数(有误差)

/*

    //1970到picker的秒数

    NSTimeInterval seconds=[_picker.date timeIntervalSince1970];

    NSLog(@"%@",_picker.date);   //设置的时间

    NSLog(@"%.0f",seconds);

    //1970到现在的秒数

    NSDate * date=[[NSDate alloc]init];

    NSLog(@"%@",date);

    NSTimeInterval seconds2=[date timeIntervalSince1970];

    NSLog(@"%.0f",seconds2);

    NSLog(@"时间差是:----%.0f 秒",seconds-seconds2);

    */

//求从现在到设置时间的时长秒数(有误差)

/*

    NSDate * date=[[NSDate alloc]init];

    NSLog(@"%@",date);

    NSTimeInterval seconds2=[_picker.date timeIntervalSinceDate:date];

    NSLog(@"%.0f",seconds2);

    NSLog(@"时间差是:----%.0f 秒",seconds2);

    */

    //picker 设置的时间

    //格式

    NSDateFormatter * format1=[[NSDateFormatter alloc]init];

    [format1 setDateFormat:@"hh"];

    NSDateFormatter * format2=[[NSDateFormatter alloc]init];

    [format2 setDateFormat:@"mm"];

    //获取小时

    NSString * str1=[format1 stringFromDate:_picker.date];

    NSInteger temp1=[str1 integerValue];

    

    NSDate * date3=[[NSDate alloc]init];

    NSString * str3=[format1 stringFromDate:date3];

    NSInteger temp3=[str3 integerValue];

 
    //获取分钟

    NSString * str2=[format2 stringFromDate:_picker.date];

    NSInteger temp2=[str2 integerValue];


    NSDate * date4=[[NSDate alloc]init];

    NSString * str4=[format2 stringFromDate:date4];

    NSInteger temp4=[str4 integerValue];

    NSLog(@"闹钟时长:%li 秒",(temp1-temp3)*60*60+(temp2-temp4)*60);

//--------------------------------------------------------------------

    NSInteger lt=(temp1-temp3)*60*60+(temp2-temp4)*60;

    _lt=lt;


    if (_lt> && _button.selected)

    {

        NSString * strT=[NSString stringWithFormat:@"%02i:%02i:%02i",(int)lt/3600%60,(int)lt/60%60,(int)lt%60];

        _label.text=strT;

    }

    else

    {

        NSLog(@"请重新设置时间....");

        _label.text=@"00:00:00";

        return;

    }

    

    

    if(_timer==nil)

    {

        //每隔0.01秒刷新一次页面

        _timer=[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(runAction) userInfo:nil repeats:YES];

        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

        NSLog(@"开始倒计时.....");

    }

    else

    {

        [_timer invalidate];   //定时器失效

    }

}

- (void) runAction

{

    _lt--;

    if (_lt==)

    {

        [_timer invalidate];//让定时器失效

        UIAlertView * alert=[[UIAlertView alloc]initWithTitle:@"提示" message:@"关闭闹钟" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];

//        [alert addButtonWithTitle:@"确定"];

        alert.delegate=self;

//        [alert clickedButtonAtIndex:0];

        [alert show];

        //提示框弹出的同时,开始响闹钟

        NSString * path=[[NSBundle mainBundle]pathForResource:@"4948.mp3" ofType:nil];

        NSURL * url=[NSURL fileURLWithPath:path];

        

        NSError * error;

        _player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];

        _player.numberOfLoops=-1;    //无限循环  =0 一遍   =1 两遍    =2 三遍     =负数  单曲循环

        _player.volume=2;          //音量

        [_player prepareToPlay];    //准备工作

        //[_player stop];       //卡一下

        [_player play];    //开始播放

        

        // 1 注册通知

        

        UIApplication * app=[UIApplication sharedApplication];

        NSArray * array=[app scheduledLocalNotifications];

        NSLog(@"%ld",array.count);

        for (UILocalNotification * local in array) {

            NSDictionary * dic= local.userInfo;

            if ([dic[@"name"] isEqual:@"zhangsan"]) {

                //删除指定的通知

                [app cancelLocalNotification:local];

            }

        }

        

        //删除所有通知

        //    [app cancelAllLocalNotifications];

        //

 
        //判断是否已经注册通知

        UIUserNotificationSettings* setting= [app currentUserNotificationSettings];

        //如果setting.types==UIUserNotificationTypeNone 需要注册通知

        if(setting.types==UIUserNotificationTypeNone){


            UIUserNotificationSettings* newSetting= [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];

            [app registerUserNotificationSettings:newSetting];

        }else{

            [self addLocalNotification];

        }

    }

    

    NSString * str=[NSString stringWithFormat:@"%02d:%02d:%02d",(int)(self.lt)/3600%24,(int)(self.lt)/60%60,(int)(self.lt)%60];

    _label.text=str;


}


#pragma mark - 增加本地通知

- (void) addLocalNotification{

    UILocalNotification * notification=[[UILocalNotification alloc] init];

    notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:];

    notification.alertBody=@"闹钟响了。。。。。。";

    notification.alertAction=@"打开闹钟";

    notification.repeatInterval=NSCalendarUnitSecond;

    notification.applicationIconBadgeNumber=1;

    //notification.userInfo=@{@"name":@"zhangsan"};

    //notification.soundName=@"4195.mp3";

    

    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

    

}



//注册完成后调用

-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{

    [self addLocalNotification];

}

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{

    NSLog(@"+========我接受到通知了");

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

    [_player stop];

 }

@end

 

未经允许不得转载:作者:SheaYang, 转载或复制请以 超链接形式 并注明出处 技术Dog|博客
原文地址:《iOS 闹钟功能实现+本地通知+音频播放》 发布于2019-11-07

分享到:
赞(0) 打赏

评论 抢沙发

6 + 2 =


iOS 闹钟功能实现+本地通知+音频播放

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?