Flutter: Flutter deve fornecer uma abstração para execução em segundo plano

Criado em 2 mai. 2016  ·  139Comentários  ·  Fonte: flutter/flutter

Os clientes gostariam de executar o código dart como processos em segundo plano no iOS e no Android, para coisas como sincronizar dados quando o wifi está disponível, mas o aplicativo não está aberto, etc.

@mpcomplete criou um processo em segundo plano no Android para executar o código Dart para atualizar o flutter. Mas não tenho conhecimento de um paralelo no iOS.

Esse problema rastreia o desenvolvimento de APIs em plug-ins ou de outra forma. O suporte do mecanismo para essas abstrações é rastreado em https://github.com/flutter/flutter/issues/6192.

truckable wellbeing engine framework plugin new feature

Comentários muito úteis

Atualização rápida: a execução em segundo plano para iOS foi implementada e está em revisão (PR flutter/engine#5539). Quando isso acontecer, começarei a atualizar a execução em segundo plano do Android para ter uma interface consistente e publicar um plug-in de exemplo. Esperamos que tudo isso seja feito até o final do mês.

Todos 139 comentários

O código executado em segundo plano deve ser escrito em Dart ou em Java/Objective-C ?

Isso surgiu no contexto de querer atualizar o modelo de dados local quando a conectividade estava disponível. por exemplo, mapas/horários do metrô em que você pode estar entrando/saindo do metrô. Então, acho que o objetivo seria fazer com que o código executado fosse Dart, para que você não precisasse ter um código de manipulação de modelo de dados separado para cada plataforma.

CC @kasperl; exploramos muitas maneiras de executar código em segundo plano em nossos vários destinos, e talvez alguns aprendizados possam ser extraídos disso.

Temos alguns casos de uso de nossos usuários? A única que ouvi foi "Queremos executar algum código no dispositivo, em resposta a uma mensagem push. Queremos sincronizar os dados no dispositivo, mesmo que o aplicativo não esteja aberto".

Normalmente, é bastante restrito o que um aplicativo realmente pode fazer em segundo plano, então, neste caso, acho que podemos obter inspiração para os casos de uso a partir daí. Por exemplo, aqui está o modelo iOS:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Acredito que seja o mesmo bug do #6192, sim.

Adicionando tag folhosa e valor de marco de # 6192

@mravn-google @sigurdm algo para se pensar!

Designando Mikkel para uma investigação inicial para entender melhor a viabilidade e o custo.

Aqui está uma atualização de Leafy:

Devido às limitações das notificações de dados (ou seja, notificações que exigem que o aplicativo responda de alguma forma), o leafy está inclinado a usar notificações de exibição (ou seja, notificações que são enviadas diretamente para a tela do usuário sem envolvimento do aplicativo). Suporte para isso já existe no Flutter.

No entanto, durante as conversas com outras equipes, outro caso de uso surgiu: se você quiser oferecer suporte a wearables ou widgets [tela inicial] do seu aplicativo, precisará escrever a interface do usuário em código nativo, pois essas superfícies ainda não são suportadas pelo Flutter. No entanto, seria bom poder "acordar o aplicativo e solicitar dados" para que a camada de modelo e a lógica de negócios possam ser compartilhadas no aplicativo flutter e no aplicativo vestível. Nunca tendo escrito um desses, não tenho certeza de como os aplicativos nativos existentes fazem isso, mas certamente parece um caso de uso válido para tarefas em segundo plano.

Acabei de falar com o autor do Flutter talk para Berlin DroidCon, e essa foi uma de suas principais perguntas. "Como fazer isso, do jeito Flutter"

Para ser claro, atualmente é possível escrever processos em segundo plano como parte de um aplicativo que usa Flutter. No entanto, esses processos só podem executar código Obj-C/Swift ou Java/Kotlin. Este bug é sobre como corrigir a limitação em nosso mecanismo para permitir a execução de código Dart nesses processos em segundo plano, bem como possivelmente fornecer uma abstração para permitir o agendamento de tal trabalho em segundo plano do Dart (provavelmente que pertence a um plug-in uma vez que o FlutterView-precisa-de- a restrição be-on-screen é removida).

https://github.com/flutter/flutter/issues/6192#issuecomment -258928555 discute a limitação atual do mecanismo e nossa intenção de resolvê-la. Para sua informação @a-siva

Isso também está relacionado a (uma duplicata de?) https://github.com/flutter/flutter/issues/5048.

Temos um caso de uso que não vejo mencionado: estamos rastreando a localização a cada 5 segundos e temos outras informações anexadas a esse evento, cuja lógica de negócios é implementada no Dart. Se nosso usuário traz outra atividade para o primeiro plano, precisamos exibir uma notificação persistente e continuar a executar esse código Dart a cada 5 segundos.

Este é um bloqueador para nós. Estou interessado em ouvir quaisquer soluções alternativas que possamos implementar no momento, pois isso atrasará o envio.

Eu tentaria simplesmente deixar o timer ativo e ver o que acontece. Eu não acho que seria confiável, mas nosso aplicativo também tem um caso de uso de limpeza de cache única (15 minutos após o aplicativo ter sido colocado em segundo plano) e o vimos ser executado com sucesso. Nós o agendamos enquanto o aplicativo está sendo interrompido no Dart. Algo assim:

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

Não funcionaria se:

  • O aplicativo é explicitamente eliminado pelo usuário (por exemplo, do alternador de tarefas).
  • O aplicativo é morto pelo sistema operacional devido à pressão da memória.
  • No iOS? Acho que não tentamos isso, então sinta-se à vontade para tentar e relatar.

Não tenho certeza das contrapartes do iOS, mas no Android um plug-in de vibração pode ser criado para lançar um serviço de primeiro plano, o que dá ao processo uma prioridade mais alta e diminui a probabilidade de ser morto durante períodos de demanda de recursos. Isso também daria ao temporizador Dart de longa duração uma chance melhor de sobrevivência?

Sim, isso pode ajudar, pois sua atividade (portanto, sua visualização de vibração) permanecerá ativa. Ainda não estou convencido de que temos clareza suficiente para fazer um plugin.

Se o objetivo é oferecer suporte a pesquisas periódicas de informações em segundo plano, talvez seja melhor projetar um plug-in apenas para isso. Ele deve permitir registrar um retorno de chamada no Dart que é invocado por meio de um timer no código nativo, em vez de implementar o Timer no Dart. Poderíamos fazer isso com um serviço no Android.

OU

Poderíamos simplesmente ter um HowTo para criar aplicativos KeepAlive™ Flutter.

No iOS, você pode definir um UIBackgroundMode em seu Info.plist para tornar muito menos provável que o aplicativo seja morto.

No Android, configure um serviço vazio. Isso é principalmente uma mudança no AndroidManifest.xml + uma implementação de classe de serviço trivial.

Um plug-in KeepAlive genérico não parece ser viável, pois ainda exigiria configuração manual no iOS e não está claro se deve usar o serviço de primeiro plano/segundo plano no Android (o serviço de primeiro plano é mais difícil de matar, mas requer uma notificação persistente).

Mesmo com um serviço em primeiro plano, o sistema operacional ainda pode matar nosso processo por qualquer motivo.

Eu sinto que a solução ideal deve utilizar o Alarm Manager do Android, que é destinado a casos em que você deseja que o código do seu aplicativo seja executado em um horário específico, mesmo que seu aplicativo não esteja em execução no momento. Mas mesmo com isso, como podemos reiniciar o processo Dart com o mesmo estado, já que teremos um usuário logado do Firebase fazendo gravações de banco de dados autenticadas?

@pauldemarco daí este bug... Não há como o Flutter agora executar o código Dart em qualquer estado sem o FlutterView em execução. Isso inclui Alarm Manager, Wearable/Native Widget Data Sync ou Push Notifications (embora o caso de uso do último esteja desaparecendo lentamente https://github.com/flutter/flutter/issues/6192).

Eu acho que o problema do _mesmo estado_ deve ser resolvido no nível do aplicativo, não no nível do Flutter. Para aplicativos nativos, você tem o mesmo problema. Depois que um processo está morto, você não pode recuperar o estado a menos que o salve em algum lugar (preferências compartilhadas ou sqlite, por exemplo). Presumivelmente, você faria o mesmo em seu código Dart. Uma coisa que o Flutter pode fazer é comunicar mensagens como applicationWillTerminate no iOS e onSaveInstanceState no Android para que você possa se preparar para isso.

Perguntas:

  • Quais são os modelos iOS e Android para execução em segundo plano?

    • Quais sinais podem acionar a execução do aplicativo?

    • Quanto tempo você tem que correr? Como você sabe quando isso está acabando?

  • Que modelo de execução queremos para execução em segundo plano? (por exemplo, um isolado separado? Use o thread principal dart:ui?)
  • Queremos dar suporte ao código em execução sem que o aplicativo (como em runApp ) seja executado pela primeira vez?
  • Podemos coletar uma lista canônica de casos de uso?

Atualmente, isso não está planejado para um futuro próximo. É um processo grande, precisaríamos tirar outra coisa da nossa lista de prioridades de curto prazo para fazer isso em breve.

Caso de uso
Temos diferentes modos de operação que registram eventos em diferentes intervalos (5 segundos, 10 minutos, 30 minutos, 6 horas). Precisamos de uma maneira de garantir que o processo de registro seja executado independentemente de o aplicativo estar ou não em execução no momento.

Quais sinais podem acionar a execução do aplicativo?

No Android, isso seria por meio de um PendingIntent que é enviado de um alarme programado no AlarmManager.
Não tenho certeza da contrapartida do iOS para isso no momento.

Quanto tempo você tem que correr? Como você sabe quando isso está acabando?

Devemos primeiro reunir as informações necessárias para o evento, algumas das quais são assíncronas (localização do GPS), e então registrar o evento em um armazenamento de dados online (Firebase). Todo esse processo pode durar até 30 segundos.

Que modelo de execução queremos para execução em segundo plano? (por exemplo, um isolado separado? Use o thread principal dart:ui?)

Não acho que isso importe para nós, não faremos nenhum cálculo caro.

Queremos dar suporte ao código em execução sem que o aplicativo (como em runApp) seja executado pela primeira vez?

Não tenho certeza das implicações aqui. Suponho que, como inicializamos nossa lógica de negócios e estado no aplicativo normal, seria melhor executar essas coisas primeiro, para que possamos utilizar relatórios de falhas etc.

Posso adicionar outro caso de usuário, essa funcionalidade é a única coisa que me impede de finalizar meu aplicativo. Eu tinha um aplicativo Android para isso e decidi criar uma versão mais nova e melhor que idealmente também funcionasse no iOS. Não estou familiarizado com os componentes no iOS (ao pesquisar descobri que as tarefas em segundo plano no iOS são muito mais restritas do que no Android), mas posso nomear os componentes do Android que usei.

Quais sinais podem acionar a execução do aplicativo?

A maior parte do código também é acionada por um alarme no AlarmManager.

No entanto, para iniciar esse alarme o tempo todo, algum código é executado na inicialização do dispositivo e também na atualização do pacote (android.intent.action.MY_PACKAGE_REPLACED) porque os alarmes anteriores seriam removidos.

Quanto tempo você tem que correr? Como você sabe quando isso está acabando?

Idealmente por menos de um segundo. Uma pequena solicitação de rede é feita e o resultado persiste, em alguns casos uma notificação é exibida. Depois disso o método retorna.

Que modelo de execução queremos para execução em segundo plano? (por exemplo, um isolado separado? Use o thread principal dart:ui?)

Não importa para mim também.

Queremos dar suporte ao código em execução sem que o aplicativo (como em runApp) seja executado pela primeira vez?

No meu caso, depois de executar uma vez, tudo bem, no entanto, se for possível algo como um receptor de inicialização, ele deve ser executado mesmo que o aplicativo não tenha sido iniciado antes.

https://stackoverflow.com/questions/41924890/how-do-i-run-code-in-the-background-even-with-the-screen-off é a pergunta de estouro de pilha mais vista do Flutter até onde posso contar. :) Definitivamente parece haver interesse neste espaço.

https://github.com/flutter/flutter/issues/6192 foi reativado para fornecer o suporte subjacente para realmente executar o código Dart quando um FlutterView não está renderizando.

Isso está em nosso radar de curto prazo, mas será em alguns meses, pelo menos.

Desculpe desatribuir @zanderso deste bug, eu pretendia atribuí-lo ao bug de execução em segundo plano subjacente (# 6192)

CC @kasperl; exploramos muitas maneiras de executar código em segundo plano em nossos vários destinos, e talvez alguns aprendizados possam ser extraídos disso.

@mit-mit você documentou suas descobertas de alguma forma?

Outro motivo para desejar o processamento em segundo plano é se você deseja criar um aplicativo de streaming de áudio. O usuário abre o aplicativo para iniciar um fluxo de áudio. O processo em segundo plano baixa o fluxo e reproduz o áudio final recebe eventos para iniciar/parar/pausar/ff/retroceder final envia eventos para alterar a interface do usuário, por exemplo, os metadados de áudio da barra de busca para a interface do usuário. Você precisa de um processo em segundo plano para quando o usuário deixar seus aplicativos ui, o download/reprodução do fluxo precisa continuar

Atualmente estamos trabalhando nisso. Sem ETA no momento.

@zanderso postou uma atualização aqui: https://github.com/flutter/flutter/issues/6192#issuecomment -342214725

@a-siva me informa que isso ainda está em andamento; O Android está funcionando e estamos trabalhando no iOS agora.

Temos um caso de uso para isso em que gostaríamos de rastrear a localização do usuário em segundo plano para registrar se eles foram ou não a um local específico em um horário específico (ou seja, durante um evento).

@bjornbjorn você não pode usar cercas geográficas para isso? não sei se o IOS tem algo semelhante, mas você pode conseguir esse Geofencing do Play Service

há alguma novidade @Hixie ? Atualmente, estou no estágio em que preciso que meu aplicativo seja executado como um serviço em segundo plano (a maior parte do aplicativo é escrito em Go), mas ele acaba sendo morto. Comecei a implementar o serviço de primeiro plano no lado Java, mas será muito desagradável se eu tiver que reimplementá-lo eventualmente para iOS.

Alguns estimam se isso estará disponível para Android na próxima semana ou no próximo mês seria muito apreciado :)

@rusenask conforme detalhado em https://github.com/flutter/flutter/issues/6192 , agora temos um plugin para isso no Android! Dê uma olhada em https://pub.dartlang.org/packages/android_alarm_manager e informe-nos se isso atende aos seus requisitos.

Parece promissor e eu provavelmente poderia mudar meu aplicativo do estilo "daemon" para mais como "explosões periódicas" com esse gerenciador de alarmes. Para acordar, consumir qualquer notícia e desligar.

No entanto, idealmente, eu usaria algo que permitisse que meu processo sempre fosse executado em primeiro plano. https://stackoverflow.com/questions/15758980/android-service-needs-to-run-always-never-pause-or-stop . Resumindo, meu aplicativo executa um bot, então quase sempre precisa ser executado.

Precisamos ter certeza de que documentamos isso antes de considerarmos isso feito.

Devemos abrir um novo problema de documentação?

@zanderso -- @mjohnsullivan é o melhor contato para o lado da documentação.

A ETA é conhecida?

@it2bz ETA para quê exatamente? Suporte no Android? Documentação? Suporte no iOS? Exemplos?

Suporte @Hixie no Android e iOS e pelo menos documentação básica com exemplos

Para iOS, você pode explicar exatamente o que gostaria? A Apple tem restrições estritas sobre o que os aplicativos podem fazer em segundo plano, por isso seria útil sabermos exatamente em quais APIs você deseja que nos conectemos.

Estou procurando oportunidade de trabalho em segundo plano com localização do usuário

Parece que este é o tópico 'perguntar coisas de fundo', então vou começar. Eu queria implementar um player de música usando o flutter, mas não tenho certeza se seria possível (API) manter a música tocando mesmo se o aplicativo for minimizado no telefone. Eu sei que no Android você pode iniciar um serviço que realmente pode continuar mesmo se o aplicativo for fechado. Em seguida, relançaria a atividade, se necessário. É algo semelhante possível no flutter agora?

@SirWindfield Sua melhor aposta seria usar a API nativa do media player de cada plataforma, que continuará sendo reproduzida separadamente do aplicativo.

@kirbyfan64 Achei que sim, obrigado!

@Hixie , uma solução como esta (Cordova): https://github.com/katzer/cordova-plugin-background-mode , ou assim (Swift): https://github.com/yarodevuci/backgroundTask seria bom para tarefas em segundo plano do Flutter.

@holospeed Essas são abordagens que a Apple provavelmente não deixaria você lançar, então acho que não gostaríamos de gastar tempo implementando isso nós mesmos. É certamente algo que convidamos você a implementar como um pacote de contribuição da comunidade no pub, se você se importa com aplicativos pessoais no iOS.

Talvez uma solução seja criar plugins de fundo específicos como um plugin para reprodução de áudio em segundo plano e um plugin para GPS/Localização em segundo plano etc. em vez de tentar criar um mecanismo de fundo abstrato que precise suportar tudo.

É possível executar um cronômetro em segundo plano que traz o aplicativo para o
primeiro plano em um determinado momento?

Em quarta-feira, 21 de março de 2018 às 08:49, Dylan Drost [email protected] escreveu:

Talvez uma solução seja criar plugins de fundo específicos como um
plugin para reprodução de áudio em segundo plano e um plugin para GPS/Localização
em segundo plano etc. em vez de tentar criar um plano de fundo abstrato
mecanismo que precisa suportar tudo.


Você está recebendo isso porque está inscrito neste tópico.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/flutter/flutter/issues/3671#issuecomment-374867947 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AK-c-E0KdEkvbH5uCBIM8FaAbYQkSU2tks5tghQWgaJpZM4IVsUk
.

@iBob101 Acredito que isso seja possível se você usar o plug-in android_alarm_manager em combinação com o plug-in android_intent .

No meu caso de uso, todas as tarefas em segundo plano que eu preciso são reproduzir áudio em segundo plano em um determinado momento, então acho que a sugestão @aegis123 é ótima, podemos começar pequeno e, com o tempo, fornecer um mecanismo que suporte qualquer processo em segundo plano

Eu também preciso disso para tocar música em segundo plano.

Estive olhando como isso foi feito no plugin android_alarm_manager e pelo que posso reunir, um código Dart é invocado no Android chamando runFromBundle . A função Dart invocada é especificada pelo ponto de entrada, mas e se essa função precisar que informações sejam passadas? Caso de uso de exemplo seria um aplicativo de bate-papo que permite respostas diretas por meio de notificações. De acordo com este link , a notificação permitirá a entrada remota, mas não parece ser possível passar o texto que foi lido para a função Dart para que possa ser processado para que a resposta possa ser enviada.

Outro exemplo é um aplicativo de e-mail que mostra uma notificação quando um novo e-mail é recebido, ações podem ser apresentadas, uma das quais pode ser a capacidade de arquivar o e-mail, o que é feito por uma função do Dart. No entanto, essa função precisaria saber qual e-mail precisa ser arquivado.

@MaikuB você pode fazer um PR para permitir que um dicionário seja passado e possa conter pares de valores-chave.

De um modo geral, porém, para o meu exemplo de uso, eu precisaria de algo semelhante ao componente Androids Service. E como o flutter não foi projetado para ter todas as APIs disponíveis que cada sistema operacional pode fornecer, pode ser uma ideia melhor escrever o aplicativo em kotlin/java ou swift.

Acredito que @bkonyi está atualmente analisando o que podemos fazer no iOS para esse problema.

Isso significa que não podemos ter serviço em segundo plano com o Flutter? Por exemplo: Um serviço para notificações push pop-up do servidor.

@s-bauer Sempre em execução não é uma coisa para Android, a menos que talvez notificações em primeiro plano, mas não encontrei menções de startForeground no seu código.

Não tenho certeza de quais são suas especificações, mas lembre-se de que os telefones Android entram em sono profundo depois de algumas horas com a tela desligada e sem serem movidos. Todos os serviços (exceto o primeiro plano) serão agendados da maneira que o sistema operacional achar melhor. Uma notificação por push vinda do FCM ou um alarme vindo do AlarmManager sob uma configuração específica são talvez as duas únicas coisas sob o controle de um desenvolvedor que são capazes de ativar um dispositivo/aplicativo Android sempre que o desenvolvedor desejar, mas não por um período indefinido de tempo. Tempo. Existem muitos outros métodos que dependem do que o sistema operacional achar melhor para a bateria. Consulte sobre o modo de sonolência para obter mais detalhes. https://developer.android.com/training/monitoring-device-state/doze-standby

No iPhone as coisas são muito mais restritas.

Também não vejo por que um serviço ou conexão deve permanecer ativo para receber notificações push do FCM ou APNS, talvez esteja faltando alguma coisa?

Atualização rápida: a execução em segundo plano para iOS foi implementada e está em revisão (PR flutter/engine#5539). Quando isso acontecer, começarei a atualizar a execução em segundo plano do Android para ter uma interface consistente e publicar um plug-in de exemplo. Esperamos que tudo isso seja feito até o final do mês.

@bkonyi isso também resolveria o problema com: https://github.com/flutter/flutter/issues/17566 ?

@piotrpalek , sim, será, embora o comportamento provavelmente seja um pouco diferente do que era anteriormente, pois não podemos mais compartilhar o isolamento da interface do usuário para retornos de chamada por vários motivos. Qualquer comunicação com a interface do usuário de primeiro plano terá que ser estabelecida em portas isoladas, MethodChannel s ou qualquer outro método que não dependa do compartilhamento de memória com o isolado principal.

Atualização de status: as alterações de execução em segundo plano do iOS e do Android estão em revisão e ainda estão sendo iteradas. Espero que as alterações do iOS em flutter/engine#5539 cheguem nos próximos dias, sem solicitações de grandes modificações, e as alterações do Android em flutter/engine#5640 devem ser feitas na próxima semana depois de lidar com os comentários da revisão. Obrigado por sua paciência!

Impressionante. Sim, eu tinha visto os PRs, pois ambos fazem referência a esse problema. Você mencionou fazer um plugin de amostra e eu vi o do iOS, haverá uma amostra do Android? Acho que o plug-in do gerenciador de alarmes do Android pode ser atualizado assim que as alterações entrarem

@MaikuB , sim, o plugin AlarmManager será atualizado assim que flutter/engine#5640 chegar e flutter/plugins#642 estiver completo.

Olá. Alguma atualização em relação a este tópico? A resolução foi adiada para o marco bucket7. Será que realmente vai pousar lá? Esta é uma funcionalidade crucial para o nosso projeto. Obrigado por qualquer resposta.

Infelizmente tive que mudar as prioridades por alguns dias, mas estou de volta a trabalhar nisso agora. Estamos _quase_ lá, então obrigado por ser tão paciente!

Agora que flutter/engine#5539, flutter/engine#5947 e flutter/engine#5954 chegaram, todas as funcionalidades necessárias para execução em segundo plano no Android e iOS são implementadas no mecanismo e devem entrar no repositório principal do Flutter durante os próximos rolo do motor. A documentação e os exemplos estão em andamento, e a correção do plugin android_alarm_manager está para revisão (flutter/plugins#642).

@bkonyi android_alarm_manager também funcionará em IOs agora?

@ianldgs , infelizmente não. O iOS não fornece nenhum tipo de mecanismo para executar código periodicamente, portanto, provavelmente não é possível criar uma implementação do iOS (consulte este post SO ). Muitas vezes, é possível atingir os mesmos objetivos usando um dos modos de execução em segundo plano limitados (por exemplo, alterações significativas de local, notificações push, alteração de estado do Bluetooth etc.).

@bkonyi , isso corrigirá um problema que estamos enfrentando atualmente por não podermos executar tarefas nativas em segundo plano por um longo período (3 minutos) no iOS?

Para esclarecer, aqui está o nosso problema atual...

Fundo:
Nosso aplicativo usa beacons Bluetooth para determinar quanto tempo alguém passa em um local. Escrevemos todo o nosso código beacon nativamente em AppDelegate.swift.

Emitir:
O Flutter parece desligar nosso aplicativo após alguns segundos quando estamos executando o código nativo em segundo plano depois de ser acordado por um evento de localização (region enter/exit neste caso), mesmo que estejamos estendendo nosso tempo de execução em segundo plano .

Por que achamos que está relacionado ao Flutter:
Testamos nosso código de beacon nativo com um aplicativo iOS nativo e não tivemos problemas para obter consistentemente 180 segundos de tempo de execução em segundo plano.

O que tentamos:
A única solução com a qual tivemos sucesso é colocar um atraso de 30 segundos no main() antes de runApp() quando nosso aplicativo foi iniciado em segundo plano. No entanto, isso tem causado outros problemas.

Desculpas, pela longa explicação, mas este é um grande problema para nós e estamos tentando lançar nas próximas semanas.

Nós realmente esperamos que essa correção resolva nosso problema também.

Por fim, para ser claro, não nos importamos muito em executar código de dardo em segundo plano. Em vez disso, nossa principal preocupação é não fazer com que o Flutter encerre prematuramente nosso aplicativo quando acordado em segundo plano.

Qualquer ajuda seria imensamente apreciada.

Obrigado!

@AndrewPetrovics , infelizmente, não acho que isso resolverá os problemas que você está vendo, pois essas alterações são principalmente para permitir a execução do código Dart em segundo plano. Não estou muito familiarizado com as políticas de execução em segundo plano do iOS, mas na verdade estou trabalhando em um plug-in de geofencing para Android + iOS que parece semelhante ao seu caso de uso, então ficarei atento ao problema que você está tendo uma vez Começo a parte do iOS hoje/amanhã.

@chinmaygarde , você sabe alguma coisa sobre os problemas que @AndrewPetrovics está enfrentando? Talvez valha a pena arquivar um novo problema para.

@bkonyi , soa bem. Acabamos encontrando uma solução alternativa por enquanto, mas é muito hacky. Vou criar um problema separado quando tiver uma chance.

Obrigado!

@bkonyi Posso perguntar, quando o android_alarm_manager 0.2.0 será implantado publicamente em pub.dartlang.org?

@ethael deve estar disponível agora, estava apenas esperando obter permissões para publicar a atualização.

Existem exemplos ou alguma documentação disso disponível?
Obrigado!

@Solban há dois exemplos no repositório flutter/plugins:

Eu também tenho um plugin de geofencing em andamento que tem suporte para Android (Kotlin) e iOS (Obj-C), mas não tenho certeza se isso vai viver em flutter/plugins ou não.

Aqui está uma documentação útil para a funcionalidade relacionada à execução em segundo plano:

  • A classe PluginUtilities para passar callbacks entre isolados
  • O IsolateNameServer que é útil para registrar objetos SendPort com Flutter para outros isolados pesquisar (isso parece estar faltando documentação real, mas a interface é bastante direta).
  • O FlutterNativeView que é usado para gerar o isolado de fundo para o plug-in no Android
  • O FlutterHeadlessDartRunner que é usado para gerar o isolado de fundo para o plug-in no iOS

Atualmente não há documentação formal sobre como escrever plugins com recursos de execução em segundo plano. No entanto, deve haver uma postagem no Medium no blog Flutter aparecendo nas próximas semanas, que percorrerá o processo de design, implementação e uso de plugins que utilizam execução em segundo plano.

Existe alguma solução para o trabalho contínuo em segundo plano? A única maneira correta de executar continuamente algum código de longa execução no Android é Foreground service .
O exemplo de caso de uso seria continua o rastreamento de localização por GPS.

@audkar atualmente não há plugin que possa lidar com trabalho contínuo em segundo plano, mas isso não significa que não possa ser feito. Um plug-in utilizando a funcionalidade que mencionei acima em combinação com um serviço de primeiro plano (em vez do JobIntentService que usei para o plug-in de geofencing) funcionaria bem.

Atualmente, estou portando meu SDK de Geolocalização em segundo plano do iOS/Android/Geofencing para o Flutter. Será chamado flutter_background_geolocation .

Eu tenho cerca de 5 dias de experiência com Dart / Flutter, mas eu entendo. Ele deve estar pronto em 2 semanas (embora os documentos demorem um pouco mais com exemplos específicos do Dart).

Este SDK tem quase 5 anos e é suportado em tempo integral. Ele foi originalmente desenvolvido para Apache Cordova , depois portado para React Native e NativeScript . Também funciona em aplicativos nativos puros. Sob o capô, é a mesma biblioteca principal Obj-c + Java usada com cada plataforma de desenvolvimento.

O SDK foi originalmente desenvolvido para rastrear socorristas em zonas de desastre (por exemplo: furacões, terremotos) em um ambiente onde a rede de células provavelmente está destruída. Ele tinha que continuar rastreando mesmo que o aplicativo fosse encerrado ou o dispositivo reiniciado. O plug-in contém seu próprio banco de dados SQLite e serviço HTTP para carregar automaticamente locais para o seu servidor. Isso é particularmente importante para o Android no caso em que o aplicativo foi encerrado, deixando apenas o serviço de primeiro plano do SDK em execução "sem cabeça".

:warning: Este SDK não foi projetado para aplicativos sociais. ele foi projetado especificamente para casos de uso de "rastreamento de frota" (por exemplo: táxi, serviço de entrega, resposta a emergências, corrida, etc).

Aqui está um breve vídeo de demonstração .

Veja a Filosofia de Operação .

Edit Eu também portarei outra biblioteca como flutter_background_fetch , que será incluída como uma dependência de flutter_background_geolocation . Este módulo ativará um aplicativo iOS/Android em segundo plano a cada 15 minutos, fornecendo 30s de tempo em segundo plano para você realizar trabalhos periódicos. Veja a versão react-native para mais informações.

Ok, publiquei flutter_background_geolocation . Provavelmente ainda há alguns buracos para plugar na fachada para as bibliotecas nativas e os exemplos em documentos precisam ser traduzidos da versão React Native.

@christocracia boas notícias. e quanto a busca de fundo? alguma estimativa sobre isso?

@ethael Fetch chegará em cerca de mais 2 semanas. É um plugin muito simples.

@bkonyi Eu tentei seu plugin de mudança de localização para experimentar a execução em segundo plano. Parece que o callback de dart executado a partir do headless runner não pode usar outros plugins, falhando com MissingPluginException .

No Android, com o plugin android_alarm_manager você resolveu esse problema com AlarmService.setPluginRegistrant(this); para registrar internamente os plugins do serviço em segundo plano. Mas não vejo como alcançar o equivalente para iOS.

Atualmente, é possível chamar outros plugins de um headless runner no iOS? Se sim, como podemos registrar plugins nesse contexto?

@bkonyi Este problema não foi resolvido e deve ser reaberto. O AlarmManager parece ser uma solução alternativa, na melhor das hipóteses, porque ele suporta apenas eventos cronometrados. O Flutter precisa de algo mais genérico, para que você possa ouvir determinados eventos, como o dispositivo Bluetooth ao alcance, por exemplo. E precisa suportar melhor o iOS. Eu entendo que o iOS é muito mais restritivo, mas o Flutter deve suportar as coisas que estão disponíveis para programadores nativos.

Eu estava animado para começar com o Flutter, mas parece que há muitos problemas como esse que o tornam inutilizável para todos os aplicativos, exceto os mais simples. Eu esperava mais do Google, e acho injusto da parte deles esperar que os desenvolvedores façam plugins para preencher as principais lacunas que deixaram.

@dude8604 O Google não vai fornecer tudo e sim, cabe aos desenvolvedores de plugins de terceiros (como eu) contribuir com plugins para o ecossistema. Estou trazendo dois atualmente.

Passei muito tempo com Cordova, React Native e NativeScript. Depois de 2 semanas com o Flutter, acho que é excelente, embora certamente haja buracos (um componente de mapa de plataforma cruzada, por exemplo, com o qual tenho certeza que contribuirei em um futuro próximo).

Sou um desenvolvedor profissional de plugins especializado em operação em segundo plano de iOS e Android (geolocalização e geofencing, em particular) nos últimos 5 anos. O que você gostaria de saber?

@christocracy Concordo que é necessário haver plugins de terceiros, mas a execução em segundo plano ou pelo menos poder registrar funções de retorno de chamada para determinados eventos parece algo que uma estrutura de aplicativo deve fornecer. Meu problema não é ter que criar plugins para estender a funcionalidade principal, mas liberar um framework que está faltando recursos básicos e esperar que os desenvolvedores ofereçam seu tempo a uma empresa com fins lucrativos para preencher as lacunas. Enfim, este não é o lugar certo para discutir isso.

Quero executar um serviço em segundo plano e ler determinados eventos, processar e possivelmente gravar os dados e, se apropriado, criar uma notificação que iniciará o aplicativo principal se pressionado. Alguns exemplos dos eventos seriam: novo dispositivo Bluetooth no alcance, dados de entrada em um soquete, dados de entrada de um dispositivo USB, SMS recebidos, localização do GPS alterada, tentativa de conexão do dispositivo Bluetooth, um determinado botão físico é pressionado, dados do acelerômetro excedem um valor especificado, se o aplicativo principal for encerrado e muitas outras coisas em que não estou pensando. Se alguém pudesse fazer um plugin abrangente (com uma licença gratuita ou de código aberto) para isso que funcionasse em iOS e Android, acho que esse problema poderia ser encerrado. E eu ficaria eternamente grato por poder começar a desenvolver com o Flutter.

@dude8604 Acho que sei o que você quer. Fazer muito disso obviamente requer um serviço em primeiro plano, com sua notificação persistente necessária. O usuário está ciente de seu serviço em execução.

Entre em contato comigo através do meu perfil do github.

Considere que o React Native era basicamente como "você obtém botões, campos de texto e uma exibição de lista, o resto é com você" e cresceu para o que é agora por causa da comunidade. O Google não pode lidar com todas as implementações e é insano pensar que a equipe do Flutter será capaz de replicar todas as funcionalidades fornecidas pelo Android e iOS quando essas funções estiverem sendo adicionadas por equipes 100x (10.000x?) do tamanho do Flutter.

O android_alarm_manager e image_picker não parecem funcionar (se ambos estiverem instalados) depois de implementá-lo em um novo projeto executando Flutter 0.8.3-pre.47 . O aplicativo força o fechamento. O exemplo está funcionando, então copiei tudo no exemplo e configurei meu firebase, mas ainda não funciona.

Para adicionar o problema que o @deckerst levantou, não tenho certeza se é apropriado considerar isso fechado quando não há paridade entre Android e iOS em relação à capacidade de executar código que usa outros plugins

Edit: acabei de notar que há outro problema para rastrear isso

Só assim este artigo é referenciado aqui para aqueles que não o viram:
https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124

Obrigado @slightfoot. Vi isso e foi aí que encontrei o ticket (#21925) para fazer com que a execução sem cabeça do iOS funcionasse com plugins. Ter uma referência entre esses dois tickets seria útil.

Em uma nota relacionada, existe um plano para ter a execução sem cabeça incluída na documentação oficial, por exemplo, como parte do livro de receitas? Eu suponho que sim, mas achei que vale a pena perguntar, já que provavelmente uma parte maior da comunidade não saberia verificar o meio

Bom ponto @MaikuB , adicionou um bug doc para isso!

Suporte em segundo plano diretamente no flutter, consulte https://www.youtube.com/watch?v=_LfjILXswJs

Eu não entendo muito bem. Se o Flutter agora suporta execução em segundo plano, por que o tutorial tem principalmente código específico da plataforma?

Obtenha o Outlook para Android https://aka.ms/ghi36


De: tonka [email protected]
Enviado: sexta-feira, 21 de setembro de 2018 03:39:28
Para: vibrar/flutuar
CC: Philip Weiss; Menção
Assunto: Re: [flutter/flutter] Flutter deve fornecer uma abstração para execução em segundo plano (#3671)

Suporte em segundo plano diretamente no flutter, consulte https://www.youtube.com/watch?v=_LfjILXswJs


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423490126 ou silencie o tópico https://github.com/notifications/unsubscribe-auth/ABWxFrGMGvfFtwkf025Q2Je6lUTZu2aPks5udMHggaJpZM4IVsUk .

@dude8604 o tutorial é para desenvolvedores de plugins que desejam desenvolver um plugin para realizar alguma operação em segundo plano específica.

Os consumidores de algum plugin específico são cegos (tanto quanto possível) às implementações específicas da plataforma.

Então, como consumidor, existe uma maneira de executar código arbitrário em segundo plano, se não houver um plug-in para meu caso de uso específico?


De: Chris Scott [email protected]
Enviado: sábado, 22 de setembro de 2018 17:43:16
Para: vibrar/flutuar
CC: Philip Weiss; Menção
Assunto: Re: [flutter/flutter] Flutter deve fornecer uma abstração para execução em segundo plano (#3671)

@dude8604 https://github.com/dude8604 o tutorial é para desenvolvedores de plugins que desejam desenvolver um plugin para realizar alguma operação em segundo plano específica.

Os consumidores de algum plugin específico são cegos (tanto quanto possível) às implementações específicas da plataforma.


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423783230 ou silencie o tópico https://github.com/notifications/unsubscribe-auth/ABWxFhmlurQ08wWXLmMvE3E6yQ_lYvS1ks5udtkkgaJpZM4IVsUk .

@dude8604 Não.

Pelo que sei atualmente:

Você não pode "executar código arbitrário em segundo plano". O Android é rigoroso agora . iOS sempre foi.

@dude8604 , @christocracy está correto. A funcionalidade de execução em segundo plano demonstrada no artigo do Medium é direcionada a desenvolvedores que desejam criar plug-ins que possam executar código Dart em segundo plano. A maioria dos usuários do Flutter nunca precisará escrever código específico da plataforma para execução em segundo plano, a menos que não haja um plug-in existente que corresponda ao seu caso de uso, pois esses plug-ins abstrairão o código específico da plataforma por trás de uma interface Dart.

O android_alarm_manager e image_picker não parecem funcionar (se ambos estiverem instalados) depois de implementá-lo em um novo projeto executando Flutter 0.8.3-pre.47 . O aplicativo força o fechamento. O exemplo está funcionando, então copiei tudo no exemplo e configurei meu firebase, mas ainda não funciona.

@rupert2133 você se importaria de registrar um problema com mais informações? Sinta-se à vontade para me mencionar para que eu seja notificado. Esse problema era para o requisito mais amplo de execução em segundo plano do código Dart e está fechado, portanto, quaisquer respostas adicionais aqui provavelmente serão enterradas.

O android_alarm_manager e o image_picker parecem não funcionar (se ambos estiverem instalados) após

Isto me lembra. Ontem ao implementar o Headless Android no meu plugin, tive um erro vindo de googlemaps aqui .

Quando todos os plugins forem registrados novamente no estado Headless, registrar.activity() == null .

Eu tive que hackear manualmente isso para inicializar meu aplicativo:

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));
+    }
  }

Isso vai ser um problema com um grande número de plugins, eu suspeito.

Quero executar um serviço em segundo plano e ler determinados eventos, processar e possivelmente gravar os dados e, se apropriado, criar uma notificação que iniciará o aplicativo principal se pressionado. Alguns exemplos dos eventos seriam: novo dispositivo Bluetooth no alcance, dados de entrada em um soquete, dados de entrada de um dispositivo USB, SMS recebidos, localização do GPS alterada, tentativa de conexão do dispositivo Bluetooth, um determinado botão físico é pressionado, dados do acelerômetro excedem um valor especificado, se o aplicativo principal for encerrado e muitas outras coisas em que não estou pensando. Se alguém pudesse fazer um plugin abrangente (com uma licença gratuita ou de código aberto) para isso que funcionasse em iOS e Android, acho que esse problema poderia ser encerrado. E eu ficaria eternamente grato por poder começar a desenvolver com o Flutter.

@bkonyi Então, quais das coisas acima posso fazer atualmente com os plugins existentes? Posso usar o AlarmManager para pesquisar esses eventos? Mas o AlarmManager não funciona no iOS, certo?

@dude8604 O melhor que você obterá para eventos periódicos no iOS é por meio da API "background-fetch". Eu estarei portando este plugin para flutuar em breve.

A API "Background Fetch" do iOS despertará um aplicativo adormecido em segundo plano a cada 15 minutos (este é o intervalo mais rápido possível ), fornecendo ao seu aplicativo exatamente 30 segundos de tempo de execução em segundo plano. No entanto, o iOS usa aprendizado de máquina (presumivelmente) e limitará isso com base na hora do dia e na frequência de uso do dispositivo/aplicativo (por exemplo: à noite, quando o usuário provavelmente está dormindo, os eventos de busca podem ocorrer uma vez por hora.

@christocracy @bkonyi Então, tudo isso e seus equivalentes no Android podem ser transformados em um plug-in? Como posso fazer uma solicitação de recurso para isso?

@dude8604 Você não pode simplesmente balançar uma varinha mágica e *poof* . Você vai colocar suas luvas de trabalho e fazer você mesmo. Se você não pode fazer isso sozinho, você encontra alguém que pode e você paga dezenas de milhares de dólares.

@christocracy Você está certo, mas eu esperava que uma das maiores corporações do mundo tivesse os recursos para desenvolver um produto completo e não exigir que seus usuários gastassem dezenas de milhares de dólares para torná-lo utilizável o suficiente.

Bem, sim, é uma grande corporação.

A referida corporação também é composta por pessoas físicas, que não são onipresentes. Nenhum framework pode cobrir tudo pronto para uso, porque se você tentar, seu projeto vai se transformar em uma pilha de lixo... bem, lixo.
Existem centenas de APIs específicas de plataforma e nenhuma equipe irá cobri-las. Você terá que amarrar alguns você mesmo.

@dude8604 Considere que sua definição de "totalmente caracterizado" não é a mesma que a minha. Sua responsabilidade é lidar com a interseção.

1 f you write this

Temos uma direção clara dos documentos? Eu vi o Release Preview 2 dizendo que ele tem suporte para execução em segundo plano. Alguns exemplos seriam bons para ir.

A execução em segundo plano do @Pushan-Gupta é uma coisa específica do plug-in.

Depende do que você quer fazer. Rastrear localização? Receber notificações push? Monitorar geofences? Detectar dispositivos BT? Sinalizadores? Tocar música?

Não há “um anel para governar todos eles, suporte para execução em segundo plano”

@christocracy Desculpe, eu não sabia disso. Eu estava apontando para uma coisa específica. Digamos que eu queira fazer algumas solicitações de postagens do aplicativo. Mas a conexão está desligada. Assim que o dispositivo voltar a ficar online, independentemente de o aplicativo estar aberto ou não, a fila dessas solicitações de postagens deve ser processada.

Exemplo: o Whatsapp enfileira as mensagens antes de enviá-las ao servidor. Se o dispositivo estiver offline, ele armazena a fila e a atende assim que estiver online.

BTW, eu tenho um PR em andamento, discutindo o registro de plugins para isolados em segundo plano. Se alguém tiver alguma opinião...

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

Qual é o ponto de FlutterHeadlessDartRunner atualmente?
Eu implementei a execução em segundo plano no Android atualmente (sem plugin apenas FlutterNativeView(ctx, true) ), e isso foi um pouco fácil de fazer.
Mas no iOS está apenas travando

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
}

Ei,
Por favor, ajude no aplicativo de lembrete no flutter ios

@MohdLucky E a ajuda que você precisa é ..?

@christocracy você tem atualização sobre o estado de implementação do plugin background_fetch, por favor?

não atualizar o estado de implementação do plug-in background_fetch , forneça algum código de exemplo para
executando a notificação em segundo plano.

Qualquer atualização sobre isso ... eu realmente pensei que isso faz parte do flutter :( .. isso é praticamente os mesmos problemas que outras soluções híbridas da Web ...

@radvansky-tomas Eu não sei por que as pessoas simplesmente não entendem que isso não é da responsabilidade dos flutters. Mesmo se você tiver que implementar a execução em segundo plano nativamente, ainda terá a vantagem de uma única base de código. Escrever um plugin de vibração que faça seu trabalho em segundo plano leva apenas um ou dois dias de trabalho. Eu tive o mesmo problema, precisava de um serviço Android que fosse capaz de tocar música para mim. Acabei de escrever em kotlin, implementei a camada de comunicação usando flutter e depois fiz o mesmo para iOS.
É totalmente possível usar apenas os sistemas em segundo plano nativos dos sistemas.
Em vez de reclamar por aqui que o X não está implementado, você pode implementá-lo literalmente sem nenhum problema usando o ecossistema fornecido pela equipe.

@SirWindfield Infelizmente você não sabe do que está falando. Isso é parte essencial da arquitetura, não do plugin em si.

O Flutter é apresentado como uma solução multiplataforma produzindo código nativo, ou seja, há expectativa de que ele possa executar código em sua linguagem (Dart) sempre que o SO permitir.

Portanto, se o aplicativo estiver em execução após o recebimento da notificação remota e você puder colocar o ponto de interrupção no código nativo existente, poderá chamar seu código de vibração/dart onde estão seus serviços, modelos e, finalmente, a interface do usuário.

Para fazer isso no seu caso... digamos que sua música está tocando em segundo plano e então você termina sua lista de reprodução... após 10 minutos é o desligamento do aplicativo. Então você liga para a siri ou usa fones de ouvido para iniciar a reprodução novamente do seu aplicativo, qualquer que seja o ponto de entrada escolhido... o código nativo é executado, mas não a interface do usuário, seu código de vibração não é inicializado e você está perdido como estou com minhas notificações.

Portanto, não, não é possível, posso escrever uma notificação de captura de plug-in nativo para mim, mas preciso acessar a lógica de negócios de vibração para processar dados, no meu caso, descriptografia de criptografia e liberação de notificação local com conteúdo descriptografado

Vamos, eu testei no meu telefone extensivamente e funciona sem problemas.
Pode ser que meu telefone nunca tenha matado o aplicativo. Meu mal então.

@christocracy alguma atualização sobre o plugin background_fetch Chris?

@ethael Aqui está o repositório vazio para você ficar de olho nas atualizações.
https://github.com/transistorsoft/flutter_background_fetch

@radvansky-tomas você pode manipular eventos em segundo plano no código Dart criando um isolado de segundo plano conforme descrito nesta postagem do Medium sobre execução em segundo plano . Você provavelmente precisará escrever algum código nativo para cada plataforma para atender às suas necessidades específicas, a menos que já exista um plug-in que faça o que você deseja (improvável, pois desconheço muitos plug-ins que suportam execução em segundo plano no momento).

@bkonyi Obrigado pela resposta, comecei a alterar o plugin firebase_messaging para suportar a execução em segundo plano ... mas este problema é mais sobre uma maneira genérica de fazer isso. Quero dizer, deve ser parte de template = runner e seu lado de dardo, onde os desenvolvedores podem executar esse código sem cabeça, algumas regras, padrão de padrão como agora está em alguns blogs, sugestões etc.

Alguns trabalhos iniciais realizados: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging

Seguindo alguns guias de https://github.com/bkonyi/FlutterGeofencing

Devo terminá-lo até o final desta semana, estou trabalhando apenas em bits do iOS por enquanto. O projeto de exemplo está usando o plug-in de notificação local para mostrar que a mensagem foi recebida em segundo plano (notificação silenciosa) e, em seguida, liberar um novo local, para manifestar o sucesso.

Alguns trabalhos iniciais realizados: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging

Seguindo alguns guias de https://github.com/bkonyi/FlutterGeofencing

Devo terminá-lo até o final desta semana, estou trabalhando apenas em bits do iOS por enquanto. O projeto de exemplo está usando o plug-in de notificação local para mostrar que a mensagem foi recebida em segundo plano (notificação silenciosa) e, em seguida, liberar um novo local, para manifestar o sucesso.

@goderbauer e eu estávamos realmente procurando adicionar esse suporte, mas ficaríamos mais do que felizes em ajudá-lo com o design e as revisões, se você planeja fazer uma solicitação de pull.

Então eu praticamente terminei essa parte, então agora posso receber notificações push silenciosas e meu retorno de chamada escrito em dardo é executado enquanto o aplicativo está em segundo plano.

No entanto, não consigo acessar nenhum outro plugin lá. O retorno de chamada deve ser o método raiz/estático e realmente não entendo como chamar nada de lá.

Então eu tentei fazer um teste simples, usar o plugin de notificação local do flutter para enviar uma notificação local depois que um silencioso é recebido, mas o plugin parece não estar acessível (não registrado?)

Encontrei postagens semelhantes aqui: https://github.com/flutter/engine/pull/6396

Existe algum outro passo necessário, que eu tenha que fazer para carregar esses plugins?

Meu retorno de chamada de nível raiz:
void callback(FirebaseMessage m, MessageEvent e) async { print('Message $m Event: $e'); final SendPort send = IsolateNameServer.lookupPortByName('messaging_send_port'); send?.send(e.toString()); }

A questão não é como acessar todo o código de dardo + plugins desse retorno de chamada ... consulta firestore, etc

A implementação do My Background Fetch foi finalmente lançada.
background_fetch

@christocracy Você está certo, mas eu esperava que uma das maiores corporações do mundo tivesse os recursos para desenvolver um produto completo e não exigir que seus usuários gastassem dezenas de milhares de dólares para torná-lo utilizável o suficiente.

Isso é tão verdade. Se você conseguir o tempo das pessoas, você deve devolver algo a elas. Se não, então não faça esses títulos de marketing extravagantes!

Parece que esse problema ainda está causando problemas às pessoas? Está fechado e tem muitos comentários, então é improvável que façamos muitas mudanças concretas no projeto a partir desta edição. :( (Precisaremos arquivar novos para fazer mais progresso, espero.)

Eu estaria muito interessado em documentar as mudanças concretas desejadas aqui. Parece que mais exemplos de fundo são desejados? (por exemplo, https://github.com/flutter/flutter/issues/23794)

De qualquer forma, adoraríamos ter problemas individuais arquivados com solicitações individuais. Como outros notaram acima, o Flutter é um projeto grande e complexo e, embora tenhamos uma equipe grande (e em rápida expansão) aqui no Google, ainda não temos engenheiros suficientes trabalhando em tempo integral no Flutter para responder a todos os problemas simultaneamente. O Flutter é 100% de código aberto e todos os nossos problemas estão no GitHub. Patches são sempre bem vindos, claro. :)

Para qualquer problema/alteração desejado, registre novos problemas para que todos os contribuidores saibam como podemos ajudar ainda mais: https://github.com/flutter/flutter/issues/new

Obrigado!

Desafio @eseidel aceito: #24278

Eu esperava evitar escrever código específico do dispositivo e ter uma implementação da API Flutter Dart talvez com base em eventos que ocultariam as especificações do dispositivo e do sistema operacional e a implementação específica.

ja resolveu aqui

@ Krunal79-flutter como exatamente, essa abordagem ainda teria os mesmos problemas. O problema é que, no seu cenário, o flutter já foi inicializado e o acesso em segundo plano não é adequado. O problema que eu tinha e tenho é quando o aplicativo está realmente morto e a notificação silenciosa (ou extensão do aplicativo) ativa seu aplicativo e você precisa executar a lógica "dart" enquanto o flutter ainda não está em execução (ou seja, nenhuma interface do usuário presente).

Isso realmente deveria ser uma questão de prioridade muito maior para quem está gerenciando a equipe Flutter. A implementação da funcionalidade em segundo plano é uma grande dor para o desenvolvedor médio do Flutter e muitas vezes é quebrada de maneiras não triviais. E tenho certeza de que muitos desenvolvedores de aplicativos estão lutando com isso.

@tomoerlemans010 , veja o comentário em https://github.com/flutter/flutter/issues/3671#issuecomment -438113161.

Este problema específico foi encerrado, adicione comentários a outros problemas em aberto relacionados à execução em segundo plano ou crie um novo com os problemas que você está enfrentando.

Esta página foi útil?
0 / 5 - 0 avaliações