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

时间:2012-05-20 13:55:37

标签: iphone objective-c ios xcode4.3 background-process

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

7 个答案:

答案 0 :(得分:19)

是的,无需越狱。从Apple查看此文档的“实施长时间运行的后台任务”部分。

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

我想这就是你所需要的

When an iOS application goes to the background, are lengthy tasks paused?

iOS Application Background Downloading

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

享受编码:)

答案 3 :(得分:3)

我知道这不是你问题的答案,但我认为这是一个解决方案。

这假设您尝试检查某些内容或定期从互联网上获取数据?

创建一个服务,在每个设置的时间间隔内检查互联网,了解您想知道的内容,并创建推送通知以提醒您,服务器是否已关闭,或者您尝试监控的任何内容已更改状态。只是一个想法。

答案 4 :(得分:3)

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

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

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

只需创建一个SilencePlayer的实例,完成后先调用play(),然后再调用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)
    }
}

在iOS 10和Swift 4上测试

答案 5 :(得分:1)

是的,你可以做这样的事情。为此你需要在info.plist中设置条目告诉os我的应用程序将在后台运行。我已经这样做了,而我想在特定时间戳后将用户的位置传递给服务器。为此,我将“必需的后台模式”设置为“应用程序寄存器以进行位置更新”。

您可以编写UIBackgroundTaskIdentifier类型的处理程序。

答案 6 :(得分:-2)

您已经可以在applicationDidEnterBackground方法

中执行此操作