IOS 通知 alarm 记录
所有的内容融为一体,去除某一个项不知道结果如何。
最主要的前提:APP 会长期保留在后台
1.在info.plist 文件里面,加入 audio 后台请求
2.当APP 点击home进入后台之后,请求一个background handler,当handler快到期的时候,播放一个空mp3,再请求一个新的handler(不知道这样是否合适)
3. APP 分为“Alive”状态下
3.1 点击”通知“进入,会依次启动 didReceiveLocalNotification跟 applicationWillEnterForeground函数。其中applicationWillEnterForeground函数在第一次APP启动的时候是不会进入的。
3.2 点击”ICON“ 进入,会启动 applicationWillEnterForeground 函数,并不会启动didReceiveLocalNotification函数。
4.APP被结束后台状态下
4.1 点击”通知“进入,会启动 didFinishLaunchingWithOptions函数,并且有通知进入。其中applicationWillEnterForeground函数不会进入(3.1讲过了)
4.2 点击”ICON“ 进入,会启动 didFinishLaunchingWithOptions 函数,但是没有通知进入。
相关代码:
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
/*
{
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"dddddd" message:notification.soundName delegate:nil cancelButtonTitle:@"" otherButtonTitles:@"", nil];
[alert show];
}
*/
NSLog(@"收到通知-开启闹钟");
[AlarmOpt setAlarmFromNoti];
[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(handleNotifiction:) userInfo:notification repeats:NO];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
mainVC = [[MainViewController alloc]initWithNibName:@"MainViewController" bundle:nil];
self.window.rootViewController = mainVC;
{
//VoiceViewController * vc = [[VoiceViewController alloc]initWithNibName:@"VoiceViewController" bundle:nil];
//NumViewController * vc = [[NumViewController alloc]initWithNibName:@"NumViewController" bundle:nil];
//BIHuaViewController * vc = [[BIHuaViewController alloc]initWithNibName:@"BIHuaViewController" bundle:nil];
//self.window.rootViewController = vc;
//[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(gotoNumViewB) userInfo:nil repeats:NO];
}
//
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}
UILocalNotification * localNotif=[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if( !localNotif )
{
/*
{
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"ggggggg" message:@"" delegate:nil cancelButtonTitle:@"" otherButtonTitles:@"", nil];
[alert show];
}
*/
UILocalNotification * curNot = [AlarmOpt getCurrentNot];
if(curNot )
{
NSLog(@"进入前台-开启闹钟");
[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(handleNotifiction:) userInfo:curNot repeats:NO];
}
else
{
[AlarmOpt startAlarm];
//
[RFRateMe showRateAlertAfterTimesOpened:5];
}
}
else
{
/*
{
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"hhhhhhh" message:localNotif.soundName delegate:nil cancelButtonTitle:@"" otherButtonTitles:@"", nil];
[alert show];
}
*/
NSLog(@"开机启动-开启闹钟");
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(handleNotifiction:) userInfo:localNotif repeats:NO];
}
//
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//
[self.window makeKeyAndVisible];
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[tickTimer invalidate];
tickTimer = nil;
tickTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(tick) userInfo:nil repeats:YES];
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){
NSLog(@"over 1");
}];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
NSLog(@"进入前台");
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(delayEnterFor) userInfo:nil repeats:NO];
}
-(void)delayEnterFor
{
UILocalNotification * curNot = [AlarmOpt getCurrentNot];
if(curNot )
{
NSLog(@"进入前台-开启闹钟");
[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(handleNotifiction:) userInfo:curNot repeats:NO];
}
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
-(void)gotoShakeView:(UILocalNotification*)noti
{
//ShakeViewController * shakeVC = nil;
shakeVC = nil;
shakeVC = [[ShakeViewController alloc]initWithNibName:@"ShakeViewController" bundle:nil];
shakeVC.locationNoti = noti;
shakeVC.view.frame = [UIScreen mainScreen].bounds;
[self.window.rootViewController.view addSubview:shakeVC.view];
}
-(void)gotoNumView:(UILocalNotification*)noti
{
//NumViewController * numVC = nil;
numVC = nil;
numVC = [[NumViewController alloc]initWithNibName:@"NumViewController" bundle:nil];
numVC.locationNoti = noti;
numVC.view.frame = [UIScreen mainScreen].bounds;
[self.window.rootViewController.view addSubview:numVC.view];
}
-(void)gotoBiHuaView:(UILocalNotification*)noti
{
//BIHuaViewController * biVC = nil;
biVC = nil;
biVC = [[BIHuaViewController alloc]initWithNibName:@"BIHuaViewController" bundle:nil];
biVC.locationNoti = noti;
biVC.view.frame = [UIScreen mainScreen].bounds;
[self.window.rootViewController.view addSubview:biVC.view];
}
-(void)gotoVoiceView:(UILocalNotification*)noti
{
//VoiceViewController * voiVC = nil;
voiVC = nil;
voiVC = [[VoiceViewController alloc]initWithNibName:@"VoiceViewController" bundle:nil];
voiVC.locationNoti = noti;
voiVC.view.frame = [UIScreen mainScreen].bounds;
[self.window.rootViewController.view addSubview:voiVC.view];
}
-(void)handleNotifiction:(NSTimer*)timer
{
UILocalNotification * noti = [timer userInfo];
if( !noti || _bInCloseAlarm )
{
return;
}
NSData * data = [noti.userInfo objectForKey:ALARM_INFO_KEY];
AlarmInfo * info = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if( info )
{
_bInCloseAlarm = YES;
NSLog(@"======接到通知了=========");
if( [info.stopType isEqualToString:ALARM_STOP_TYPE_SHAKE])
{
[self gotoShakeView:noti];
}
else if( [info.stopType isEqualToString:ALARM_STOP_TYPE_NUM])
{
[self gotoNumView:noti];
}
else if( [info.stopType isEqualToString:ALARM_STOP_TYPE_BIHUA])
{
[self gotoBiHuaView:noti];
}
else if( [info.stopType isEqualToString:ALARM_STOP_TYPE_BLOW])
{
[self gotoVoiceView:noti];
}
}
}
- (void)tick
{
NSLog(@"tick:%f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
//
if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 61.0)
{
//
if( !audioPlayer )
{
NSError *error = nil;
NSString * str = [[NSBundle mainBundle]pathForResource:@"empty" ofType:@"mp3"];
NSURL * url = [NSURL fileURLWithPath:str];
audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
[audioPlayer prepareToPlay] ;
}
[audioPlayer play];
[NSThread sleepForTimeInterval:1];
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){
NSLog(@"over 2");
}];
}
}
IOS 通知 alarm 记录的更多相关文章
- iOS 通知观察者的被调函数不一定运行在主线程
Tony in iOS | 08/08/2013 iOS 通知观察者的被调函数不一定运行在主线程 今天修复Bug时候发现的一个小细节,记录下. 问题描述 事情是这样的:我在A视图(UITableVie ...
- iOS通知的整理笔记
iOS通知用于高耦合界面的传值确实方便快捷. 需要实现模态弹出的视图控制器上,有一个视图控制器可以导航.这必定要将这个视图控制器的导航视图控制器naVC.view添加到模态弹出的视图控制器presen ...
- iOS开发之记录用户登录状态
iOS开发之记录用户登录状态 我们知道:CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登陆状态.例如微信 ...
- iOS 通知的变化ios9-10,新功能展示
二.新功能展示 1 使用 /iOS通知新功能玩法 2. 全面 iOS10里的通知与推送详情 一.变化 四.Notification(通知) 自从Notification被引入之后,苹果就不断的 ...
- IOS开发之记录用户登陆状态,ios开发用户登陆
IOS开发之记录用户登陆状态,ios开发用户登陆 上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreDa ...
- aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能
aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能
- iOS通知中心
iOS通知中心 它是iOS程序内部的一种消息广播机制,通过它,可以实现无引用关系的对象之间的通信.通知中心他是基于观察者模式,它只能进行程序内部通信,不能跨应用程序进程通信. 当通知中心接受到消息后会 ...
- delphi IOS 通知 TNotification
delphi IOS 通知 TNotification http://blogs.embarcadero.com/ao/2013/05/01/39450 TNotification http://d ...
- iOS 通知扩展插件
iOS 通知扩展插件 目录 iOS 通知扩展插件 Notification Service Extension 新建一个target 代码实现 注意事项 UINotificationConentExt ...
随机推荐
- POJ1328Radar Installation
http://poj.org/problem?id=1328 题的大意就是说在海里有小岛,坐标位置会给出,需要岸边的雷达覆盖所有的小岛,但雷达的覆盖范围有限,所以,需要最少的雷达覆盖所有的小岛,但若是 ...
- [SharePoint 2013 入门教程 3 ] 排版第一个网站集,网站
我们创建了一个TEST网站集,如果你觉得太丑,怎么办,我们一起来给它整整容吧. 点击页面--> 编辑页面 我们现在就可以在页面上添加各种部件,进行布局排版.
- mysql怎样建表及mysql优化
1.符合数据库三范式 2.字段选择合适的数据类型 3.注意表之间的联系,一对多,多对多,一对一 4.拆分表,把不常用的字段单独成表. 5.建立索引,哪些字段建立索引?建立索引的原则?最左前缀原则,wh ...
- 一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境(图文并茂,非常清楚)
http://blog.csdn.net/litingli/article/details/5950962
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) { return i1 + i2;//如果不写return返回 ...
- spring 定时任务的 执行时间设置规则(转)
spring 定时任务的 执行时间设置规则 单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运 ...
- Bitmap 和Drawable 的区别
Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...
- 转:Servlet的url匹配以及url-pattern详解
Servlet是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet中的u ...
- Android HandlerThread 使用
HandlerThread 继承了 Thread,添加了 looper,queue 的支持.可以为 Handler 提供线程服务,并可对 执行的任务进行简单的管理. Handler 默认工作在主线程, ...
- Linux下拆分大文件
linux split 命令 功能说明:切割文件. 语 法:split [--help][--version][-<行数>][-b <字节>][-C <字节>][- ...