iOS:让应用程序在后台运行

Den*_*nis 21 iphone objective-c background-process ios xcode4.3

如何让我的应用程序在后台运行?我是否必须越狱我的iPhone才能做到这一点?我只需要这个应用程序每隔一定时间间隔从互联网上检查一下,并在需要时通知我自己使用.

use*_*234 21

是的,不需要越狱.查看Apple提供的本文档的"实现长时间运行的后台任务"部分.

来自Apple的文档:声明应用程序支持的后台任务

必须由使用它们的应用程序事先声明对某些类型的后台执行的支持.应用程序使用其Info.plist文件声明对服务的支持.将UIBackgroundModes键添加到Info.plist文件中,并将其值设置为包含以下一个或多个字符串的数组:(请参阅上面提到的链接中的Apple文档.)


Saa*_*aad 5

使用本地通知执行此操作.但这不会每次检查.您必须设置检查特定事件的时间,您可以通过缩短时间来缩短时间.阅读更多有关本地通知的信息,了解如何实现此目标:

http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html

  • 不,如果应用程序在后台运行,则本地通知所做的就是向用户显示该通知。除非用户单击通知将应用程序带到前台,否则您无法执行任何实际工作。 (2认同)

Mru*_*nal 5

我想这就是你所需要的

当iOS应用程序进入后台时,是否会暂停冗长的任务?

iOS应用程序背景下载

这可能对你有所帮助......

享受编码:)


Dim*_*ira 5

我找到了一种方法,通过播放静音来保持应用程序在后台运行

确保您选择了后台模式下的音频播放

另外,不要长时间使用此方法,因为它会消耗 CPU 资源和电池电量,但我认为这是保持应用程序存活几分钟的合适方法。

只需创建一个实例SilencePlayerplay()然后调用stop(),完成后

import CoreAudio

public class SilencePlayer {
    private var audioQueue: AudioQueueRef? = nil
    public private(set) var isStarted = false

    public func play() {
        if isStarted { return }
        print("Playing silence")
        let avs = AVAudioSession.sharedInstance()
        try! avs.setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)
        try! avs.setActive(true)
        isStarted = true
        var streamFormat = AudioStreamBasicDescription(
            mSampleRate: 16000,
            mFormatID: kAudioFormatLinearPCM,
            mFormatFlags: kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked,
            mBytesPerPacket: 2,
            mFramesPerPacket: 1,
            mBytesPerFrame: 2,
            mChannelsPerFrame: 1,
            mBitsPerChannel: 16,
            mReserved: 0
        )
        let status = AudioQueueNewOutput(
            &streamFormat,
            SilenceQueueOutputCallback,
            nil, nil, nil, 0,
            &audioQueue
        )
        print("OSStatus for silence \(status)")
        var buffers = Array<AudioQueueBufferRef?>.init(repeating: nil, count: 3)
        for i in 0..<3 {
            buffers[i]?.pointee.mAudioDataByteSize = 320
            AudioQueueAllocateBuffer(audioQueue!, 320, &(buffers[i]))
            SilenceQueueOutputCallback(nil, audioQueue!, buffers[i]!)
        }
        let startStatus = AudioQueueStart(audioQueue!, nil)
        print("Start status for silence \(startStatus)")
    }

    public func stop() {
        guard isStarted else { return }
        print("Called stop silence")
        if let aq = audioQueue {
            AudioQueueStop(aq, true)
            audioQueue = nil
        }
        try! AVAudioSession.sharedInstance().setActive(false)
        isStarted = false
    }

}

fileprivate func SilenceQueueOutputCallback(_ userData: UnsafeMutableRawPointer?, _ audioQueueRef: AudioQueueRef, _ bufferRef: AudioQueueBufferRef) -> Void {
    let pointer = bufferRef.pointee.mAudioData
    let length = bufferRef.pointee.mAudioDataByteSize
    memset(pointer, 0, Int(length))
    if AudioQueueEnqueueBuffer(audioQueueRef, bufferRef, 0, nil) != 0 {
        AudioQueueFreeBuffer(audioQueueRef, bufferRef)
    }
}
Run Code Online (Sandbox Code Playgroud)

在 iOS 10 和 Swift 4 上测试