一:了解multitasking
background apps(可以在后台运行的任务):
1:play audio
2:get location
3:voip stream
4:request time to finish
5: create notifications
二:多任务生命周期
1:程序加载成功
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2:程序将要失去活跃状态
- (void)applicationWillResignActive:(UIApplication *)application
3:程序已经进入后台运行
- (void)applicationDidEnterBackground:(UIApplication *)application
4:程序将要进入前台运行
- (void)applicationWillEnterForeground:(UIApplication *)application
5:程序进入活跃状态
- (void)applicationDidBecomeActive:(UIApplication *)application
6:程序退出
- (void)applicationWillTerminate:(UIApplication *)application
从启动到转入后台,从后台转入前台,退出,生命周期函数调用顺序
1->5->2->3->4->5->6
三:转入后台后请求一段时间完成操作
UIBackgroundTaskIdentifier backgroundTask;
- (void)applicationDidEnterBackground:(UIApplication *)application {
// tell the OS you're about to begin a background task that may need time to finish
backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
// 如果超时这个block将被调用
dispatch_async(dispatch_get_main_queue(), ^{
if (backgroundTask != UIBackgroundTaskInvalid)
{
// do whatever needs to be done
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}
});
}];
// Start the long-running task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work!
[NSThread sleepForTimeInterval:5];
NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
[NSThread sleepForTimeInterval:5];
NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
[NSThread sleepForTimeInterval:5];
NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);
// done!
// call endBackgroundTask - should be executed back on
// main thread
dispatch_async(dispatch_get_main_queue(), ^{
if (backgroundTask != UIBackgroundTaskInvalid)
{
// if you don't call endBackgroundTask, the OS will exit your app.
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}
});
});
NSLog(@"Reached the end of ApplicationDidEnterBackground - I'm done!");
}
四:本地消息
1:创建一个本地消息
-(IBAction) scheduleNotification {
UILocalNotification *local = [[UILocalNotification alloc] init];
// create date/time information
local.fireDate = [NSDate dateWithTimeIntervalSinceNow:15];
local.timeZone = [NSTimeZone defaultTimeZone];
// set notification details
local.alertBody = @"Missing you already!";
local.alertAction = @"View";
// set the badge on the app icon
local.applicationIconBadgeNumber = 1;
// Gather any custom data you need to save with the notification
NSDictionary *customInfo =
[NSDictionary dictionaryWithObject:@"ABCD1234" forKey:@"yourKey"];
local.userInfo = customInfo;
// Schedule it!
[[UIApplication sharedApplication] scheduleLocalNotification:local];
[local release];
}
2:delegate 处理方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[window addSubview:viewController.view];
[window makeKeyAndVisible];
//程序启动是检查是否有UILocalNotification,如果有跳出提示框
// reset badge
application.applicationIconBadgeNumber = 0;
// If the app was closed, and we launched from the notification
UILocalNotification *local =
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (local) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"You came back! (App was closed)"
message:@"Nice to see you again!" delegate:nil
cancelButtonTitle:@"Okay" otherButtonTitles:nil];
[alert show];
[alert release];
}
return YES;
}
//如果程序完全退出,此方法不会被调用,而是先调用didFinishLaunchingWithOptions把程序启动起来。如果该程序在后台运行收到消息时直接调用该方法
- (void)application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)local {
// reset badge number
application.applicationIconBadgeNumber = 0;
if (local) {
// get custom info from dictionary
NSString *customInfo = [local.userInfo objectForKey:@"yourKey"];
//
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"You came back! (App was running)"
message:customInfo delegate:nil
cancelButtonTitle:@"Okay" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
五:后台播放音乐
1:读取文件
- (void)viewDidLoad {
[super viewDidLoad];
self.playPauseButton.titleLabel.text == @"play";
// grab the path to the caf file
NSString *soundFilePath =
[[NSBundle mainBundle] pathForResource: @"Rainstorm"
ofType: @"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
// create a new AVAudioPlayer initialized with the URL to the file
AVAudioPlayer *newPlayer =
[[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
error: nil];
[fileURL release];
// set our ivar equal to the new player
self.player = newPlayer;
[newPlayer release];
// preloads buffers, gets ready to play
[player prepareToPlay];
// set delegate so we can get called back when the sound has finished playing
[player setDelegate: self];
//重要的两行
// set category of audio
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
// announce that we want to hook up to remote UI events
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}
2:重写canBecomeFirstResponder 方法,使改view 可以成为第一响应者
-(BOOL) canBecomeFirstResponder {
return YES;
}
3:显示view时,设置为第一响应者
-(void) viewDidAppear:(BOOL)animated {
[self becomeFirstResponder];
}
4:实现remoteControlReceivedWithEvent方法使程序接收 iphone 自动音乐控制事件
-(void) remoteControlReceivedWithEvent:(UIEvent *)event {
switch (event.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:
[self playPause];
default:
break;
}
}
5:info.plist 设置,可以设置多种形式
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
六:NSUserDefaults 问题
如果程序在后台挂起,在转入到前台后不会调用viewDidLoad 方法,所以要在viewDidLoad 方法里面注册UIApplicationWillEnterForegroundNotification ,调用loadSettings
-(void) loadSettings: (NSNotification *) notification {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults synchronize];
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[self loadSettings:nil];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(loadSettings:)
name:UIApplicationWillEnterForegroundNotification
object:nil];
[super viewDidLoad];
}
七:去除后台运行inof.list
application dose not run in background 设置为 true
分享到:
相关推荐
在iOS 14中,Apple引入了许多新特性,这些特性为开发者提供了更多创新和改进用户体验的机会。以下是一些关键的iOS 14新特性及Swift中的适配要点: 1. **Widget**: iOS 14引入了小部件,允许开发者创建自定义的、可...
4. 将新创建的手势关联到“多任务”(Multitasking)操作,这样当执行该手势时,就会触发多任务界面。 5. 为了实际启用多任务手势,可能还需要在系统设置中进行额外的调整,例如修改General.plist文件中的相关参数。...
### 开发者所需掌握的iOS 10 SDK新特性详解 #### 一、概述 自从2007年iPhone首次亮相以来,iOS的发展历程可谓是一段飞速前进的历史。每一代iOS系统的推出都伴随着一系列令人瞩目的创新和技术突破。进入iOS 10时代...
4. **多任务处理**:苹果引入了全新的多任务管理机制,允许应用在后台进行数据同步和预加载,提高了效率。用户可以在应用切换器中查看所有打开的应用并关闭不需要的。 5. **AirDrop**:iOS 7引入了AirDrop功能,...
在iOS系统中,多任务切换界面的设计一直备受用户喜爱,特别是iOS9引入的卡片流式切换方式,它为用户提供了直观、流畅的多任务管理体验。这个名为"仿iOS9多任务切换的卡片流"的开源项目,目标是复现这一功能,并允许...
多线程编程是优化应用性能的关键,通过GCD(Grand Central Dispatch)或Operation Queues,开发者可以高效地处理后台任务,保证界面的流畅性。Push Notifications则允许应用在后台向用户发送消息,增加用户参与度。...
在iOS系统中,多任务处理是一项关键特性,它允许应用程序在后台执行特定任务,从而提供更流畅、连贯的用户体验。iOS 7引入了若干多任务处理技术,其中之一就是Background Fetch,这是一种高效的方式,让应用能在系统...
iOS12中,开发者可以添加更多的动作到通知中,让用户可以直接在通知界面执行预设的操作,比如回复邮件、标记任务完成等,而不需要打开应用。这些动作可以通过`UNNotificationAction`类进行配置,让通知变得更加实用...
1. **Swift 4新特性**: - ** Codable协议**:Swift 4引入了编码解码协议,简化了JSON和Property List的数据交换。 - **类型推断**:进一步优化,减少了显式类型声明的需求。 - **泛型优化**:提升了泛型操作的...
《iOS组件与框架——iOS SDK高级特性剖析》的源码包包含了丰富的开发示例,旨在帮助开发者深入理解iOS系统的高级特性。在这个压缩包中,你可以找到22个章节的源代码,涵盖了书中大部分内容,遗憾的是,第11章、14...
《高清彩版 RayWenderlich iOS 11 by Tutorials Learning the new iOS APIs with Swift 4》是一本详细介绍如何使用Swift 4来学习和掌握iOS 11新特性的教程书籍。iOS 11是苹果公司在2017年发布的重要版本之一,带来了...
iOS 4是苹果公司为iPhone、iPad和iPod touch设备推出的操作系统版本,它带来了许多新特性和改进,包括多任务处理、Game Center、iAd广告平台、FaceTime视频通话以及更强大的开发者工具等。这些新功能为开发者提供了...
这本书详细介绍了iOS 4的各种新特性和功能,包括多任务处理、游戏中心、本地通知、文件系统访问以及UI设计原则等。 一、多任务处理 iOS 4引入了多任务处理,让应用程序可以在后台运行,提高了用户体验。开发者可以...
iOS 9 引入了对iPad多任务处理的支持,Slide Over功能允许用户快速在应用之间切换,而Split View则允许两个应用同时并排显示,提高了生产力和多任务处理能力。这对于iPad Air 2这样的设备来说尤其重要,因为它们...
以上是iOS 10在通知推送方面的主要新特性,它们为开发者提供了更多灵活性和创新空间,同时也提升了用户接收和互动通知的体验。通过熟练掌握这些新功能,开发者可以创建出更加个性化和高效的移动应用。
5. **多任务处理**:iOS 5对多任务处理进行了优化,使得应用程序在后台也能执行特定任务,如音乐播放、位置更新和下载。书中将涵盖如何利用多任务特性来增强应用的功能。 6. **其他技术**:除了上述核心特性外,书...
本文将详细讲解iOS后台多任务的几个关键特性:后台任务(Background Task)、后台数据获取(Background Fetch)、静默远程通知(Silent Remote Notifications)以及NSURLSession的后台会话(BackgroundSession)。...
9. **Multitasking**: 在iPad上,iOS 8引入了Slide Over和Split View多任务模式。开发者可以利用`UISplitViewController`和`UIPresentationController`来优化应用在多任务环境下的表现。 10. **WebKit**: 新的...