ver son segundo que plano las escuchar como aplicaciones actualizaciones actualizacion actividad abiertas iphone objective-c ios xcode4.3 background-process

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.




Ya puede hacer esto en el método applicationDidEnterBackground