ios后台


挂起状态

操作系统尽可能久地保持挂起的应用程序在内存中一段时间,仅仅在空闲内存不足的时候才移除他们。保留在内存中意味着接下来你的程序会以更快的速度启动,同时,处于挂起状态意味着你的程序不会过快地消耗电量。

查看是否支持多任务

  应用程序必须准备好应对多任务机制(因此,后台执行)不可用的情况。即使运行在iOS 4及以后的系统中,设备依然可能不支持多任务机制,而且iOS 3及更早的系统不支持多任务机制。如果你的应用程序需要兼容运行在这些更早的iOS系统中,必须准备好在没有多任务的情况下运行。
     如果多任务机制的存在会影响到你的应用程序的行为,在执行相关任务前,检查 UIDevice 类的 multitaskingSupported 属性来判断系统是否支持多任务。当然,你的系统必须编译在iOS SDK 4以以上,相关代码如下所示。检查这个属性来允许你的应用程序继续运行在不支持多任务的更早的系统中。
UIDevice* device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
   backgroundSupported = device.multitaskingSupported;

在后台执行有限时间长度的任务

 被移到后台的应用程序可以请求一个额外的时间来完成一些重要的"最后一分钟"任务。请求后台执行时间,需要调用 UIApplication类 beginBackgroundTaskWithExpirationHandler:  方法。如果你的应用程序在任务执行过程中被移到后台,或者你的应用程序已经在后台,这个方法会延时应用程序的挂起。这对正在执行重要任务,如向磁盘写用户数据或者从网络服务器下载一个重要文件。
     使用 beginBackgroundTaskWithExpirationHandler: 方法的方式是在开始你需要保护的任务之前。每一次调用这个方法都必须对应地调用 endBackgroundTask: 方法来标记任务结束的地方。 因为应用程序仅被给予有限的时间来完成后台任务,你必须在时间结束前调用这个方法;否则操作系统会终止你的应用程序。为了避免被终止,你也可以在开始任务时提供一个到期处理回掉并在其中调用   endBackgroundTask: 方法。(你可以使用 UIApplication 类的 backgroundTimeRemaining 这个属性来知道还有多少剩余时间。 )

  重要:  一个应用可以有任意数量的任务在同一时间运行。每次你开始一个任务, beginBackgroundTaskWithExpirationHandler:  方法会为该任务 返回一个唯一的标示符。你必须在任务时间结束是传递同一个标示符给 endBackgroundTask: 方法。
下面一段代码显示了当你的应用程序被移到后台的时候如何开始一个long-running任务。在这个例子中,请求开始一个后台任务包括了一个到期处理回调来避免该任务运行太久。这个任务接下来被提交到一个异步执行的调度队列中,这样,applicationDidEnterBackground: 方法可以正常返回。这里使用blocks简化了需要维持一些变量的代码,如后台任务的标示符。这里的bgTask变量是一个类成员变量。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
 
    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
        // Do the work associated with the task, preferably in chunks.
 
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS上的AVAudioPlayer提供了一种方便的方式来进行音频播放,包括后台播放。在后台播放音频时,我们需要遵循特定的设置和步骤。 首先,我们需要在应用程序的Capabilities选项卡中启用后台模式。在Xcode中找到应用程序的Targets,然后点击Capabilities选项卡,将“Background Modes”开关打开,并勾选“Audio, AirPlay, and Picture in Picture”。 然后,在代码中设置AVAudioSession的类别为AVAudioSessionCategoryPlayback。这可以通过以下代码实现: ``` import AVFoundation let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(.playback, options: .defaultToSpeaker) try audioSession.setActive(true) } catch { print("设置音频话类别失败: \(error)") } ``` 接下来,我们需要在应用程序的AppDelegate类中创建一个后台任务。当我们按下Home键离开应用程序时,这个后台任务将被激活。 ``` func applicationDidEnterBackground(_ application: UIApplication) { backgroundTask = application.beginBackgroundTask(withName: "PlayAudioInBackground", expirationHandler: { application.endBackgroundTask(self.backgroundTask) self.backgroundTask = UIBackgroundTaskIdentifier.invalid }) } ``` 然后,创建一个AVAudioPlayer实例来播放音频文件。我们可以使用它的`play`方法来开始播放音频。 ``` let audioURL = Bundle.main.url(forResource: "audio", withExtension: "mp3") do { audioPlayer = try AVAudioPlayer(contentsOf: audioURL!) audioPlayer.prepareToPlay() audioPlayer.play() } catch { print("无法播放音频文件: \(error)") } ``` 在音频播放完成或者我们不再需要后台任务时,需要结束后台任务。 ``` func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if flag { // 当音频播放完成时调用 audioPlayer.stop() UIApplication.shared.endBackgroundTask(backgroundTask) backgroundTask = UIBackgroundTaskIdentifier.invalid } } ``` 通过以上设置,我们可以确保AVAudioPlayer在应用程序进入后台时继续播放音频。但需要记住,长时间背景播放可能影响设备的电池寿命,所以请确保仅在必要时使用后台播放功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值