Flutter: Flutter debería proporcionar una abstracción para la ejecución en segundo plano.

Creado en 2 may. 2016  ·  139Comentarios  ·  Fuente: flutter/flutter

A los clientes les gustaría ejecutar código dart como procesos en segundo plano tanto en iOS como en Android, para sincronizar datos cuando hay wifi disponible pero la aplicación no está abierta, etc.

@mpcomplete creó un proceso en segundo plano en Android para ejecutar código Dart para actualizar flutter. Pero no estoy al tanto de un paralelo en iOS.

Este problema rastrea el desarrollo de API en complementos o de otra manera. El soporte del motor para estas abstracciones se rastrea en https://github.com/flutter/flutter/issues/6192.

truckable wellbeing engine framework plugin new feature

Comentario más útil

Actualización rápida: la ejecución en segundo plano para iOS está implementada y lista para revisión (PR flutter/engine#5539). Una vez que eso aterrice, comenzaré a actualizar la ejecución en segundo plano de Android para tener una interfaz consistente y publicar un complemento de muestra. Se espera que todo esto esté listo para fin de mes.

Todos 139 comentarios

¿Debe escribirse el código que se ejecuta en segundo plano en Dart o en Java/Objective-C?

Esto surgió en el contexto de querer actualizar el modelo de datos local cuando la conectividad estuviera disponible. por ejemplo, mapas de metro/horas en las que puede entrar o salir de un metro. Entonces, creo que el objetivo sería que el código ejecutado fuera Dart para que no tuviera que tener un código de manipulación de modelo de datos separado para cada plataforma.

CC @kasperl; Hemos explorado muchas formas de ejecutar código en segundo plano en nuestros diversos objetivos, y tal vez se puedan extraer algunos aprendizajes de eso.

¿Tenemos algunos casos de uso de nuestros usuarios? El único que escuché fue "Queremos ejecutar algún código en el dispositivo, en respuesta a un mensaje push. Queremos sincronizar los datos en el dispositivo, incluso si la aplicación no está abierta".

Por lo general, está bastante restringido lo que una aplicación puede hacer en segundo plano, por lo que, en este caso, creo que podemos inspirarnos para los casos de uso a partir de ahí. Por ejemplo, aquí está el modelo de iOS:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Creo que este es el mismo error que el #6192, sí.

Agregar etiqueta de hoja y valor de hito de # 6192

@mravn-google @sigurdm ¡ algo en lo que pensar!

Asignación a Mikkel para una investigación muy inicial para comprender mejor la viabilidad y el costo.

Aquí hay una actualización de Leafy:

Debido a las limitaciones de las notificaciones de datos (es decir, notificaciones que requieren que la aplicación responda de alguna manera), Leafy se inclina hacia el uso de notificaciones de pantalla (es decir, notificaciones que se envían directamente a la pantalla del usuario sin la participación de la aplicación). El soporte para estos ya existe en Flutter.

Sin embargo, durante las conversaciones con otros equipos, surgió otro caso de uso: si desea admitir dispositivos portátiles o widgets [de pantalla de inicio] desde su aplicación, deberá escribir la interfaz de usuario en código nativo, ya que estas superficies aún no son compatibles con Flutter. Sin embargo, sería bueno poder "activar la aplicación y solicitar datos" para que la capa del modelo y la lógica empresarial se puedan compartir entre la aplicación Flutter y la aplicación portátil. Como nunca he escrito uno de estos, no estoy seguro de cómo las aplicaciones nativas existentes hacen esto, pero ciertamente parece un caso de uso válido para tareas en segundo plano.

Acabo de hablar con el autor de Flutter talk para Berlin DroidCon, y esta fue una de sus principales preguntas. "Cómo hacer esto, al estilo Flutter"

Para ser claros, actualmente es posible escribir procesos en segundo plano como parte de una aplicación que usa Flutter. Sin embargo, esos procesos solo pueden ejecutar código Obj-C/Swift o Java/Kotlin. Este error se trata de corregir la limitación en nuestro motor para permitir la ejecución de código Dart en estos procesos en segundo plano, así como posiblemente proporcionar una abstracción para permitir la programación de dicho trabajo en segundo plano desde Dart (probablemente pertenezca a un complemento una vez que FlutterView-necesita-a- se elimina la restricción de estar en pantalla).

https://github.com/flutter/flutter/issues/6192#issuecomment -258928555 analiza la limitación actual del motor y nuestra intención de resolverla. Para tu información @a-siva

Esto también está relacionado con (¿un duplicado de?) https://github.com/flutter/flutter/issues/5048.

Tenemos un caso de uso que no veo mencionado: realizamos un seguimiento de la ubicación cada 5 segundos y tenemos cierta otra información adjunta a ese evento, cuya lógica comercial se implementa en Dart. Si nuestro usuario trae otra actividad al primer plano, debemos mostrar una notificación persistente y continuar ejecutando ese código Dart cada 5 segundos.

Esto es un bloqueador para nosotros. Me interesaría escuchar cualquier solución alternativa que podamos implementar en este momento, ya que esto retrasará el envío.

Intentaría simplemente dejar el temporizador activo y ver qué sucede. No creo que sea confiable, pero nuestra aplicación también tiene un caso de uso de limpieza de caché única (15 minutos después de que la aplicación se haya puesto en segundo plano) y hemos visto que se ejecuta con éxito. Lo programamos mientras la aplicación se detiene en Dart. Algo como esto:

<strong i="6">@override</strong>
void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
        new Future.delayed(const Duration(seconds: 5), () => _doSomething());
    }
}

No funcionaría si:

  • El usuario elimina explícitamente la aplicación (por ejemplo, desde el conmutador de tareas).
  • La aplicación es eliminada por el sistema operativo debido a la presión de la memoria.
  • ¿En iOS? No creo que lo hayamos intentado, así que no dude en intentarlo e informarnos.

No estoy seguro de las contrapartes de iOS, pero en Android se podría crear un complemento de aleteo que inicie un servicio en primer plano, lo que le da al proceso una mayor prioridad y hace que sea menos probable que se elimine durante los tiempos de demanda de recursos. ¿Esto también le daría al temporizador Dart de larga duración una mejor oportunidad de supervivencia?

Sí, eso podría ayudar ya que su actividad (por lo tanto, su vista de aleteo) permanecerá activa. Todavía no estoy convencido de que tengamos la claridad suficiente para hacer un complemento.

Si el punto es admitir encuestas periódicas de información en segundo plano, podría ser mejor diseñar un complemento solo para eso. Debería permitir registrar una devolución de llamada en Dart que se invoca a través de un temporizador en código nativo en lugar de implementar el temporizador en Dart. Podríamos hacer eso con un servicio en Android.

O

Simplemente podríamos tener un HowTo para crear aplicaciones KeepAlive™ Flutter.

En iOS, puede configurar un UIBackgroundMode en su Info.plist para que sea mucho menos probable que se elimine la aplicación.

En Android, configure un servicio vacío. Esto es principalmente un cambio de AndroidManifest.xml + una implementación de clase de servicio trivial.

Un complemento KeepAlive genérico no parece funcionar, ya que aún requeriría una configuración manual en iOS y no está claro si usar el servicio de primer plano/segundo plano en Android (el servicio de primer plano es más difícil de eliminar pero requiere una notificación persistente).

Incluso con un servicio en primer plano, el sistema operativo podría acabar con nuestro proceso por cualquier motivo.

Creo que la solución ideal debe utilizar el Administrador de alarmas de Android, que está diseñado para casos en los que desea que el código de su aplicación se ejecute en un momento específico, incluso si su aplicación no se está ejecutando actualmente. Pero incluso con esto, ¿cómo podríamos reiniciar el proceso de Dart con el mismo estado, ya que tendremos un usuario de Firebase registrado que realiza escrituras autenticadas en la base de datos?

@pauldemarco , por lo tanto, este error ... No hay forma de que Flutter en este momento ejecute el código Dart en ningún estado sin FlutterView en ejecución. Esto incluye el administrador de alarmas, la sincronización de datos de widgets portátiles/nativos o las notificaciones automáticas (aunque el caso de uso para el último está desapareciendo lentamente https://github.com/flutter/flutter/issues/6192).

Creo que el problema del _mismo estado_ debería resolverse a nivel de la aplicación, no a nivel de Flutter. Para las aplicaciones nativas tienes el mismo problema. Una vez que un proceso está muerto, no puede recuperar el estado a menos que lo guarde en algún lugar (preferencias compartidas o sqlite, por ejemplo). Presumiblemente, haría lo mismo en su código Dart. Una cosa que Flutter puede hacer es comunicar mensajes como applicationWillTerminate en iOS y onSaveInstanceState en Android para que puedas prepararte para esto.

Preguntas:

  • ¿Cuáles son los modelos de iOS y Android para la ejecución en segundo plano?

    • ¿Qué señales pueden hacer que la aplicación se ejecute?

    • ¿Cuánto tiempo tienes que correr? ¿Cómo sabes cuándo se está acabando?

  • ¿Qué modelo de ejecución queremos para la ejecución en segundo plano? (por ejemplo, ¿un aislado separado? ¿Usar el hilo principal dart:ui?)
  • ¿Queremos admitir la ejecución del código sin que la aplicación (como en runApp ) se haya ejecutado primero?
  • ¿Podemos recopilar una lista canónica de casos de uso?

Actualmente esto no está planeado para un futuro cercano. Es un proceso grande, tendríamos que sacar algo más de nuestra lista de prioridades a corto plazo para hacerlo pronto.

caso de uso
Disponemos de diferentes modos de funcionamiento que registran eventos en diferentes intervalos (5 segundos, 10 minutos, 30 minutos, 6 horas). Necesitamos una forma de garantizar que el proceso de registro se ejecute ya sea que la aplicación se esté ejecutando actualmente o no.

¿Qué señales pueden hacer que la aplicación se ejecute?

En Android, esto sería a través de un PendingIntent que se envía desde una alarma programada en AlarmManager.
No estoy seguro de la contraparte de iOS para esto en este momento.

¿Cuánto tiempo tienes que correr? ¿Cómo sabes cuándo se está acabando?

Primero debemos recopilar la información necesaria para el evento, parte de la cual es asíncrona (ubicación GPS), luego registrar el evento en un almacén de datos en línea (Firebase). Todo este proceso puede durar hasta 30 segundos.

¿Qué modelo de ejecución queremos para la ejecución en segundo plano? (por ejemplo, ¿un aislado separado? ¿Usar el hilo principal dart:ui?)

No creo que esto nos importe, no haremos ningún cálculo costoso.

¿Queremos admitir la ejecución del código sin que la aplicación (como en runApp) se haya ejecutado primero?

No estoy seguro de las implicaciones aquí. Supongo que, dado que inicializamos nuestra lógica comercial y el estado en la aplicación normal, sería mejor ejecutar primero esas cosas, para que podamos utilizar informes de fallas, etc.

Puedo agregar otro caso de usuario, esta funcionalidad es lo único que me impide finalizar mi aplicación. Tenía una aplicación de Android para esto y decidí crear una versión mejor y más nueva que, idealmente, también funciona en iOS. No estoy familiarizado con los componentes de iOS (al investigar descubrí que las tareas en segundo plano en iOS están mucho más restringidas que en Android), pero puedo nombrar los componentes de Android que utilicé.

¿Qué señales pueden hacer que la aplicación se ejecute?

La mayor parte del código también se activa mediante una alarma en AlarmManager.

Sin embargo, para iniciar esa alarma todo el tiempo, se ejecuta algún código en el arranque del dispositivo y también en la actualización del paquete (android.intent.action.MY_PACKAGE_REPLACED) porque se eliminarían las alarmas anteriores.

¿Cuánto tiempo tienes que correr? ¿Cómo sabes cuándo se está acabando?

Idealmente por menos de un segundo. Se realiza una pequeña solicitud de red y se persiste el resultado, en algunos casos se muestra una notificación. Después de eso, el método regresa.

¿Qué modelo de ejecución queremos para la ejecución en segundo plano? (por ejemplo, ¿un aislado separado? ¿Usar el hilo principal dart:ui?)

A mí tampoco me importa.

¿Queremos admitir la ejecución del código sin que la aplicación (como en runApp) se haya ejecutado primero?

En mi caso, después de ejecutar una vez estaría bien, sin embargo, si es posible algo como un receptor de arranque, debería ejecutarse incluso si la aplicación no se inició antes.

https://stackoverflow.com/questions/41924890/how-do-i-run-code-in-the-background-even-with-the-screen-off es la pregunta de desbordamiento de pila más vista de Flutter hasta donde puedo contar. :) Definitivamente parece haber interés en este espacio.

https://github.com/flutter/flutter/issues/6192 se reactivó para proporcionar el soporte subyacente para ejecutar el código Dart cuando un FlutterView no se está procesando.

Esto está en nuestro radar a corto plazo, pero será por lo menos unos meses.

Perdón por desasignar a @zanderso de este error, quise asignarlo al error de ejecución en segundo plano subyacente (# 6192)

CC @kasperl; Hemos explorado muchas formas de ejecutar código en segundo plano en nuestros diversos objetivos, y tal vez se puedan extraer algunos aprendizajes de eso.

@ mit-mit, ¿documentó sus hallazgos de alguna forma?

Otra razón para querer el procesamiento en segundo plano es si desea crear una aplicación Streaming Audio. El usuario abre la aplicación para iniciar una transmisión de audio. El proceso en segundo plano descarga la secuencia y reproduce el audio. Recibe eventos para iniciar/detener/pausar/rebobinar. Envía eventos para cambiar la interfaz de usuario, por ejemplo, los metadatos de audio de la barra de búsqueda a la interfaz de usuario. Necesita un proceso en segundo plano para cuando el usuario abandona sus aplicaciones ui, la descarga/reproducción de la transmisión debe continuar

Actualmente estamos trabajando en esto. No hay ETA en este momento.

@zanderso publicó una actualización aquí: https://github.com/flutter/flutter/issues/6192#issuecomment -342214725

@a-siva me informa que esto aún está en curso; Android está funcionando y ahora estamos trabajando en iOS.

Tenemos un caso de uso para esto en el que nos gustaría rastrear la ubicación del usuario en segundo plano para registrar si fueron o no a una ubicación específica en un momento específico (es decir, durante un evento).

@bjornbjorn , ¿no puedes usar cercas geográficas para eso? No sé si IOS tiene algo similar, pero puedes lograr este Geofencing de Play Service.

¿Hay alguna noticia @Hixie ? Actualmente estoy en la etapa en la que necesito que mi aplicación se ejecute como un servicio en segundo plano (la mayor parte de la aplicación está escrita en Go), pero finalmente se cancela. Comencé a implementar el servicio de primer plano en el lado de Java, pero será bastante desagradable si tengo que volver a implementarlo eventualmente para iOS.

Algunos estiman si esto estará disponible para Android en la próxima semana o el próximo mes sería muy apreciado :)

@rusenask como se detalla en https://github.com/flutter/flutter/issues/6192 , ¡ahora tenemos un complemento para esto en Android! Eche un vistazo a https://pub.dartlang.org/packages/android_alarm_manager y háganos saber si eso satisface sus requisitos.

Parece prometedor y probablemente podría cambiar mi aplicación del estilo "demonio" a más "ráfagas periódicas" con ese administrador de alarmas. Para despertar, consumir cualquier noticia y apagar.

Sin embargo, idealmente usaría algo que permita que mi proceso siempre se ejecute en primer plano. https://stackoverflow.com/questions/15758980/android-service-needs-to-run-always-never-pause-or-stop . En resumen, mi aplicación ejecuta un bot, por lo que casi siempre necesita ejecutarse.

Tendremos que asegurarnos de haber documentado esto antes de considerarlo hecho.

¿Deberíamos abrir un nuevo problema de documentación?

Adición a preguntas frecuentes en https://github.com/flutter/website/pull/802

@zanderso -- @mjohnsullivan es el mejor contacto para el lado de la documentación.

¿Se conoce la ETA?

@it2bz ETA para qué exactamente? ¿Soporte en Android? ¿Documentación? ¿Soporte en iOS? ¿Ejemplos?

Soporte de @Hixie en Android e iOS y al menos documentación básica con ejemplos

Para iOS, ¿puede explicar exactamente lo que le gustaría? Apple tiene restricciones estrictas sobre lo que las aplicaciones pueden hacer en segundo plano, por lo que sería útil para nosotros saber exactamente a qué API desea que nos conectemos.

Estoy buscando oportunidad de trabajo en segundo plano con la ubicación del usuario

Parece que este es el hilo de 'preguntar cosas de fondo', así que voy a empezar. Quería implementar un reproductor de música usando flutter, pero no estoy seguro de si sería posible (en cuanto a la API) mantener la reproducción de música incluso si la aplicación está minimizada en el teléfono. Sé que en Android podría iniciar un servicio que en realidad podría continuar incluso si la aplicación se cierra. Luego relanzaría la actividad si fuera necesario. ¿Es posible algo similar en flutter en este momento?

@SirWindfield Su mejor apuesta sería usar la API del reproductor multimedia nativo de cada plataforma, que seguirá reproduciéndose por separado de la aplicación.

@ kirbyfan64 Eso pensé, ¡gracias!

@Hixie , una solución como esta (Cordova): https://github.com/katzer/cordova-plugin-background-mode , o como esta (Swift): https://github.com/yarodevuci/backgroundTask estaría bien para tareas en segundo plano de Flutter.

@holospeed Esos son enfoques que Apple probablemente no le permitiría enviar, así que supongo que no querríamos perder tiempo implementándolos nosotros mismos. Sin duda, es algo que le invitamos a implementar como un paquete contribuido por la comunidad en el pub, sin embargo, si le interesan las aplicaciones personales en iOS.

Tal vez una solución sería crear complementos de fondo específicos, como un complemento para la reproducción de audio en segundo plano, y un complemento para GPS/Ubicación en segundo plano, etc. en lugar de intentar crear un mecanismo de fondo abstracto que necesita admitir todo.

¿Es posible ejecutar un temporizador en segundo plano que lleve la aplicación al
primer plano en un momento determinado?

El miércoles 21 de marzo de 2018 a las 08:49, Dylan Drost [email protected] escribió:

Tal vez una solución sería hacer complementos de fondo específicos como un
complemento para reproducción de audio en segundo plano y un complemento para GPS/Ubicación
en el fondo, etc. en lugar de intentar crear un fondo abstracto
mecanismo que necesita soportar todo.


Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/flutter/flutter/issues/3671#issuecomment-374867947 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AK-c-E0KdEkvbH5uCBIM8FaAbYQkSU2tks5tghQWgaJpZM4IVsUk
.

@ iBob101 Creo que esto es posible si usa el complemento android_alarm_manager en combinación con el complemento android_intent .

En mi caso de uso, todas las tareas en segundo plano que necesito son reproducir audio en segundo plano en un momento determinado, por lo que creo que la sugerencia de @aegis123 es excelente, podemos comenzar poco a poco y, con el tiempo, proporcionar un mecanismo que admita cualquier proceso en segundo plano.

También necesito esto para reproducir música de fondo.

He estado viendo cómo se ha hecho esto en el complemento android_alarm_manager y, por lo que puedo deducir, se invoca un código Dart en Android llamando a runFromBundle . La función Dart invocada está especificada por el punto de entrada, sin embargo, ¿qué pasa si esa función necesita que se pase información? Ejemplo de caso de uso sería una aplicación de chat que permita respuestas directas a través de notificaciones. Según este enlace , la notificación permitirá la entrada remota, pero no parece que sea posible pasar el texto que se ha leído a la función Dart para que pueda procesarse y enviar la respuesta.

Otro ejemplo es una aplicación de correo electrónico que muestra una notificación cuando se recibe un nuevo correo electrónico, se pueden presentar acciones, una de las cuales podría ser la capacidad de archivar el correo electrónico, que se realiza mediante una función de Dart. Sin embargo, esa función necesitaría saber qué correo electrónico debe archivarse.

@MaikuB podría hacer un PR para permitir que se pase un diccionario que pueda contener pares de valores clave.

Sin embargo, en términos generales, para mi ejemplo de uso, necesitaría algo similar al componente de servicio de Android. Y dado que flutter no está diseñado para tener todas las API disponibles que cada sistema operativo puede proporcionar, en realidad podría ser una mejor idea escribir la aplicación en kotlin/java o en swift.

Creo que @bkonyi está analizando lo que podemos hacer en iOS para este problema.

¿Esto significa que no podemos tener un servicio en segundo plano con Flutter? Por ejemplo: un servicio para mostrar notificaciones push desde el servidor.

@s-bauer Siempre ejecutar no es una cosa para Android, a menos que tal vez las notificaciones de primer plano, pero no encontré menciones de startForeground en su código.

No estoy seguro de cuáles son sus especificaciones, pero recuerde que los teléfonos Android se duermen profundamente después de unas horas con la pantalla apagada y sin moverse. Todos los servicios (excepto el primer plano) se programarán sin embargo, el sistema operativo cree que es lo mejor. Una notificación automática proveniente de FCM o una alarma proveniente de AlarmManager bajo una configuración específica son quizás las únicas 2 cosas bajo el control de un desarrollador que son capaces de activar un dispositivo/aplicación Android cuando el desarrollador lo desee, pero no por una cantidad indefinida de hora. Hay muchos otros métodos que dependen de lo que el sistema operativo considere mejor para la batería. Consulte sobre el modo de reposo para obtener más detalles. https://developer.android.com/training/monitoring-device-state/doze-standby

En iPhone las cosas están mucho más restringidas.

Además, no veo por qué un servicio o conexión debe permanecer activo para recibir notificaciones automáticas de FCM o APNS, ¿tal vez me estoy perdiendo algo?

Actualización rápida: la ejecución en segundo plano para iOS está implementada y lista para revisión (PR flutter/engine#5539). Una vez que eso aterrice, comenzaré a actualizar la ejecución en segundo plano de Android para tener una interfaz consistente y publicar un complemento de muestra. Se espera que todo esto esté listo para fin de mes.

@bkonyi , ¿esto también resolvería el problema con: https://github.com/flutter/flutter/issues/17566 ?

@piotrpalek , sí lo será, aunque es probable que el comportamiento sea un poco diferente de lo que era anteriormente, ya que ya no podemos compartir el aislamiento de la interfaz de usuario para las devoluciones de llamada por varios motivos. Cualquier comunicación con la interfaz de usuario en primer plano deberá establecerse a través de puertos aislados, MethodChannel o cualquier otro método que no dependa de compartir memoria con el aislado principal.

Actualización de estado: tanto los cambios de ejecución en segundo plano de iOS como los de Android se están revisando y todavía se están iterando. Espero que los cambios de iOS en flutter/engine#5539 lleguen en los próximos días, en ausencia de solicitudes de modificaciones importantes, y los cambios de Android en flutter/engine#5640 deberían realizarse la próxima semana después de tratar los comentarios de la revisión. ¡Gracias por su paciencia!

Impresionante. Sí, había visto los relaciones públicas ya que ambos hacen referencia a este problema. Usted mencionó hacer un complemento de muestra y he visto el de iOS, ¿habrá una muestra de Android? Supongo que el complemento del administrador de alarmas de Android podría actualizarse una vez que se introduzcan los cambios.

@MaikuB , sí, el complemento AlarmManager se actualizará una vez que flutter/engine#5640 aterrice y flutter/plugins#642 esté completo.

Hola. ¿Alguna actualización con respecto a este tema? La resolución se retrasó hasta el hito de bucket7. ¿Realmente va a aterrizar allí? Esta es una funcionalidad crucial para nuestro proyecto. Gracias por cualquier respuesta.

Desafortunadamente tuve que cambiar las prioridades durante unos días, pero ahora estoy de vuelta trabajando en esto. Estamos _casi_ allí, ¡así que gracias por ser tan paciente!

Ahora que flutter/engine#5539, flutter/engine#5947 y flutter/engine#5954 han aterrizado, toda la funcionalidad necesaria para la ejecución en segundo plano en Android e iOS está implementada en el motor y debería estar en el repositorio principal de Flutter durante el próximo rollo del motor. La documentación y los ejemplos están en proceso, y la corrección del complemento android_alarm_manager está pendiente de revisión (flutter/plugins#642).

@bkonyi ¿ android_alarm_manager también funcionará en IO ahora?

@ianldgs , desafortunadamente no. iOS no proporciona ningún tipo de mecanismo para ejecutar código de forma periódica, por lo que es probable que no sea posible crear una implementación de iOS (consulte esta publicación de SO ). A menudo, es posible lograr los mismos objetivos utilizando uno de los modos de ejecución en segundo plano limitados (p. ej., cambios significativos de ubicación, notificaciones automáticas, cambio de estado de Bluetooth, etc.).

@bkonyi , ¿solucionará esto un problema que estamos experimentando actualmente al no poder ejecutar tareas nativas en segundo plano durante un período prolongado (3 minutos) en iOS?

Para aclarar, aquí está nuestro problema actual...

Fondo:
Nuestra aplicación utiliza balizas Bluetooth para determinar cuánto tiempo pasa alguien en una ubicación. Hemos escrito todo nuestro código de baliza de forma nativa en AppDelegate.swift.

Asunto:
Flutter parece cerrar nuestra aplicación después de unos segundos cuando estamos ejecutando código nativo en segundo plano después de que un evento de ubicación nos despertó (entrada/salida de región en este caso) a pesar de que estamos extendiendo nuestro tiempo de ejecución en segundo plano .

Por qué creemos que está relacionado con Flutter:
Probamos nuestro código de baliza nativo con una aplicación nativa de iOS y no tenemos problemas para obtener 180 segundos de tiempo de ejecución en segundo plano de manera constante.

Lo que hemos probado:
La única solución con la que hemos tenido éxito es poner un retraso de 30 segundos en main() antes de runApp() cuando nuestra aplicación se inició en segundo plano. Sin embargo, esto ha estado causando otros problemas.

Disculpas por la larga explicación, pero este es un gran problema para nosotros y estamos tratando de lanzarlo en las próximas semanas.

Realmente esperamos que esta solución solucione nuestro problema también.

Por último, para ser claros, no nos importa mucho ejecutar el código dart en segundo plano. Más bien, nuestra principal preocupación es que Flutter no finalice prematuramente nuestra aplicación cuando se active en segundo plano.

Cualquier ayuda sería inmensamente apreciada.

¡Gracias!

@AndrewPetrovics lamentablemente, no creo que esto solucione los problemas que está viendo, ya que estos cambios son principalmente para permitir la ejecución del código Dart desde el fondo. No estoy muy familiarizado con las políticas de ejecución en segundo plano de iOS, pero en realidad estoy trabajando en un complemento de geofencing para Android + iOS que suena similar a su caso de uso, así que estaré atento al problema que está teniendo una vez. Comienzo la parte de iOS hoy/mañana.

@chinmaygarde , ¿sabría algo sobre los problemas que está experimentando @AndrewPetrovics ? Tal vez valga la pena presentar un nuevo número para esto.

@bkonyi , suena bien. Terminamos encontrando una solución por el momento, pero es muy complicado. Crearé un número separado cuando tenga la oportunidad.

¡Gracias!

@bkonyi ¿Puedo preguntar cuándo se implementará públicamente android_alarm_manager 0.2.0 en pub.dartlang.org?

@ethael debería estar disponible ahora, solo estaba esperando obtener permisos para publicar la actualización.

¿Hay algún ejemplo o alguna documentación de esto disponible?
¡Gracias!

@Solban hay dos ejemplos en el repositorio de flutter/plugins:

También tengo un complemento de geofencing en proceso que es compatible con Android (Kotlin) e iOS (Obj-C), pero no estoy seguro de si eso va a vivir en flutter/plugins o no.

Aquí hay alguna documentación útil para la funcionalidad relacionada con la ejecución en segundo plano:

  • La clase PluginUtilities para pasar devoluciones de llamada entre aislados
  • El IsolateNameServer, que es útil para registrar objetos SendPort con Flutter para que otros aislados los busquen (parece que falta documentación real, pero la interfaz es bastante sencilla).
  • El FlutterNativeView que se usa para generar el aislamiento de fondo para el complemento en Android
  • El FlutterHeadlessDartRunner que se usa para generar el aislamiento de fondo para el complemento en iOS

Actualmente no hay documentación formal sobre la escritura de complementos con capacidades de ejecución en segundo plano. Sin embargo, debería aparecer una publicación de Medium en el blog de Flutter en las próximas semanas que explicará el proceso de diseño, implementación y uso de complementos que utilizan la ejecución en segundo plano.

¿Hay alguna solución para continuar el trabajo en segundo plano? La única forma correcta de ejecutar continuamente un código de ejecución prolongada en Android es Foreground service .
El ejemplo de caso de uso sería continuar con el seguimiento de la ubicación GPS.

@audkar actualmente no hay un complemento que pueda manejar el trabajo en segundo plano continuo, pero eso no significa que no se pueda hacer. Un complemento que utilice la funcionalidad a la que me referí anteriormente en combinación con un servicio de primer plano (en lugar del JobIntentService que usé para el complemento de geofencing) funcionaría bien.

Actualmente estoy transfiriendo mi SDK de Geolocalización/Geofencing en segundo plano de iOS/Android a Flutter. Se llamará flutter_background_geolocation .

Tengo alrededor de 5 días de experiencia con Dart / Flutter pero lo entiendo. Debería estar listo en 2 semanas (aunque los documentos tardarán un poco más con los ejemplos específicos de Dart).

Este SDK tiene casi 5 años y es compatible a tiempo completo. Originalmente fue desarrollado para Apache Cordova , luego fue portado a React Native y NativeScript . También funciona en aplicaciones nativas puras. Debajo del capó, es la misma biblioteca central Obj-c + Java utilizada con cada plataforma de desarrollo.

El SDK se desarrolló originalmente para realizar un seguimiento de los socorristas en zonas de desastre (p. ej., huracanes, terremotos) en un entorno en el que es probable que se destruya la red celular. Tenía que continuar rastreando incluso si la aplicación se cancelaba o el dispositivo se reiniciaba. El complemento contiene su propia base de datos SQLite y servicio HTTP para cargar ubicaciones automáticamente en su servidor. Esto es particularmente importante para Android en el caso de que la aplicación haya sido cancelada, dejando solo el servicio en primer plano del SDK ejecutándose "sin cabeza".

:advertencia: este SDK no está diseñado para aplicaciones sociales. está diseñado específicamente para casos de uso de "seguimiento de flotas" (por ejemplo: taxi, servicio de entrega, respuesta de emergencia, trotar, etc.).

Aquí hay un breve video de demostración .

Consulte la Filosofía de funcionamiento .

Editar También estaré portando otra biblioteca como flutter_background_fetch , que se incluirá como una dependencia de flutter_background_geolocation . Este módulo activará una aplicación de iOS/Android en segundo plano aproximadamente cada 15 minutos, proporcionando 30 segundos de tiempo de fondo para que realice un trabajo periódico. Consulte la versión react-native para obtener más información.

Ok, he publicado flutter_background_geolocation . Probablemente todavía haya algunos agujeros para conectar en la fachada de las bibliotecas nativas y los ejemplos en los documentos deben traducirse de la versión React Native.

@christocracy buenas noticias. ¿Qué pasa con la búsqueda de fondo? ¿alguna estimación con respecto a eso?

@ethael Fetch llegará en aproximadamente 2 semanas más. Es un complemento muy simple.

@bkonyi Probé su complemento de cambio de ubicación para experimentar con la ejecución en segundo plano. Parece que la devolución de llamada de dardo ejecutada desde el corredor sin cabeza no puede usar otros complementos, fallando con MissingPluginException .

En Android, con el complemento android_alarm_manager resolvió este problema con AlarmService.setPluginRegistrant(this); para registrar internamente los complementos del servicio en segundo plano. Pero no veo cómo lograr el equivalente para iOS.

¿Actualmente es posible llamar a otros complementos desde un corredor sin cabeza en iOS? Si es así, ¿cómo podemos registrar complementos en ese contexto?

@bkonyi Este problema no está resuelto y debe reabrirse. AlarmManager parece una solución en el mejor de los casos porque solo admite eventos cronometrados. Flutter necesita algo más genérico, para que pueda escuchar ciertos eventos como el dispositivo Bluetooth dentro del alcance, por ejemplo. Y necesita ser compatible con iOS mejor. Entiendo que iOS es mucho más restrictivo, pero Flutter debería admitir las cosas que están disponibles para los programadores nativos.

Estaba emocionado de comenzar con Flutter, pero parece que hay muchos problemas como este que lo hacen inutilizable para todas las aplicaciones, excepto para las más simples. Esperaba más de Google, y creo que es injusto de su parte esperar que los desarrolladores hagan complementos para llenar los principales vacíos que dejaron.

@dude8604 Google no va a proporcionar todo y sí, depende de los desarrolladores de complementos de terceros (como yo) contribuir con complementos al ecosistema. Estoy trayendo dos actualmente yo mismo.

Pasé mucho tiempo con Cordova, React Native y NativeScript. Después de 2 semanas con Flutter, creo que es bastante excelente, aunque ciertamente hay lagunas (un componente de mapa multiplataforma, por ejemplo, en el que estoy seguro estaré contribuyendo en un futuro cercano).

Soy un desarrollador profesional de complementos especializado en el funcionamiento en segundo plano de iOS y Android (geolocalización y geoperimetraje, en particular) durante los últimos 5 años. ¿Qué te gustaría saber?

@christocracy Estoy de acuerdo en que es necesario que haya complementos de terceros, pero la ejecución en segundo plano o al menos poder registrar funciones de devolución de llamada para ciertos eventos parece algo que debería proporcionar un marco de aplicación. Mi problema no es tener que hacer complementos para ampliar la funcionalidad principal, sino lanzar un marco al que le faltan funciones básicas y esperar que los desarrolladores brinden su tiempo como voluntarios a una empresa con fines de lucro para llenar los vacíos. De todos modos, este no es el lugar adecuado para discutir esto.

Quiero ejecutar un servicio en segundo plano y leer ciertos eventos, procesar y posiblemente registrar los datos y, si corresponde, crear una notificación que inicie la aplicación principal si se presiona. Algunos ejemplos de los eventos serían: nuevo dispositivo Bluetooth dentro del alcance, datos entrantes en un enchufe, datos entrantes desde un dispositivo USB, SMS recibido, cambio de ubicación del GPS, intento de conexión del dispositivo Bluetooth, se presiona un determinado botón físico, los datos del acelerómetro exceden un valor especificado, si la aplicación principal está terminada y muchas otras cosas en las que no estoy pensando. Si alguien pudiera hacer un complemento completo (con una licencia gratuita o de código abierto) para esto que funcione en iOS y Android, creo que este problema podría cerrarse. Y estaría eternamente agradecido de poder comenzar a desarrollar con Flutter.

@dude8604 Creo que sé lo que quieres. Obviamente, hacer gran parte de esto requiere un servicio en primer plano, con su notificación persistente requerida. El usuario es consciente de su servicio en ejecución.

Contáctame a través de mi perfil de github.

Considere que React Native era básicamente como "usted obtiene botones, campos de texto y una vista de lista, el resto depende de usted" y se convirtió en lo que es ahora gracias a la comunidad. Es posible que Google no pueda manejar todas las implementaciones y es una locura pensar que el equipo de Flutter podrá replicar todas las funciones proporcionadas por Android e iOS cuando esas funciones las agregan equipos 100x (¿10,000x?) del tamaño de Flutter.

El android_alarm_manager y image_picker no parecen funcionar (si ambos están instalados) después de implementarlo en un nuevo proyecto que ejecuta Flutter 0.8.3-pre.47 . La aplicación fuerza el cierre. El ejemplo funciona, así que copié todo en el ejemplo y configuré mi base de fuego, pero aún no funciona.

Para agregar el problema que planteó @deckerst , no estoy seguro de que sea apropiado considerar esto cerrado cuando no hay paridad entre Android e iOS con respecto a poder ejecutar código que usa otros complementos.

Editar: acabo de notar que hay otro problema para rastrear esto

Solo para que este artículo se haga referencia aquí para aquellos que no lo han visto:
https://medium.com/flutter-io/ejecutando-dart-en-el-fondo-con-flutter-plugins-y-geofencing-2b3e40a1a124

Gracias @slightfoot. Vi eso y ahí es donde encontré el ticket (# 21925) para hacer que la ejecución sin cabeza de iOS funcione con complementos. Habría sido útil tener una referencia entre estos dos boletos.

En una nota relacionada, ¿existe un plan para incluir la ejecución sin cabeza en la documentación oficial, por ejemplo, como parte del libro de cocina? Supongo que sí, pero pensé que valía la pena preguntar dado que es probable que una parte más grande de la comunidad no sepa verificar el medio

Buen punto @MaikuB , ¡agregué un error de documento para esto!

Soporte de fondo en flutter directamente, consulte https://www.youtube.com/watch?v=_LfjILXswJs

no entiendo muy bien Si Flutter ahora admite la ejecución en segundo plano, ¿por qué el tutorial tiene principalmente código específico de la plataforma?

Obtenga Outlook para Android https://aka.ms/ghei36


De: tonka [email protected]
Enviado: viernes, 21 de septiembre de 2018 3:39:28 a. m.
Para: aleteo/aleteo
CC: Philip Weiss; Mencionar
Asunto: Re: [flutter/flutter] Flutter debería proporcionar una abstracción para la ejecución en segundo plano (#3671)

Soporte de fondo en flutter directamente, consulte https://www.youtube.com/watch?v=_LfjILXswJs


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423490126 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ABWxFrGMGvfFtwkf025Q2Je6lUTZu2aPks5udMHggaJpZM4IVsUk .

@dude8604 el tutorial es para desarrolladores de complementos que deseen desarrollar un complemento para realizar alguna operación en segundo plano en particular.

Los consumidores de algún complemento en particular están ciegos (en la medida de lo posible) a las implementaciones específicas de la plataforma.

Entonces, como consumidor, ¿hay alguna manera de ejecutar código arbitrario en segundo plano, si no hay un complemento para mi caso de uso específico?


De: Chris Scott [email protected]
Enviado: sábado, 22 de septiembre de 2018 17:43:16
Para: aleteo/aleteo
CC: Philip Weiss; Mencionar
Asunto: Re: [flutter/flutter] Flutter debería proporcionar una abstracción para la ejecución en segundo plano (#3671)

@dude8604 https://github.com/dude8604 el tutorial es para desarrolladores de complementos que desean desarrollar un complemento para realizar alguna operación en segundo plano en particular.

Los consumidores de algún complemento en particular están ciegos (en la medida de lo posible) a las implementaciones específicas de la plataforma.


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423783230 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ABWxFhmlurQ08wWXLmMvE3E6yQ_lYvS1ks5udtkkgaJpZM4IVsUk .

@dude8604 No.

Hasta donde yo sé actualmente:

No puedes "ejecutar código arbitrario en segundo plano". Android es estricto ahora . iOS siempre lo ha sido.

@dude8604 , @christocracy tiene razón. La funcionalidad de ejecución en segundo plano que se muestra en el artículo de Medium está dirigida a los desarrolladores que desean crear complementos que puedan ejecutar código Dart en segundo plano. La mayoría de los usuarios de Flutter nunca tendrán que escribir código específico de la plataforma para la ejecución en segundo plano, a menos que no haya un complemento existente que coincida con su caso de uso, ya que estos complementos abstraerán el código específico de la plataforma detrás de una interfaz de Dart.

El android_alarm_manager y image_picker no parecen funcionar (si ambos están instalados) después de implementarlo en un nuevo proyecto que ejecuta Flutter 0.8.3-pre.47 . La aplicación fuerza el cierre. El ejemplo funciona, así que copié todo en el ejemplo y configuré mi base de fuego, pero aún no funciona.

@rupert2133 ¿le importaría presentar un problema con más información? No dudes en mencionarme para que me notifiquen. Este problema se debió al requisito más amplio para la ejecución en segundo plano del código Dart y está cerrado, por lo que es probable que cualquier respuesta adicional quede oculta.

Android_alarm_manager y image_picker no parecen funcionar (si ambos están instalados) después

Eso me recuerda. Ayer, mientras implementaba Headless Android en mi complemento, tuve un error proveniente de googlemaps aquí .

Cuando todos los complementos se vuelven a registrar en el estado Headless, registrar.activity() == null .

Tuve que hackearlo manualmente para que mi aplicación arrancara:

public static void registerWith(Registrar registrar) {
    final GoogleMapsPlugin plugin = new GoogleMapsPlugin();
+    Activity activity = registrar.activity();
+    if (activity != null) {
      registrar.activity().getApplication().registerActivityLifecycleCallbacks(plugin);
      registrar
              .platformViewRegistry()
              .registerViewFactory(
                      "plugins.flutter.io/google_maps", new GoogleMapFactory(plugin.state, registrar));
+    }
  }

Esto va a ser un problema con una gran cantidad de complementos, sospecho.

Quiero ejecutar un servicio en segundo plano y leer ciertos eventos, procesar y posiblemente registrar los datos y, si corresponde, crear una notificación que inicie la aplicación principal si se presiona. Algunos ejemplos de los eventos serían: nuevo dispositivo Bluetooth dentro del alcance, datos entrantes en un enchufe, datos entrantes desde un dispositivo USB, SMS recibido, cambio de ubicación del GPS, intento de conexión del dispositivo Bluetooth, se presiona un determinado botón físico, los datos del acelerómetro exceden un valor especificado, si la aplicación principal está terminada y muchas otras cosas en las que no estoy pensando. Si alguien pudiera hacer un complemento completo (con una licencia gratuita o de código abierto) para esto que funcione en iOS y Android, creo que este problema podría cerrarse. Y estaría eternamente agradecido de poder comenzar a desarrollar con Flutter.

@bkonyi Entonces, ¿cuál de las cosas anteriores puedo hacer actualmente con los complementos existentes? ¿Puedo usar AlarmManager para sondear estos eventos? Pero AlarmManager no funciona en iOS, ¿verdad?

@dude8604 Lo mejor que obtendrá para los eventos periódicos en iOS es a través de la API de "búsqueda de fondo". Estaré portando este plugin para flutter pronto.

La API "Background Fetch" de iOS activará una aplicación inactiva en segundo plano aproximadamente cada 15 minutos (este es el intervalo más rápido posible ) proporcionando a su aplicación exactamente 30 segundos de tiempo de ejecución en segundo plano. Sin embargo, iOS usa el aprendizaje automático (presumiblemente) y acelerará esto en función de la hora del día y la frecuencia del uso del dispositivo/aplicación (por ejemplo, por la noche, cuando el usuario probablemente esté durmiendo, los eventos de búsqueda pueden ocurrir una vez por hora.

@christocracy @bkonyi Entonces, ¿todos estos y sus equivalentes de Android podrían convertirse en un complemento? ¿Cómo puedo hacer una solicitud de función para esto?

@dude8604 No puedes simplemente agitar una varita mágica y *poof* . Ve a ponerte los guantes de trabajo y hazlo tú mismo. Si no puede hacerlo usted mismo, encuentre a alguien que pueda y le paga decenas de miles de dólares.

@christocracy Tiene razón, pero esperaba que una de las corporaciones más grandes del mundo tuviera los recursos para desarrollar un producto con todas las funciones y no requerir que sus usuarios gasten decenas de miles de dólares para que sea lo suficientemente utilizable.

Bueno, sí, es una gran corporación.

Dicha corporación también está integrada por individuos, que no son omnipresentes. Ningún marco puede cubrir todo listo para usar, porque si lo intenta, su proyecto se convertirá en un montón de quema... bueno, basura.
Hay cientos de API específicas de plataforma y ningún equipo las cubrirá. Tendrás que unir algunos tú mismo.

@ dude8604 Tenga en cuenta que su definición de "con todas las funciones" no es la misma que la mía. Su responsabilidad es manejar la intersección.

1 f you write this

¿Tenemos una dirección clara de los documentos? Vi Release Preview 2 diciendo que tiene soporte para ejecución en segundo plano. Algunos ejemplos serían buenos para ir.

@Pushan-Gupta background-execution es una cosa específica del complemento.

Eso depende de lo que quieras hacer. ¿Ubicación de la pista? ¿Recibir notificaciones automáticas? ¿Monitorizar geocercas? ¿Detectar dispositivos BT? balizas? ¿Reproducir música?

No hay un "anillo único para gobernarlos a todos, soporte para ejecución en segundo plano"

@christocracy Lo siento, no sabía eso. Yo estaba apuntando a una cosa específica. Digamos que quiero hacer una solicitud de publicaciones desde la aplicación. Pero la conexión está cortada. Tan pronto como el dispositivo vuelva a estar en línea, sin importar si la aplicación está abierta o no, se debe procesar la cola de esas solicitudes de publicaciones.

Ejemplo: Whatsapp pone en cola los mensajes antes de enviarlos al servidor. Si el dispositivo está fuera de línea, almacena la cola y la atiende tan pronto como se conecta.

Por cierto, tengo un PR en marcha, discutiendo el registro de complementos para aislamientos de fondo. Si alguien tiene alguna idea...

https://github.com/flutter/engine/pull/6396

¿Cuál es el punto de FlutterHeadlessDartRunner actualmente?
Implementé la ejecución en segundo plano en Android actualmente (no hay ningún complemento, solo FlutterNativeView(ctx, true) ), y eso fue algo fácil de hacer.
Pero en iOS solo falla

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: <strong i="10">@escaping</strong> () -> Void) {
    let headless = FlutterHeadlessDartRunner.init()
    headless.run(withEntrypoint: "main") // just EXC_BAD_ACCESS here
}

Oye,
Por favor, ayuda en la aplicación de recordatorio en flutter ios

@MohdLucky ¿Y la ayuda que necesita es...?

@christocracy , ¿tiene alguna actualización sobre el estado de implementación del complemento background_fetch, por favor?

no actualice el estado de implementación del complemento background_fetch, proporcione un código de muestra para
ejecutando notificación de fondo.

Cualquier actualización sobre esto... Realmente pensé que esto es parte de flutter :(... esto es más o menos los mismos problemas que tienen otras soluciones web híbridas...

@radvansky-tomas No sé por qué la gente simplemente no entiende que esto no es responsabilidad de Flutters. Incluso si tiene que implementar la ejecución en segundo plano de forma nativa, todavía tiene la ventaja de una sola base de código. Escribir un complemento de aleteo que haga su trabajo en segundo plano lleva solo uno o dos días de trabajo. Tuve el mismo problema, necesitaba un servicio de Android que fuera capaz de reproducir música para mí. Simplemente lo escribí en kotlin, implementé la capa de comunicación usando flutter y luego hice lo mismo para iOS.
Es totalmente posible usar los sistemas de fondo nativos del sistema.
En lugar de quejarse de que X no está implementado, puede implementarlo literalmente sin ningún problema utilizando el ecosistema proporcionado por el equipo.

@SirWindfield Desafortunadamente, no sabes de qué estás hablando. Esta es una parte esencial de la arquitectura, no un complemento en sí.

Flutter se presenta como una solución multiplataforma que produce código nativo, es decir, se espera que pueda ejecutar código en su idioma (Dart) siempre que el sistema operativo lo permita.

Por lo tanto, si la aplicación se está ejecutando después de recibir la notificación remota y puede colocar un punto de interrupción en el código nativo existente, debería poder llamar a su código flutter/dart donde están sus servicios, modelos y, finalmente, la interfaz de usuario.

Para hacerlo en su caso... digamos que su música se está reproduciendo en segundo plano y luego termina su lista de reproducción... después de 10 minutos se apaga la aplicación. Luego llamas a Siri, o usas auriculares para iniciar la reproducción nuevamente de tu aplicación, sea cual sea el punto de entrada que elijas... se ejecuta el código nativo, pero no su interfaz de usuario, tu código de aleteo no se inicializa y estás perdido como yo con mis notificaciones.

Entonces, no, no es posible, puedo escribir una notificación de captura de complemento nativo para mí, pero luego necesito acceso a la lógica comercial de flutter para procesar datos, en mi caso, criptodescifrar y liberar una notificación local con contenido descifrado.

Bueno, lo he probado en mi teléfono extensamente y funciona sin ningún problema.
Sin embargo, podría ser que mi teléfono nunca eliminó la aplicación. Mi mal entonces.

@christocracy ¿ alguna actualización con respecto al plugin background_fetch Chris?

@ethael Aquí está el repositorio vacío para que esté atento a las actualizaciones.
https://github.com/transistorsoft/flutter_background_fetch

@radvansky-tomas puede manejar eventos en segundo plano en código Dart creando un aislado en segundo plano como se describe en esta publicación de Medium sobre ejecución en segundo plano . Es probable que deba escribir un código nativo para cada plataforma que se adapte a sus necesidades particulares, a menos que ya exista un complemento que haga lo que desea (es poco probable, ya que no conozco muchos complementos que admitan la ejecución en segundo plano en este momento).

@bkonyi Gracias por responder, comencé a cambiar el complemento firebase_messaging para admitir la ejecución en segundo plano ... pero este problema se trata más de una forma genérica de hacerlo. Quiero decir que debería ser parte de template = runner y su lado dart donde los desarrolladores pueden ejecutar dicho código sin cabeza, algunas reglas, patrón estándar como ahora en algunos blogs, sugerencias, etc.

Algunos trabajos iniciales realizados: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging

Siguiendo algunas guías de https://github.com/bkonyi/FlutterGeofencing

Debería terminarlo para fines de esta semana, por ahora solo estoy trabajando en bits de iOS. El proyecto de ejemplo utiliza el complemento de notificación local para mostrar que el mensaje se recibió en segundo plano (notificación silenciosa) y luego lanza uno nuevo local para manifestar el éxito.

Algunos trabajos iniciales realizados: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging

Siguiendo algunas guías de https://github.com/bkonyi/FlutterGeofencing

Debería terminarlo para fines de esta semana, por ahora solo estoy trabajando en bits de iOS. El proyecto de ejemplo utiliza el complemento de notificación local para mostrar que el mensaje se recibió en segundo plano (notificación silenciosa) y luego lanza uno nuevo local para manifestar el éxito.

@goderbauer y yo en realidad buscábamos agregar este soporte, pero estaríamos más que felices de ayudarlo con el diseño y las revisiones si planea hacer una solicitud de extracción.

Así que prácticamente terminé esa parte, así que ahora puedo recibir notificaciones automáticas silenciosas y mi devolución de llamada escrita en dart se ejecuta mientras la aplicación está en segundo plano.

Sin embargo, no puedo acceder a ningún otro complemento allí. La devolución de llamada tiene que ser un método raíz/estático y realmente no entiendo cómo llamar a nada desde allí.

Así que traté de hacer una prueba simple, para usar el complemento de notificación local flutter para enviar una notificación local después de recibir uno silencioso, pero parece que el complemento no está accesible (¿no está registrado?)

Encontré publicaciones similares aquí: https://github.com/flutter/engine/pull/6396

¿Hay algún otro paso necesario que deba hacer para cargar esos complementos?

Mi devolución de llamada de nivel raíz:
void callback(FirebaseMessage m, MessageEvent e) async { print('Message $m Event: $e'); final SendPort send = IsolateNameServer.lookupPortByName('messaging_send_port'); send?.send(e.toString()); }

La pregunta no es cómo acceder a todo el código de dart + complementos desde esa devolución de llamada... consultar Firestore, etc.

La implementación de My Background Fetch finalmente se lanzó.
buscar_fondo

@christocracy Tiene razón, pero esperaba que una de las corporaciones más grandes del mundo tuviera los recursos para desarrollar un producto con todas las funciones y no requerir que sus usuarios gasten decenas de miles de dólares para que sea lo suficientemente utilizable.

Eso es muy cierto. Si consigues el tiempo de la gente, deberías devolverles algo. Si no es así, ¡no haga estos elegantes títulos de marketing!

¿Parece que este problema todavía está causando problemas a la gente? Está cerrado y tiene muchos comentarios, por lo que es poco probable que hagamos muchos cambios concretos en el proyecto a partir de este problema. :( (Tendremos que presentar nuevos para hacer más progreso, espero.)

Estaría muy interesado en que documentemos los cambios concretos deseados aquí. ¿Parece que se desean más ejemplos de fondo? (por ejemplo, https://github.com/flutter/flutter/issues/23794)

En cualquier caso, nos encantaría tener problemas individuales presentados con solicitudes individuales. Como otros han señalado anteriormente, Flutter es un proyecto grande y complejo, y aunque tenemos un equipo grande (y en rápida expansión) aquí en Google, todavía no tenemos suficientes ingenieros trabajando a tiempo completo en Flutter para responder a todos los problemas simultáneamente. Flutter es 100 % de código abierto y todos nuestros problemas están en GitHub. Los parches siempre son bienvenidos, por supuesto. :)

Para cualquier problema/cambio deseado, presente nuevos problemas para que todos los contribuyentes sepan cómo podemos ayudar más: https://github.com/flutter/flutter/issues/new

¡Gracias!

Desafío @eseidel aceptado: #24278

Tenía la esperanza de evitar escribir un código específico del dispositivo y tener una implementación de la API de Flutter Dart tal vez basada en eventos que ocultarían las especificaciones del dispositivo y del sistema operativo y la implementación específica.

ya solucionado aqui

@ Krunal79-flutter cómo exactamente, ese enfoque aún tendría los mismos problemas. La cuestión es que en su escenario Flutter ya está inicializado y no es un acceso de fondo adecuado en ese momento. Emitir lo que tenía y tengo, es cuando la aplicación está realmente muerta y la notificación silenciosa (o la extensión de la aplicación) activará su aplicación y necesita realizar la lógica de "dardo" mientras el aleteo aún no se está ejecutando (es decir, no hay una interfaz de usuario presente).

Esto realmente debería ser un problema de mayor prioridad para quien administre el equipo de Flutter. La implementación de la funcionalidad en segundo plano es un gran dolor para el desarrollador promedio de Flutter y se descompone a menudo de manera no trivial. Y estoy seguro de que muchos desarrolladores de aplicaciones están luchando actualmente con esto.

@tomoerlemans010 , consulte el comentario en https://github.com/flutter/flutter/issues/3671#issuecomment -438113161.

Este problema en particular está cerrado, agregue comentarios a otros problemas abiertos relacionados con la ejecución en segundo plano o cree uno nuevo con los problemas que enfrenta.

¿Fue útil esta página
0 / 5 - 0 calificaciones