IOS equivalente al servicio de Android?

Así que con iOS 7 que soporta un modo de fondo más amplio, ¿es posible finalmente tener un equivalente a Android Service en iOS?

Lo que estoy después es esencialmente ejecutar la aplicación A en segundo plano y tener una o más aplicaciones B y C hablar con esa aplicación (sin mostrar la interfaz gráfica de usuario de la aplicación A).

Tenga en cuenta que el uso de la conectividad y notificaciones push puede no ser una opción, aunque esta es la forma recomendada de hacerlo. ¿Algunas ideas?

4 Solutions collect form web for “IOS equivalente al servicio de Android?”

EDIT: No funciona como se esperaba. Vea esta respuesta para la mejor solución: Push Notifications


EDIT: La siguiente solución sólo es útil mientras el usuario está en la aplicación para mantenerla sincronizada.

No hay manera de realizar tareas en el fondo de forma permanente, pero puede utilizar las tareas de longitud finita para hacer eso, al hacer una longitud finita, esto se ejecutará siempre mientras la aplicación esté activa, pero al hacer clic en el botón Inicio, Ios le da sólo 10 minutos para realizar su tarea e invalidarla, pero le da la oportunidad de hacer un 'bloque de manejador de invalidate' donde puede hacer las últimas acciones antes de terminar definitivamente.

Por lo tanto, si utiliza ese bloque de controlador para llamar a una tarea de longitud finita en otro momento, puede simular un servicio ejecutando una tarea durante 10 minutos y cuando su final, llame a su mismo para otros 10 minutos y, en consecuencia.

Utilizo eso en un proyecto que crea una interfaz 'Servicio'. Te dejo aquí el código:


  • Servicio.h

// // Service.h // Staff5Personal // // Created by Mansour Boutarbouch Mhaimeur on 30/09/13. // Copyright (c) 2013 Smart & Artificial Technologies. All rights reserved. // #import <Foundation/Foundation.h> @interface Service : NSObject @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; @property (nonatomic) NSInteger frequency; @property (nonatomic, strong) NSTimer *updateTimer; - (id) initWithFrequency: (NSInteger) seconds; - (void) startService; - (void) doInBackground; - (void) stopService; @end 

  • Servicio m

 // // Service.m // Staff5Personal // // Created by Mansour Boutarbouch Mhaimeur on 30/09/13. // Copyright (c) 2013 Smart & Artificial Technologies. All rights reserved. // #import "Service.h" @implementation Service @synthesize frequency; -(id)initWithFrequency: (NSInteger) seconds{ if(self = [super init]){ self.frequency = seconds; return self; } return nil; } - (void)startService{ [self startBackgroundTask]; } - (void)doInBackground{ //Español //Sobreescribir este metodo para hacer lo que quieras //English //Override this method to do whatever you want } - (void)stopService{ [self.updateTimer invalidate]; self.updateTimer = nil; [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; } - (void) startBackgroundTask{ self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:frequency target:self selector:@selector(doInBackground) userInfo:nil repeats:YES]; self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [self endBackgroundTask]; }]; } - (void) endBackgroundTask{ [self.updateTimer invalidate]; self.updateTimer = nil; [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; [self startBackgroundTask]; } @end 

Con esta clase realizo mis servicios, pero no lo pruebo por mucho tiempo. La mejor prueba i duró 16 horas en el simulador y todo funciona bien!

EDIT: Eso fue probado en el simulador, pero en el teléfono no funciona después de que la aplicación se ha terminado.

Les dejo un ejemplo:


 // SomeService.h @interface SomeService : Service @end // SomeService.m #import "SomeService.h" @implementation SomeService // The method to override - (void)doInBackground{ NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining); NSLog(@"Service running at %.1f seconds", [self getCurrentNetworkTime]); } // Your methods - (long) getCurrentNetworkTime{ return ([[NSDate date] timeIntervalSince1970]); } @end 

Y en el delegado de la aplicación o en el lugar donde necesite elevar el servicio, escriba la siguiente línea:

 Service myService = [[SomeService alloc] initWithFrequency: 60]; //execute doInBackground each 60 seconds [myService startService]; 

Y si necesita detenerlo:

 [myService stopService]; 

Puede haber explicado más de lo necesario, pero quiero mantenerlo claro para cualquiera! Espero su ayuda y lo siento por mi inglés.

No, no hay equivalente a un servicio de Android. El código de MansApps no funciona, al menos no en iOS7. Una llamada de [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; En el controlador de vencimiento sólo volverá cuando la aplicación vuelva al primer plano, es decir, la llamada de [self startBackgroundTask]; No se ejecutará cuando la aplicación permanezca en segundo plano.

He encontrado la solución mejor y estándar:

Notificaciones push

(Post original de Matthijs Hollemans, actualización de Ali Hafizji).

En iOS, las aplicaciones no pueden hacer mucho en segundo plano. Las aplicaciones sólo se les permite hacer un conjunto limitado de actividades para que la vida de la batería se conserva. Pero, ¿qué pasa si algo interesante ocurre y desea informar al usuario sobre esto, incluso si actualmente no está utilizando su aplicación? Por ejemplo, tal vez el usuario recibió un nuevo tweet, su equipo favorito ganó el juego, o su cena está lista. Dado que la aplicación no se está ejecutando actualmente, no puede comprobar estos eventos. Afortunadamente, Apple ha proporcionado una solución a esto. En lugar de que su aplicación compruebe continuamente los eventos o haga un trabajo en segundo plano, puede escribir un componente del servidor para hacer esto. Y cuando se produce un evento de interés, el componente del servidor puede enviar a la aplicación una notificación push ! Hay tres cosas que una notificación push puede hacer:

  • Mostrar un breve mensaje de texto
  • Reproducir un sonido breve
  • Establecer un número en una insignia en el icono de la aplicación

Enlace del tutorial: http://maniacdev.com/2011/05/tutorial-ios-push-notification-services-for-beginners

Básicamente, es imposible si su aplicación no implementa ninguna de las funcionalidades que se enumeran a continuación. Y apenas investigan tu aplicación antes de subirla a la tienda, necesitas justificar el uso de esos permisos

Esto es lo que Apple dice sobre eso:

Implementación de tareas de ejecución prolongada

Para las tareas que requieren más tiempo de ejecución para implementar, debe solicitar permisos específicos para ejecutarlos en segundo plano sin su suspensión. En iOS, sólo los tipos de aplicación específicos se permiten ejecutar en segundo plano:

  • Aplicaciones que reproducen contenido audible al usuario mientras está en segundo plano, como una aplicación de reproductor de música
  • Aplicaciones que graban contenido de audio mientras están en segundo plano
  • Aplicaciones que mantienen a los usuarios informados de su ubicación en todo momento, como una aplicación de navegación
  • Aplicaciones que admiten Voz sobre Protocolo de Internet (VoIP)
  • Aplicaciones que necesitan descargar y procesar nuevos contenidos regularmente
  • Aplicaciones que reciben actualizaciones periódicas de accesorios externos

Las aplicaciones que implementan estos servicios deben declarar los servicios que admiten y utilizar marcos de sistema para implementar los aspectos relevantes de esos servicios. Declarar los servicios permite al sistema conocer qué servicios utiliza, pero en algunos casos son los frameworks del sistema los que realmente impiden que su aplicación sea suspendida.

  • El servicio no se reinicia después de que "Clear Memory" + appWidget se bloquea
  • ¿Cómo actualizar un TextView en una actividad de un servicio en Android?
  • En Android: ¿Cómo llamar a la función de la actividad de un servicio?
  • Detectar el evento "botón de inicio presionado" en el servicio android que muestra una interfaz de usuario (similar a los cabezales de chat de Facebook)
  • ¿Puede existir un servicio de fondo sin su aplicación principal?
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • GCM de Android SERVICE_NOT_AVAILABLE
  • No puedo encontrar la causa de mi accidente con este seguimiento de pila
  • Grabar sonido Y reproducir sonido modulado En Android?
  • Obtener ubicación GPS a través de un servicio en Android
  • Android - Ejecutar en segundo plano - Service vs. standard java class
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.