las - que son actualizaciones en segundo plano iphone
iOS: mantener la aplicaciĆ³n en ejecuciĆ³n en segundo plano (7)
¿Cómo mantengo mi aplicación ejecutándose en segundo plano? ¿Tendría que hacer jailbreak a mi iPhone para hacer esto? Solo necesito esta aplicación para verificar algo de Internet en cada intervalo establecido y notificar cuando sea necesario, para mi propio uso.
Encontré una manera de mantener la aplicación funcionando en segundo plano jugando al silencio.
Asegúrese de que ha seleccionado la reproducción de audio en los modos de fondo
Además, no utilice este método durante mucho tiempo, ya que consume recursos de CPU y batería, pero creo que es una forma adecuada de mantener la aplicación activa durante unos minutos.
Simplemente crea una instancia de SilencePlayer
, llama a play()
y luego stop()
cuando hayas terminado.
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)
}
}
Probado en iOS 10 y Swift 4
Sé que esta no es la respuesta a su pregunta, pero creo que es una solución.
¿Esto supone que está intentando verificar algo o obtener datos de Internet de forma regular?
Cree un servicio que compruebe Internet en cada intervalo establecido para lo que quiera saber, y cree una notificación de inserción para avisarle si el servidor está inactivo, o lo que sea que esté intentando monitorear haya cambiado de estado. Solo una idea.
Sí, no hay necesidad de jailbreak. Consulte la sección "Implementación de tareas en segundo plano de larga ejecución" de este documento de Apple .
Desde el documento de Apple: Declarar las tareas en segundo plano admitidas de tu aplicación
El soporte para algunos tipos de ejecución en segundo plano debe ser declarado por adelantado por la aplicación que los utiliza. Una aplicación declara soporte para un servicio utilizando su archivo Info.plist. Agregue la clave UIBackgroundModes a su archivo Info.plist y establezca su valor en una matriz que contenga una o más de las siguientes cadenas: (vea la documentación de Apple en el enlace mencionado anteriormente).
Sí, puedes hacer algo como esto. Para eso necesitas establecer una entrada en info.plist para decirle a os que mi aplicación se ejecutará en segundo plano. He hecho esto mientras quería pasar la ubicación del usuario después de una marca de tiempo particular al servidor. Para eso he establecido "Modos de fondo requeridos" en "Registros de aplicación para actualizaciones de ubicación".
Puede escribir un controlador de tipo UIBackgroundTaskIdentifier.
Supongo que esto es lo que requieres
Cuando una aplicación de iOS pasa al segundo plano, ¿se detienen las tareas prolongadas?
Descarga de fondo de la aplicación iOS
Esto podría ayudarte ...
Disfruta de la codificación :)
Usa notificaciones locales para hacer eso. Pero esto no se verificará cada vez. Tendrá que establecer una hora en la que verificará su evento específico, puede acortarlo reduciendo su espacio de tiempo. Lea más sobre notificaciones locales para saber cómo lograr esto en:
Ya puede hacer esto en el método applicationDidEnterBackground