IOS中的本地通知和后台任务


目录(?)[+]

概述


苹果公司为了确保IOS设备能在任何时候都能快速响应,保证用户体验,对后台运行的应用程序进行了限制。在IOS4以后,对第三方应用程序开放了后台处理,但在开放后台处理面很谨慎,只对一组用户经常遇到的任务开放。
IOS支持的后台处理主要有四种类型:

1.挂起


暂停执行代码,保留当前状态。用户返回应用程序时看起来一直在运行,实际上为了不让其占系统资源,任务都停止了。

2.本地通知(local notification)


本地通知与推送通知类似,但是由您编写的应用程序生成,这些通知可显示消息,播放声音甚至更新应用程序的徽章数值。

3.任务特定的后台处理


IOS以优雅的方式处理了一些用户需要的特定任务,比如后台继续播放音乐,或者定位,或者VoIP。可在项目的plist文件中的Required Background Modes中添加。

4.长时间运行的任务的任务完成


要使用任务完成,可在应用程序中对任务进行标记,指出该任务结束后才能安全的挂起应用,一般包括文件的上传,下载,大量计算等等。APPLE对这样标记的任务规定有10分钟来完成其操作,一般情况下这都很充足,10分钟后应用将挂起。

实现本地通知和任务完成的Demo



点击Alert Me 实现即使在关闭应用的情况下,过30秒进行本地通知
点击BackgroundCount 实现挂起的后台处理
两个任务完成时都有声音提醒

准备工作


[cpp]  view plain copy
  1. #import <UIKit/UIKit.h>  
  2. //播放系统声音的框架  
  3. #import <AudioToolbox/AudioToolbox.h>  
  4.   
  5. @interface ViewController : UIViewController  
  6.   
  7. @property (weak, nonatomic) IBOutlet UILabel *countLabel;  
  8.   
  9. - (IBAction)doCount:(id)sender;  
  10. - (IBAction)doAlert:(id)sender;  
  11.   
  12. @end  

.m文件中声明实例

[cpp]  view plain copy
  1. @interface ViewController ()  
  2. {  
  3.     int _count;  
  4.     NSTimer *_timer;  
  5.     UIBackgroundTaskIdentifier _task;  
  6.     SystemSoundID _soundID;  
  7.     UILocalNotification *_localNotification;  
  8. }  

初始化

[cpp]  view plain copy
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.   
  5.     _count = 0;  
  6.       
  7.     NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];  
  8.     AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:soundPath], &_soundID);  
  9.       
  10.     _localNotification = [[UILocalNotification alloc] init];  
  11. }  


实现本地通知


[cpp]  view plain copy
  1. - (IBAction)doAlert:(id)sender {  
  2.     //取消其他本地通知  
  3.     [[UIApplication sharedApplication] cancelAllLocalNotifications];  
  4.     //设置属性,徽章数字,通知时间,时区,声音,间隔,内容等  
  5.     _localNotification.applicationIconBadgeNumber = 1;  
  6.     _localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:30];  
  7.     _localNotification.timeZone = [NSTimeZone defaultTimeZone];  
  8.     _localNotification.soundName = @"alertsound.wav";  
  9.     _localNotification.repeatInterval = NSDayCalendarUnit;  
  10.     _localNotification.alertBody = @"我是横幅提醒!";  
  11.       
  12.     [[UIApplication sharedApplication] scheduleLocalNotification:_localNotification];  
  13. }  

通知时效果



当然也可以在每次进入前台的时候把徽章数字清零

[cpp]  view plain copy
  1. - (void)applicationDidBecomeActive:(UIApplication *)application  
  2. {  
  3.     [UIApplication sharedApplication].applicationIconBadgeNumber = 0;  
  4. }  


实现后台任务完成


[cpp]  view plain copy
  1. - (IBAction)doCount:(id)sender {  
  2.     _task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{  
  3.           
  4.     }];  
  5.     //对计时器参数设置,调用countUp方法  
  6.     _timer = [NSTimer scheduledTimerWithTimeInterval:0.1  
  7.                                               target:self  
  8.                                             selector:@selector(countUp)  
  9.                                             userInfo:nil  
  10.                                              repeats:YES];  
  11. }  
  12. //计数到100时停止结束,播放声音提醒。  
  13. - (void)countUp  
  14. {  
  15.     if (_count == 100) {  
  16.         AudioServicesPlaySystemSound(_soundID);  
  17.           
  18.         [_timer invalidate];  
  19.         _timer = nil;  
  20.         [[UIApplication sharedApplication] endBackgroundTask:_task];  
  21.     } else {  
  22.         _count++;  
  23.         self.countLabel.text = [NSString stringWithFormat:@"%d", _count];  
  24.     }  
  25. }  

效果


开始计数了,应用退到后台,很快就有声音提示 计数完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值