如何让我的应用程序在后台运行? 我是否必须越狱我的iPhone才能做到这一点?我只需要这个应用程序每隔一定时间间隔从互联网上检查一下,并在需要时通知我自己使用。
答案 0 :(得分:19)
是的,无需越狱。从Apple查看此文档的“实施长时间运行的后台任务”部分。
来自Apple的文档: 声明应用程序支持的后台任务
必须由使用它们的应用程序事先声明对某些类型的后台执行的支持。应用程序使用其Info.plist文件声明对服务的支持。将UIBackgroundModes键添加到Info.plist文件中,并将其值设置为包含以下一个或多个字符串的数组:(请参阅上面提到的链接中的Apple文档。)
答案 1 :(得分:5)
使用本地通知执行此操作。但这不会每次检查。您必须设置检查特定事件的时间,您可以通过缩短时间来缩短时间。阅读更多有关本地通知的信息,了解如何实现这一目标:
答案 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方法
中执行此操作