Flutter: Flutter должен предоставлять абстракцию для фонового выполнения.

Созданный на 2 мая 2016  ·  139Комментарии  ·  Источник: flutter/flutter

Клиенты хотели бы выполнять код дротика в качестве фоновых процессов как на iOS, так и на Android для таких вещей, как синхронизация данных, когда Wi-Fi доступен, но приложение не открыто и т. д.

@mpcomplete создал фоновый процесс на Android для выполнения кода Dart для обновления флаттера. Но я не знаю о параллели на iOS.

Эта проблема отслеживает разработку API в плагинах или иным образом. Поддержка движком этих абстракций отслеживается по адресу https://github.com/flutter/flutter/issues/6192.

truckable wellbeing engine framework plugin new feature

Самый полезный комментарий

Быстрое обновление: фоновое выполнение для iOS реализовано и находится на рассмотрении (PR flutter/engine#5539). Как только это произойдет, я начну обновлять фоновое выполнение Android, чтобы иметь согласованный интерфейс, и опубликую образец плагина. Все это, надеюсь , будет сделано к концу месяца.

Все 139 Комментарий

Должен ли код, работающий в фоновом режиме, быть написан на Dart или на Java/Objective-C?

Это возникло в связи с желанием обновить локальную модель данных, когда подключение было доступно. например, карты метро/время, когда вы можете входить/выходить из метро. Так что я думаю, что цель будет состоять в том, чтобы исполняемый код был Dart, поэтому вам не нужно было иметь отдельный код манипулирования моделью данных для каждой платформы.

CC @kasperl; мы исследовали множество способов выполнения кода в фоновом режиме для различных целей, и, возможно, из этого можно извлечь некоторые уроки.

Есть ли у нас какие-то варианты использования от наших пользователей? Единственное, что я слышал, было: «Мы хотим запустить некоторый код на устройстве в ответ на push-сообщение. Мы хотим синхронизировать данные на устройстве, даже если приложение не открыто».

Как правило, довольно ограничено, что на самом деле разрешено делать приложению в фоновом режиме, поэтому в этом случае я думаю, что мы можем получить вдохновение для вариантов использования оттуда. Например, вот модель iOS:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Я считаю, что это та же ошибка, что и # 6192, да.

Добавление листового тега и значения вехи из # 6192

@mravn-google @sigurdm есть над чем подумать!

Поручение Миккелю провести самое первоначальное расследование, чтобы лучше понять осуществимость и стоимость.

Вот обновление от Leafy:

Из-за ограничений уведомлений о данных (т. е. уведомлений, которые требуют, чтобы приложение каким-то образом реагировало), leafy склоняется к использованию отображаемых уведомлений (т. е. уведомлений, которые выводятся непосредственно на экран пользователя без участия приложения). Их поддержка уже существует во Flutter.

Однако во время разговоров с другими командами всплыл еще один вариант использования: если вы хотите поддерживать носимые устройства или виджеты [домашний экран] из своего приложения, вам нужно будет написать пользовательский интерфейс в собственном коде, поскольку эти поверхности еще не поддерживаются Flutter. Тем не менее, было бы неплохо иметь возможность «разбудить приложение и запросить данные», чтобы уровень модели и бизнес-логика могли быть разделены между приложением флаттера и носимым приложением. Поскольку я никогда не писал ни одного из них, я не уверен, как это делают существующие нативные приложения, но это, безусловно, похоже на допустимый вариант использования для фоновых задач.

Только что разговаривал с автором выступления Flutter на Berlin DroidCon, и это был один из его главных вопросов. «Как это сделать, метод флаттера»

Чтобы было ясно, в настоящее время можно писать фоновые процессы как часть приложения, использующего Flutter. Однако эти процессы могут выполнять только код Obj-C/Swift или Java/Kotlin. Эта ошибка связана с исправлением ограничения в нашем движке, позволяющим выполнять код Dart в этих фоновых процессах, а также, возможно, предоставлением абстракции, позволяющей планировать такую ​​​​фоновую работу из Dart (вероятно, это относится к плагину после того, как FlutterView-needs-to- снято ограничение на присутствие на экране).

https://github.com/flutter/flutter/issues/6192#issuecomment -258928555 обсуждает текущее ограничение движка и наше намерение его решить. К вашему сведению @а-шива

Это также связано с (дубликатом?) https://github.com/flutter/flutter/issues/5048.

У нас есть вариант использования, о котором я не упоминал: мы отслеживаем местоположение каждые 5 секунд, и к этому событию прикрепляется определенная другая информация, вся бизнес-логика которой реализована в Dart. Если наш пользователь выводит другое действие на передний план, нам нужно отображать постоянное уведомление и продолжать запускать этот код Dart каждые 5 секунд.

Это блокировщик для нас. Мне было бы интересно узнать о каких-либо обходных путях, которые мы могли бы реализовать на данный момент, так как это задержит отгрузку.

Я бы попытался просто оставить таймер активным и посмотреть, что произойдет. Я бы не подумал, что это будет надежно, но наше приложение также имеет вариант использования одноразовой очистки кеша (через 15 минут после того, как приложение было переведено в фоновый режим), и мы видели, как оно успешно выполнялось. Мы планируем это, пока приложение останавливается в Dart. Что-то вроде этого:

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

Это не сработает, если:

  • Приложение явно убито пользователем (например, из переключателя задач).
  • Приложение убивает ОС из-за нехватки памяти.
  • На iOS? Я не думаю, что мы пробовали это, поэтому, пожалуйста, не стесняйтесь попробовать и сообщить.

Я не уверен в аналогах iOS, но на Android можно создать плагин флаттера, который запускает службу переднего плана, что дает процессу более высокий приоритет и снижает вероятность его уничтожения в периоды, требующие ресурсов. Будет ли это также давать долгоиграющему таймеру Dart больше шансов на выживание?

Да, это может помочь, так как ваша активность (таким образом, ваш флаттер-вид) останется активной. Я все еще не уверен, что у нас достаточно ясности, чтобы сделать плагин.

Если речь идет о поддержке периодического фонового опроса информации, может быть лучше разработать плагин именно для этого. Это должно позволять регистрировать обратный вызов в Dart, который вызывается через таймер в собственном коде, а не реализовывать таймер в Dart. Мы могли бы сделать это с сервисом на Android.

ИЛИ

Мы могли бы просто иметь руководство по созданию приложений KeepAlive™ Flutter.

В iOS вы можете установить UIBackgroundMode в Info.plist , чтобы уменьшить вероятность того, что приложение будет уничтожено.

На Android настройте пустой сервис. В основном это изменение AndroidManifest.xml + тривиальная реализация класса обслуживания.

Общий плагин KeepAlive, похоже, не работает, поскольку он по-прежнему требует ручной настройки на iOS, и неясно, использовать ли службу переднего плана/фона на Android (службу переднего плана сложнее убить, но требуется постоянное уведомление).

Даже со службой переднего плана ОС может убить наш процесс по любой причине.

Я считаю, что идеальное решение должно использовать диспетчер тревог Android, который предназначен для случаев, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в данный момент не запущено. Но даже при этом, как мы можем перезагрузить процесс Dart с тем же состоянием, если у нас будет зарегистрированный пользователь Firebase, выполняющий аутентифицированную запись в базу данных?

@pauldemarco, следовательно, эта ошибка ... У Flutter сейчас нет возможности выполнить код Dart в любом состоянии без запущенного FlutterView. Это включает в себя Alarm Manager, синхронизацию данных носимых/родных виджетов или push-уведомления (хотя вариант использования последнего постепенно уходит https://github.com/flutter/flutter/issues/6192).

Я думаю, что проблема _same state_ должна решаться на уровне приложения, а не на уровне Flutter. Для нативных приложений у вас та же проблема. После того, как процесс мертв, вы не можете восстановить состояние, если не сохраните его где-нибудь (например, в общих настройках или sqlite). Предположительно, вы бы сделали то же самое в своем коде Dart. Одна вещь, которую может сделать Flutter, — это передавать сообщения, такие как applicationWillTerminate на iOS и onSaveInstanceState на Android, чтобы вы могли подготовиться к этому.

Вопросы:

  • Каковы модели iOS и Android для фонового выполнения?

    • Какие сигналы могут запускать приложение?

    • Как долго вы должны бежать? Откуда вы знаете, когда это заканчивается?

  • Какую модель выполнения мы хотим для фонового выполнения? (например, отдельный изолят? Использовать основной поток dart:ui?)
  • Хотим ли мы поддерживать код, работающий без первого запуска приложения (как в runApp )?
  • Можем ли мы составить канонический список вариантов использования?

В настоящее время это не планируется в ближайшем будущем. Это большой процесс, нам нужно будет переместить что-то еще из нашего краткосрочного списка приоритетов, чтобы сделать это в ближайшее время.

Вариант использования
У нас есть разные режимы работы, которые записывают события с разным интервалом (5 секунд, 10 минут, 30 минут, 6 часов). Нам нужен способ убедиться, что процесс ведения журнала выполняется независимо от того, запущено приложение в данный момент или нет.

Какие сигналы могут запускать приложение?

На Android это будет через PendingIntent, который отправляется из запланированного будильника в AlarmManager.
На данный момент я не уверен в аналоге iOS для этого.

Как долго вы должны бежать? Откуда вы знаете, когда это заканчивается?

Сначала мы должны собрать необходимую информацию для события, часть из которых является асинхронной (местоположение GPS), а затем записать событие в онлайн-хранилище данных (Firebase). Весь этот процесс может длиться до 30 секунд.

Какую модель выполнения мы хотим для фонового выполнения? (например, отдельный изолят? Использовать основной поток dart:ui?)

Я не думаю, что это важно для нас, мы не будем делать никаких дорогостоящих вычислений.

Хотим ли мы поддерживать выполнение кода без предварительного запуска приложения (как в runApp)?

Я не уверен в последствиях здесь. Я полагаю, что, поскольку мы инициализируем нашу бизнес-логику и состояние в обычном приложении, было бы лучше сначала запустить этот материал, чтобы мы могли использовать отчеты о сбоях и т. д.

Я могу добавить еще один юзеркейс, эта функциональность — единственное, что мешает мне доработать мое приложение. Для этого у меня было приложение для Android, и я решил создать более новую, лучшую версию, которая в идеале также работает на iOS. Я не знаком с компонентами в iOS (при исследовании я обнаружил, что фоновые задачи в iOS гораздо более ограничены, чем в Android), но я могу назвать компоненты Android, которые я использовал.

Какие сигналы могут запускать приложение?

Большая часть кода также запускается тревогой в AlarmManager.

Тем не менее, для запуска этого сигнала тревоги все время выполняется некоторый код при загрузке устройства, а также при обновлении пакета (android.intent.action.MY_PACKAGE_REPLACED), поскольку предыдущие сигналы тревоги будут удалены.

Как долго вы должны бежать? Откуда вы знаете, когда это заканчивается?

В идеале меньше секунды. Делается небольшой сетевой запрос и результат сохраняется, в некоторых случаях отображается уведомление. После этого метод возвращается.

Какую модель выполнения мы хотим для фонового выполнения? (например, отдельный изолят? Использовать основной поток dart:ui?)

Мне тоже без разницы.

Хотим ли мы поддерживать выполнение кода без предварительного запуска приложения (как в runApp)?

В моем случае после однократного запуска было бы нормально, однако, если возможно что-то вроде загрузочного приемника, оно должно работать, даже если приложение не запускалось раньше.

https://stackoverflow.com/questions/41924890/how-do-i-run-code-in-the-background-even-with-the-screen-off — самый популярный вопрос о переполнении стека Flutter, насколько я могу рассказать. :) Определенно интерес к этому пространству есть.

https://github.com/flutter/flutter/issues/6192 был повторно активирован, чтобы обеспечить базовую поддержку фактического запуска кода Dart, когда FlutterView не рендерится.

Это находится на нашем ближайшем радаре, но будет как минимум через несколько месяцев.

Извините за отмену назначения @zanderso из этой ошибки, я хотел назначить его основной ошибке фонового выполнения (# 6192)

CC @kasperl; мы исследовали множество способов выполнения кода в фоновом режиме для различных целей, и, возможно, из этого можно извлечь некоторые уроки.

@mit-mit вы задокументировали свои выводы в той или иной форме?

Еще одна причина для фоновой обработки — если вы хотите создать приложение для потокового аудио. Пользователь открывает приложение, чтобы запустить аудиопоток. Фоновый процесс загружает поток и воспроизводит аудио; конец получает события для запуска/остановки/паузы/перемотки назад; конец отправляет события для изменения пользовательского интерфейса, например метаданные аудио панели поиска для пользовательского интерфейса. Вам нужен фоновый процесс, когда пользователь покидает ваши приложения, загрузка/воспроизведение потока должна продолжаться.

В настоящее время мы работаем над этим. ETA в настоящее время нет.

@zanderso разместил обновление здесь: https://github.com/flutter/flutter/issues/6192#issuecomment -342214725

@a-siva сообщает мне, что это все еще продолжается; Android запущен и работает, сейчас мы работаем над iOS.

У нас есть вариант использования для этого, когда мы хотели бы отслеживать местоположение пользователя в фоновом режиме, чтобы регистрировать, посещали ли они определенное место в определенное время (например, во время события).

@bjornbjorn ты не можешь использовать геозоны для этого? не знаю, есть ли что-то подобное в IOS, но вы можете добиться этого геозонирования Play Service

есть новости @Hixie ? В настоящее время я нахожусь на этапе, когда мне нужно, чтобы мое приложение работало в качестве фоновой службы (большая часть приложения написана на Go), но в конечном итоге его убивают. Я начал реализовывать службу переднего плана на стороне Java, но это будет довольно неприятно, если мне в конечном итоге придется переопределить ее для iOS.

Некоторые оценки, будет ли это доступно для Android на следующей неделе или в следующем месяце, будут действительно оценены :)

@rusenask , как описано в https://github.com/flutter/flutter/issues/6192 , теперь у нас есть плагин для этого на Android! Пожалуйста, взгляните на https://pub.dartlang.org/packages/android_alarm_manager и сообщите нам, удовлетворяет ли это вашим требованиям.

Это выглядит многообещающе, и я, вероятно, мог бы изменить свое приложение со стиля «демон» на «периодические всплески» с этим менеджером тревог. Чтобы проснуться, потребляйте любые новости и отключайтесь.

Однако в идеале я бы использовал что-то, что позволяет моему процессу всегда работать на переднем плане. https://stackoverflow.com/questions/15758980/android-service-needs-to-run-always-never-pause-or-stop . Короче говоря, мое приложение запускает бота, поэтому его почти всегда нужно запускать.

Нам нужно будет убедиться, что мы задокументировали это, прежде чем считать, что это сделано.

Должны ли мы открыть новый выпуск документации?

Добавление в FAQ на https://github.com/flutter/website/pull/802

@zanderso -- @mjohnsullivan лучший контакт для документации.

Время прибытия известно?

@ it2bz Расчетное время прибытия для чего именно? Поддержка на Android? Документация? Поддержка на iOS? Примеры?

Поддержка @Hixie на Android и iOS и хотя бы базовая документация с примерами

Что касается iOS, можете ли вы уточнить, что именно вы хотите? У Apple есть строгие ограничения на то, что приложения могут делать в фоновом режиме, поэтому нам было бы полезно точно знать, к каким API вы хотите, чтобы мы подключались.

Я ищу возможность фоновой работы с местоположением пользователя

Похоже, это ветка с вопросами о фонах, так что я начну. Я хотел реализовать музыкальный проигрыватель с помощью флаттера, но не уверен, можно ли (с точки зрения API) воспроизводить музыку, даже если приложение свернуто на телефоне. Я знаю, что на Android вы можете запустить службу, которая на самом деле сможет продолжать работу, даже если приложение будет закрыто. Затем он перезапустит активность, если это необходимо. Возможно ли что-то подобное на флаттере прямо сейчас?

@SirWindfield Лучше всего использовать собственный API-интерфейс медиаплеера каждой платформы, который будет воспроизводиться отдельно от приложения.

@kirbyfan64 Я так и думал, спасибо!

@Hixie , такое решение (Cordova): https://github.com/katzer/cordova-plugin-background-mode или подобное (Swift): https://github.com/yarodevuci/backgroundTask было бы неплохо для фоновых задач Flutter.

@holospeed Это подходы, которые Apple, скорее всего, не позволит вам отправить, поэтому я предполагаю, что мы не хотели бы тратить время на их реализацию самостоятельно. Это, безусловно, то, что мы приветствуем, когда вы реализуете его в виде пакета, предоставленного сообществом, в пабе, если вы заботитесь о личных приложениях на iOS.

Возможно, решением было бы создание специальных фоновых плагинов, таких как плагин для воспроизведения звука в фоновом режиме и плагин для GPS/местоположения в фоновом режиме и т. д., вместо того, чтобы пытаться создать абстрактный фоновый механизм, который должен поддерживать все.

Можно ли запустить таймер в фоновом режиме, который переводит приложение в режим ожидания?
передний план в определенное время?

В среду, 21 марта 2018 г., в 08:49, Дилан Дрост[email protected] написал:

Возможно, решением было бы создание специальных фоновых плагинов, таких как
плагин для воспроизведения звука в фоновом режиме и плагин для GPS/местоположения
на заднем плане и т. д. вместо того, чтобы пытаться создать абстрактный фон
механизм, который должен поддерживать все.


Вы получаете это, потому что подписаны на эту тему.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/flutter/flutter/issues/3671#issuecomment-374867947 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AK-c-E0KdEkvbH5uCBIM8FaAbYQkSU2tks5tghQWgaJpZM4IVsUk
.

@ iBob101 Я считаю, что это возможно, если вы используете плагин android_alarm_manager в сочетании с плагином android_intent .

В моем случае все фоновые задачи, которые мне нужны, - это воспроизведение звука в фоновом режиме в определенное время, поэтому я думаю, что предложение @ aegis123 отличное, мы можем начать с малого и со временем предоставить механизм, поддерживающий любой фоновый процесс.

Мне также нужно это для воспроизведения музыки в фоновом режиме.

Я смотрел, как это делается в плагине android_alarm_manager, и, насколько я могу судить, код Dart вызывается на Android вызовом runFromBundle . Вызываемая функция Dart определяется точкой входа, однако что, если этой функции требуется передача информации? Примером использования может быть приложение чата, которое позволяет напрямую отвечать через уведомления. В соответствии с этой ссылкой уведомление разрешает удаленный ввод, но не похоже, что было бы возможно передать текст, который был прочитан, в функцию Dart, чтобы его можно было обработать, чтобы можно было отправить ответ.

Другим примером является приложение электронной почты, которое показывает уведомление, когда получено новое электронное письмо, могут быть представлены действия, одним из которых может быть возможность архивировать электронное письмо, что выполняется функцией Dart. Однако этой функции необходимо знать, какое электронное письмо необходимо заархивировать.

@MaikuB , вы могли бы сделать PR, чтобы разрешить передачу словаря, который может содержать пары ключ-значение.

Вообще говоря, для моего примера использования мне понадобится что-то похожее на компонент службы Android. И поскольку флаттер не предназначен для того, чтобы иметь доступ ко всем API, которые может предоставить каждая ОС, на самом деле может быть лучше написать приложение на kotlin/java или на swift.

Я считаю, что @bkonyi в настоящее время ищет, что мы можем сделать на iOS для решения этой проблемы.

Это означает, что у нас не может быть фонового сервиса с Flutter? Например: Сервис для всплывающих push-уведомлений с сервера.

@s-bauer Всегда работает не для Android, за исключением, может быть, уведомлений на переднем плане, но я не нашел упоминаний startForeground в вашем коде.

Я не уверен, каковы ваши характеристики, но помните, что телефоны Android переходят в глубокий сон через несколько часов с выключенным экраном и без движения. Все службы (кроме переднего плана) будут планироваться так, как операционная система сочтет это наилучшим. Push-уведомление, поступающее от FCM, или сигнал тревоги, поступающий от AlarmManager при определенной настройке, — это, возможно, единственные две вещи, находящиеся под контролем разработчика, которые способны разбудить устройство / приложение Android, когда пожелает разработчик, но не на неопределенное время. время. Есть много других методов, которые зависят от того, что операционная система считает лучшим для батареи. См. о режиме ожидания для получения более подробной информации. https://developer.android.com/training/monitoring-device-state/doze-standby

На iPhone все гораздо более ограничено.

Также я не понимаю, почему служба или соединение должны оставаться активными, чтобы получать push-уведомления от FCM или APNS, может быть, я что-то упускаю?

Быстрое обновление: фоновое выполнение для iOS реализовано и находится на рассмотрении (PR flutter/engine#5539). Как только это произойдет, я начну обновлять фоновое выполнение Android, чтобы иметь согласованный интерфейс, и опубликую образец плагина. Все это, надеюсь , будет сделано к концу месяца.

@bkonyi также решит проблему с: https://github.com/flutter/flutter/issues/17566 ?

@piotrpalek , да, будет, хотя поведение, вероятно, будет немного отличаться от того, что было раньше, поскольку мы больше не можем делиться изоляцией пользовательского интерфейса для обратных вызовов по разным причинам. Любая связь с интерфейсом переднего плана должна быть установлена ​​через изолирующие порты, MethodChannel s или любой другой метод, который не зависит от совместного использования памяти с основным изолятом.

Обновление статуса: изменения фонового выполнения для iOS и Android находятся на рассмотрении и все еще находятся в стадии итерации. Я ожидаю, что изменения во flutter/engine#5539 для iOS появятся в ближайшие дни, при отсутствии каких-либо запросов на серьезные модификации, а изменения во flutter/engine#5640 для Android, надеюсь, должны быть сделаны на следующей неделе после рассмотрения комментариев из обзора. Спасибо за терпеливость!

Потрясающий. Да, я видел PR, поскольку они оба ссылаются на эту проблему. Вы упомянули создание образца плагина, и я видел его для iOS, будет ли образец для Android? Я предполагаю, что плагин Android Alarm Manager может быть обновлен после внесения изменений.

@MaikuB , да, плагин AlarmManager будет обновлен после того, как флаттер / движок # 5640 приземлится, а флаттер / плагины # 642 будут завершены.

Привет. Есть новости по этой теме? Решение было отложено до вехи Bucket7. Он действительно собирается приземлиться там? Это ключевой функционал для нашего проекта. Спасибо за любой ответ.

К сожалению, мне пришлось сменить приоритеты на несколько дней, но сейчас я снова работаю над этим. Мы _почти_ у цели, так что спасибо за терпение!

Теперь, когда появились flutter/engine#5539, flutter/engine#5947 и flutter/engine#5954, вся функциональность, необходимая для фонового выполнения на Android и iOS, реализована в движке и должна появиться в основном репозитории Flutter в течение следующего года. крен двигателя. Документация и примеры находятся в разработке, а исправление плагина android_alarm_manager находится на рассмотрении (flutter/plugins#642).

@bkonyi android_alarm_manager теперь будет работать и с IO?

@ianldgs , к сожалению, нет. iOS не предоставляет какого-либо механизма для периодического выполнения кода, поэтому, скорее всего, невозможно создать реализацию iOS (см. этот пост SO ). Часто можно достичь тех же целей, используя один из ограниченных фоновых режимов выполнения (например, значительные изменения местоположения, push-уведомления, изменение состояния Bluetooth и т. д.).

@bkonyi , решит ли это проблему, с которой мы сейчас сталкиваемся, когда мы не можем выполнять собственные фоновые задачи в течение длительного периода (3 минуты) на iOS?

Чтобы уточнить, вот наша текущая проблема...

Задний план:
Наше приложение использует Bluetooth-маяки, чтобы определить, сколько времени кто-то проводит в определенном месте. Мы изначально написали весь код маяка в AppDelegate.swift.

Проблема:
Похоже, что Flutter закрывает наше приложение через несколько секунд, когда мы выполняем нативный код в фоновом режиме после того, как нас разбудило событие местоположения (в данном случае вход/выход региона), хотя мы продлеваем время фонового выполнения .

Почему мы думаем, что это связано с Flutter:
Мы протестировали наш нативный код маяка с нативным приложением для iOS и без проблем получили 180 секунд времени выполнения в фоновом режиме.

Что мы пробовали:
Единственный обходной путь, с которым мы добились успеха, — это поставить 30-секундную задержку в main() перед runApp(), когда наше приложение было запущено в фоновом режиме. Однако это вызвало другие проблемы.

Извините за длинное объяснение, но это огромная проблема для нас, и мы постараемся выпустить ее в ближайшие несколько недель.

Мы очень надеемся, что это исправление решит и нашу проблему.

Наконец, чтобы внести ясность, нас не слишком волнует выполнение кода дротика в фоновом режиме. Скорее, наша главная забота состоит в том, чтобы не допустить, чтобы Flutter преждевременно завершал работу нашего приложения при пробуждении в фоновом режиме.

Любая помощь будет очень признательна.

Спасибо!

@AndrewPetrovics, к сожалению, я не думаю, что это решит проблемы, которые вы видите, поскольку эти изменения в первую очередь предназначены для запуска кода Dart в фоновом режиме. Я не очень хорошо знаком с политиками фонового выполнения iOS, но на самом деле я работаю над плагином геозоны для Android + iOS, который звучит похоже на ваш вариант использования, поэтому я буду следить за проблемой, с которой вы столкнулись однажды. Я начинаю часть iOS сегодня/завтра.

@chinmaygarde , вы случайно не знаете что-нибудь о проблемах, с которыми сталкивается @AndrewPetrovics ? Возможно, ради этого стоит создать новую проблему.

@bkonyi , звучит хорошо. В итоге мы нашли обходной путь на данный момент, но он очень хакерский. При возможности создам отдельную тему.

Спасибо!

@bkonyi Могу я спросить, когда android_alarm_manager 0.2.0 будет публично развернут на pub.dartlang.org?

@ethael он должен быть доступен сейчас, просто ждал разрешения на публикацию обновления.

Есть ли какие-либо примеры или какая-либо документация по этому поводу?
Спасибо!

@Solban есть два примера в репозитории flutter/plugins:

У меня также есть плагин для геозоны, который поддерживает как Android (Kotlin), так и iOS (Obj-C), но я не уверен, будет ли он жить во флаттере/плагинах или нет.

Вот некоторая полезная документация по функциям, связанным с фоновым выполнением:

  • Класс PluginUtilities для передачи обратных вызовов между изолятами.
  • IsolateNameServer , который полезен для регистрации объектов SendPort с помощью Flutter для поиска других изолятов (похоже, здесь отсутствует фактическая документация, но интерфейс довольно прост).
  • FlutterNativeView , который используется для создания фоновой изоляции для плагина на Android.
  • FlutterHeadlessDartRunner , который используется для создания фоновой изоляции для плагина на iOS.

В настоящее время нет официальной документации по написанию плагинов с возможностью фонового выполнения. Тем не менее, в ближайшие недели в блоге Flutter появится сообщение на Medium, в котором будет описан процесс разработки, внедрения и использования плагинов, использующих фоновое выполнение.

Есть ли решение для продолжения фоновой работы? Единственным правильным способом непрерывного выполнения какого-либо длинного кода в Android является Foreground service .
Примером использования может быть продолжение отслеживания местоположения GPS.

@audkar в настоящее время нет плагина, который может выполнять непрерывную фоновую работу, но это не значит, что это невозможно. Плагин, использующий функциональность, на которую я ссылался выше , в сочетании с сервисом переднего плана (вместо JobIntentService , который я использовал для плагина геозоны), будет работать нормально.

В настоящее время я переношу свой iOS/Android Background Geolocation/Geofencing SDK на Flutter. Он будет называться flutter_background_geolocation .

У меня около 5 дней опыта работы с Dart / Flutter, но я понял. Он должен быть готов в течение 2 недель (хотя документы, относящиеся к Dart, займут немного больше времени).

Этому SDK уже почти 5 лет, и он поддерживается на постоянной основе. Первоначально он был разработан для Apache Cordova , а затем портирован на React Native и NativeScript . Он работает и в чисто нативных приложениях. Под капотом это одна и та же основная библиотека Obj-c + Java, используемая с каждой платформой разработки.

SDK изначально был разработан для отслеживания лиц, оказывающих первую помощь в зонах стихийных бедствий (например, ураганов, землетрясений) в условиях, когда сотовая сеть может быть разрушена. Он должен был продолжать отслеживание, даже если приложение было закрыто или устройство было перезагружено. Плагин содержит собственную базу данных SQLite и службу HTTP для автоматической загрузки местоположений на ваш сервер. Это особенно важно для Android в случае, когда приложение было завершено, оставив только службу переднего плана SDK, работающую «без головы».

:warning: Этот SDK не предназначен для социальных приложений. он разработан специально для вариантов использования «отслеживание автопарка» (например, такси, служба доставки, аварийное реагирование, бег трусцой и т. д.).

Вот краткое демонстрационное видео .

См. Философию операции .

Редактировать Я также буду портировать другую библиотеку как flutter_background_fetch , которая будет включена как зависимость flutter_background_geolocation . Этот модуль будет активировать приложение iOS / Android в фоновом режиме примерно каждые 15 минут, предоставляя вам 30 секунд фонового времени для выполнения периодической работы. См. версию react-native для получения дополнительной информации.

Хорошо, я опубликовал flutter_background_geolocation . Вероятно, еще есть несколько дыр, которые нужно подключить в фасаде к нативным библиотекам, и примеры в документах необходимо перевести из версии React Native.

@christocracy хорошие новости. как насчет фоновой выборки? какие-нибудь оценки по этому поводу?

@ethael Fetch придет еще примерно через 2 недели. Это очень простой плагин.

@bkonyi Я попробовал ваш плагин для изменения местоположения, чтобы поэкспериментировать с фоновым выполнением. Кажется, что обратный вызов dart, выполняемый из безголового бегуна, не может использовать другие плагины, выдавая ошибку MissingPluginException .

На Android с плагином android_alarm_manager вы решили эту проблему с помощью AlarmService.setPluginRegistrant(this); для внутренней регистрации плагинов из фоновой службы. Но я не вижу, как добиться эквивалента для iOS.

Можно ли в настоящее время вызывать другие плагины из безголового раннера на iOS? Если да, то как мы можем зарегистрировать плагины в этом контексте?

@bkonyi Эта проблема не решена и должна быть открыта повторно. AlarmManager кажется в лучшем случае обходным путем, потому что он поддерживает только временные события. Flutter нужно что-то более общее, чтобы вы могли прослушивать определенные события, такие как, например, устройство Bluetooth в радиусе действия. И он должен лучше поддерживать iOS. Я понимаю, что iOS гораздо более строгая, но Flutter должен поддерживать то, что доступно нативным программистам.

Я был рад начать с Flutter, но похоже, что есть много подобных проблем, которые делают его непригодным для использования во всех приложениях, кроме более простых. Я ожидал от Google большего, и я думаю, что с их стороны несправедливо ожидать, что разработчики будут создавать плагины для заполнения основных пробелов, которые они оставили.

@ dude8604 Google не собирается предоставлять все , и да , сторонние разработчики плагинов (такие как я) должны вносить плагины в экосистему. Я привожу двоих в настоящее время сам.

Я провел много времени с Cordova, React Native и NativeScript. После 2 недель работы с Flutter я думаю, что он отличный, хотя, безусловно, есть дыры (например, кроссплатформенный компонент карты, над которым, я уверен, я буду работать в ближайшем будущем).

Я профессиональный разработчик плагинов, специализирующийся на фоновой работе iOS и Android (геолокации и геозоны, в частности) в течение последних 5 лет. Что бы вы хотели узнать?

@christocracy Я согласен с тем, что должны быть сторонние плагины, но фоновое выполнение или, по крайней мере, возможность регистрировать функции обратного вызова для определенных событий кажется чем-то, что должна обеспечивать инфраструктура приложения. Моя проблема заключается не в необходимости создавать плагины для расширения основных функций, а в выпуске фреймворка, в котором отсутствуют основные функции, и в ожидании, что разработчики добровольно посвятят свое время коммерческой компании, чтобы заполнить пробелы. В любом случае, это не подходящее место для обсуждения этого.

Я хочу запустить фоновую службу и прочитать определенные события, обработать и, возможно, записать данные и, если необходимо, создать уведомление, которое при нажатии запустит основное приложение. Вот некоторые примеры событий: новое устройство Bluetooth в радиусе действия, входящие данные в розетку, входящие данные с USB-устройства, полученное SMS, изменение местоположения GPS, попытка подключения устройства Bluetooth, нажатие определенной физической кнопки, данные акселерометра превышают допустимое значение. указанное значение, если основное приложение завершено, и много других вещей, о которых я не думаю. Если бы кто-то мог сделать для этого всеобъемлющий плагин (с бесплатной лицензией или лицензией с открытым исходным кодом), который работает на iOS и Android, я думаю, что этот вопрос можно было бы закрыть. И я был бы бесконечно благодарен за возможность начать разработку с Flutter.

@ dude8604 Думаю, я знаю, чего ты хочешь. Очевидно, что для выполнения большей части этого требуется служба переднего плана с обязательным постоянным уведомлением. Пользователь знает о вашей запущенной службе.

Свяжитесь со мной через мой профиль на github.

Учтите, что React Native был в основном похож на «вы получаете кнопки, текстовые поля и представление списка, остальное зависит от вас», и он превратился в то, чем он является сейчас, благодаря сообществу. Google не может справиться со всеми реализациями, и безумно думать, что команда Flutter сможет воспроизвести все функции, предоставляемые как Android, так и iOS, когда эти функции добавляются командами в 100 раз (в 10 000 раз?) больше, чем Flutter.

Кажется, что android_alarm_manager и image_picker не работают (если оба установлены) после их внедрения в новый проект, работающий с Flutter 0.8.3-pre.47 . Приложение принудительно закрывается. Пример работает, поэтому я скопировал все в примере и настроил свою базу огня, но все еще не работает.

Чтобы добавить проблему, поднятую @deckerst , я не уверен, что уместно считать это закрытым, когда между Android и iOS нет паритета в отношении возможности выполнения кода, который использует другие плагины.

Изменить: только что заметил, что есть еще одна проблема, чтобы отслеживать это

Просто ссылка на эту статью здесь для тех, кто ее не видел:
https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124

Спасибо @slightfoot. Видел это, и именно там я нашел билет (# 21925) для того, чтобы безголовое выполнение iOS работало с плагинами. Было бы полезно иметь ссылку между этими двумя билетами.

В связи с этим, есть ли план включения безголового исполнения в официальную документацию, например, как часть поваренной книги? Я бы предположил, что это так, но подумал, что стоит спросить, учитывая, что, вероятно, большая часть сообщества не знает, как проверить среду.

Хорошая мысль @MaikuB , для этого добавлена ​​ошибка документа!

Фоновая поддержка непосредственно во флаттере, см. https://www.youtube.com/watch?v=_LfjILXswJs

Я не совсем понимаю. Если Flutter теперь поддерживает фоновое выполнение, почему в учебнике в основном используется код, специфичный для платформы?

Получите Outlook для Android https://aka.ms/ghei36


От: Тонка-уведомления@github.com
Отправлено: пятница, 21 сентября 2018 г., 3:39:28
Кому: порхать / порхать
Копия: Филип Вайс; Упомянуть
Тема: Re: [flutter/flutter] Flutter должен предоставлять абстракцию для фонового выполнения (#3671)

Фоновая поддержка непосредственно во флаттере, см. https://www.youtube.com/watch?v=_LfjILXswJs


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423490126 или отключите звук в ветке https://github.com/notifications/unsubscribe-auth/ABWxFrGMGvfFtwkf025Q2Je6lUTZu2aPks5udMHggaJpZM4IVsUk .

@ dude8604 это руководство предназначено для разработчиков плагинов , которые хотят разработать плагин для выполнения какой-то конкретной фоновой операции.

Потребители какого-то конкретного плагина слепы (насколько это возможно) к реализации для конкретной платформы.

Итак, как потребитель, есть ли способ запускать произвольный код в фоновом режиме, если нет плагина для моего конкретного случая использования?


От: Криса Скотта[email protected]
Отправлено: суббота, 22 сентября 2018 г., 17:43:16
Кому: порхать / порхать
Копия: Филип Вайс; Упомянуть
Тема: Re: [flutter/flutter] Flutter должен предоставлять абстракцию для фонового выполнения (#3671)

@ dude8604 https://github.com/dude8604 руководство предназначено для разработчиков плагинов, которые хотят разработать плагин для выполнения какой-либо конкретной фоновой операции.

Потребители какого-то конкретного плагина слепы (насколько это возможно) к реализации для конкретной платформы.


Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423783230 или отключите звук в ветке https://github.com/notifications/unsubscribe-auth/ABWxFhmlurQ08wWXLmMvE3E6yQ_lYvS1ks5udtkkgaJpZM4IVsUk .

@dude8604 Нет.

Насколько мне известно на данный момент:

Вы не можете «запускать произвольный код в фоновом режиме». Android сейчас строг . iOS всегда была.

@ dude8604 , @christocracy правильно. Функциональность фонового выполнения, продемонстрированная в статье на Medium, предназначена для разработчиков, которые хотят создавать плагины, которые могут выполнять код Dart в фоновом режиме. Большинству пользователей Flutter никогда не придется писать специфичный для платформы код для фонового выполнения, если только нет существующего плагина, соответствующего их варианту использования, поскольку эти плагины будут абстрагировать специфичный для платформы код за интерфейсом Dart.

Кажется, что android_alarm_manager и image_picker не работают (если оба установлены) после их внедрения в новый проект, работающий с Flutter 0.8.3-pre.47 . Приложение принудительно закрывается. Пример работает, поэтому я скопировал все в примере и настроил свою базу огня, но все еще не работает.

@ rupert2133 rupert2133 , не могли бы вы сообщить о проблеме с дополнительной информацией? Не стесняйтесь упоминать меня, чтобы я был уведомлен. Эта проблема была связана с более широким требованием к фоновому выполнению кода Dart и закрыта, поэтому любые дополнительные ответы здесь, скорее всего, будут скрыты.

Кажется, что android_alarm_manager и image_picker не работают (если оба установлены) после

Это напоминает мне. Вчера при реализации Headless Android в моем плагине у меня возникла ошибка googlemaps здесь .

Когда все плагины будут перерегистрированы в состоянии Headless, registrar.activity() == null .

Мне пришлось вручную взломать это, чтобы мое приложение загрузилось:

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

Я подозреваю, что это будет проблемой с большим количеством плагинов.

Я хочу запустить фоновую службу и прочитать определенные события, обработать и, возможно, записать данные и, если необходимо, создать уведомление, которое при нажатии запустит основное приложение. Вот некоторые примеры событий: новое устройство Bluetooth в радиусе действия, входящие данные в розетку, входящие данные с USB-устройства, полученное SMS, изменение местоположения GPS, попытка подключения устройства Bluetooth, нажатие определенной физической кнопки, данные акселерометра превышают допустимое значение. указанное значение, если основное приложение завершено, и много других вещей, о которых я не думаю. Если бы кто-то мог сделать для этого всеобъемлющий плагин (с бесплатной лицензией или лицензией с открытым исходным кодом), который работает на iOS и Android, я думаю, что этот вопрос можно было бы закрыть. И я был бы бесконечно благодарен за возможность начать разработку с Flutter.

@bkonyi Итак, что из вышеперечисленного я могу сделать с существующими плагинами? Могу ли я использовать AlarmManager для опроса этих событий? Но AlarmManager не работает на iOS, верно?

@ dude8604 Лучшее, что вы можете получить для периодических событий на iOS, — это API «фоновой выборки». Я скоро портирую этот плагин на флаттер.

API-интерфейс iOS «Background Fetch» ​​будет пробуждать спящее приложение в фоновом режиме примерно каждые 15 минут (это максимально возможный интервал ), обеспечивая вашему приложению ровно 30 секунд фонового времени работы. Однако iOS использует машинное обучение (предположительно) и будет регулировать его в зависимости от времени суток и частоты использования устройства/приложения (например, ночью, когда пользователь предположительно спит, события выборки могут происходить один раз в час.

@christocracy @bkonyi Итак, все это и их аналоги для Android можно превратить в плагин? Как я могу сделать запрос функции для этого?

@dude8604 Нельзя просто взмахнуть волшебной палочкой и *poof* . Иди надевай рабочие перчатки и делай сам. Если вы не можете сделать это сами, вы находите того, кто может , и платите ему десятки тысяч долларов.

@christocracy Вы правы, но я надеялся, что одна из крупнейших корпораций в мире будет иметь ресурсы для разработки полнофункционального продукта и не потребует от пользователей тратить десятки тысяч долларов, чтобы сделать его достаточно пригодным для использования.

Ну да, это крупная корпорация.

Упомянутая корпорация также состоит из отдельных лиц, которые не являются вездесущими. Ни один фреймворк не может покрыть все «из коробки», потому что, если вы попробуете, ваш проект превратится в груду горящего… ну, мусора.
Существуют сотни API для конкретных платформ, и ни одна команда не собирается их охватывать. Вам придется связать некоторые из них самостоятельно.

@ dude8604 Учтите, что ваше определение «полнофункционального» не совпадает с моим. В их обязанности входит управление перекрестком.

1 f you write this

Есть ли у нас четкое указание из документации? Я видел Release Preview 2, в котором говорилось, что он поддерживает фоновое выполнение. Некоторые примеры было бы хорошо пойти.

Фоновое выполнение @Pushan-Gupta зависит от плагина.

Это зависит от того, что вы хотите сделать. Отследить местоположение? Получать push-уведомления? Мониторить геозоны? Обнаружить устройства BT? Маяки? Играть музыку?

Не существует «одного кольца, чтобы управлять всеми поддержкой фонового выполнения».

@christocracy Извините, я этого не знал. Я стремился к конкретной вещи. Скажем, я хочу запросить несколько сообщений из приложения. Но связь отключена. Как только устройство возвращается в сеть, независимо от того, открыто приложение или нет, очередь этих запросов на публикации должна быть обработана.

Пример: WhatsApp ставит сообщения в очередь перед их отправкой на сервер. Если устройство находится в автономном режиме, оно сохраняет очередь и обслуживает ее, как только оно подключается к сети.

Кстати, у меня есть пиар, обсуждающий регистрацию плагинов для фоновых изолятов. Если у кого какие мысли...

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

Какой смысл в FlutterHeadlessDartRunner сейчас?
В настоящее время я реализовал фоновое выполнение на Android (без плагина, просто FlutterNativeView(ctx, true) ), и это было довольно легко сделать.
Но на iOS просто вылетает

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
}

Привет,
Пожалуйста, помогите с приложением напоминаний во флаттер ios

@MohdLucky И помощь, которая тебе нужна...?

@christocracy , у вас есть обновленная информация о состоянии реализации плагина background_fetch, пожалуйста?

не обновлять состояние реализации плагина background_fetch, предоставьте пример кода для
работает фоновое уведомление.

Любое обновление по этому поводу ... Я действительно думал, что это часть флаттера :( ... это почти те же проблемы, что и другие веб-гибридные решения ...

@radvansky-tomas Я не знаю, почему люди просто не понимают, что это не входит в сферу ответственности флаттера. Даже если вам нужно реализовать фоновое выполнение изначально, у вас все еще есть преимущество единой кодовой базы. Написание одного флаттер-плагина, выполняющего фоновую работу, занимает всего один или два дня работы. У меня была такая же проблема, мне нужен был сервис Android, который мог бы воспроизводить музыку для меня. Я просто написал это на kotlin, реализовал коммуникационный слой с помощью флаттера, а позже сделал то же самое для iOS.
Вполне возможно просто использовать собственные фоновые системы системы.
Вместо того, чтобы ныть о том, что X не реализован, вы можете реализовать его буквально без каких-либо проблем, используя экосистему, предоставленную командой.

@SirWindfield К сожалению, вы не знаете, о чем говорите. Это неотъемлемая часть архитектуры, а не сам плагин.

Flutter представлен как кроссплатформенное решение, производящее нативный код, т.е. предполагается, что он может запускать код на своем языке (Dart) каждый раз, когда это позволяет ОС.

Таким образом, если приложение запускается после получения удаленного уведомления, и вы можете поместить точку останова в существующий собственный код, вы должны иметь возможность вызывать свой код флаттера/дротика, где находятся ваши службы, модели и, наконец, пользовательский интерфейс.

Чтобы сделать это в вашем случае... скажем, ваша музыка играет в фоновом режиме, а затем вы заканчиваете свой плейлист... через 10 минут ваше приложение закрывается. Затем вы вызываете Siri или используете наушники, чтобы снова начать воспроизведение вашего приложения, какую бы точку входа вы ни выбрали ... выполняется собственный код, но не его пользовательский интерфейс, ваш код флаттера не инициализируется, и вы теряетесь, как я с моими уведомлениями.

Так что нет, это невозможно, я могу написать собственное уведомление для плагина, но тогда мне нужен доступ к бизнес-логике флаттера для обработки данных, в моем случае криптографическая расшифровка и выпуск локального уведомления с расшифрованным содержимым.

Да, я всесторонне протестировал его на своем телефоне, и он работает без проблем.
Возможно, мой телефон никогда не убивал приложение. Мой плохой тогда.

@christocracy есть новости о плагине background_fetch, Крис?

@ethael Вот пустое репо, чтобы следить за обновлениями.
https://github.com/transistorsoft/flutter_background_fetch

@radvansky-tomas вы можете обрабатывать фоновые события в коде Dart, создавая фоновую изоляцию, как описано в этом посте на Medium о фоновом выполнении . Скорее всего, вам придется написать некоторый собственный код для каждой платформы в соответствии с вашими конкретными потребностями, если только уже не существует плагина, который делает то, что вы хотите (маловероятно, поскольку я не знаю многих плагинов, поддерживающих фоновое выполнение на данный момент).

@bkonyi Спасибо за ответ, я начал менять плагин firebase_messaging для поддержки фонового выполнения ... но эта проблема больше о каком-то общем способе сделать это. Я имею в виду, что это должно быть частью шаблона = runner и его стороны дротика, где разработчики могут выполнять такой безголовый код, некоторые правила, стандарт шаблона, как сейчас во всех блогах, предложениях и т. д.

Проделана некоторая начальная работа: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging .

Следуя некоторым руководствам с https://github.com/bkonyi/FlutterGeofencing

Я должен закончить его к концу этой недели, сейчас я работаю только над частями iOS. Пример проекта использует плагин локального уведомления, чтобы показать, что сообщение было получено в фоновом режиме (тихое уведомление), а затем выпустить новое локальное, чтобы продемонстрировать успех.

Проделана некоторая начальная работа: https://github.com/radvansky-tomas/plugins/tree/master/packages/firebase_messaging .

Следуя некоторым руководствам с https://github.com/bkonyi/FlutterGeofencing

Я должен закончить его к концу этой недели, сейчас я работаю только над частями iOS. Пример проекта использует плагин локального уведомления, чтобы показать, что сообщение было получено в фоновом режиме (тихое уведомление), а затем выпустить новое локальное, чтобы продемонстрировать успех.

@goderbauer и я на самом деле хотели добавить эту поддержку, но мы были бы более чем рады помочь вам с дизайном и обзорами, если вы планируете сделать запрос на включение.

Итак, я почти закончил эту часть, так что теперь я могу получать тихие push-уведомления, а мой обратный вызов, написанный в dart, выполняется, пока приложение находится в фоновом режиме.

Однако я не могу получить доступ ни к одному другому плагину. Обратный вызов должен быть корневым/статическим методом и действительно не понимает, как что-либо вызывать оттуда.

Итак, я попытался сделать простой тест, чтобы использовать плагин локального уведомления флаттера для отправки локального уведомления после получения тихого сообщения, но плагин, похоже, недоступен (не зарегистрирован?)

Я нашел похожие сообщения здесь: https://github.com/flutter/engine/pull/6396 .

Есть ли какой-либо другой необходимый шаг, который я должен сделать, чтобы загрузить эти плагины?

Мой обратный вызов корневого уровня:
void callback(FirebaseMessage m, MessageEvent e) async { print('Message $m Event: $e'); final SendPort send = IsolateNameServer.lookupPortByName('messaging_send_port'); send?.send(e.toString()); }

Вопрос не в том, как получить доступ ко всему коду дротика + плагинам из этого обратного вызова... запросить firestore и т. д.

Наконец-то выпущена моя реализация Background Fetch.
background_fetch

@christocracy Вы правы, но я надеялся, что одна из крупнейших корпораций в мире будет иметь ресурсы для разработки полнофункционального продукта и не потребует от пользователей тратить десятки тысяч долларов, чтобы сделать его достаточно пригодным для использования.

Это правда. Если вы получаете время людей, вы должны дать им что-то взамен. Если нет, то не делайте эти причудливые маркетинговые названия!

Кажется, что эта проблема до сих пор вызывает у людей беды? Он закрыт и имеет много комментариев, поэтому вряд ли мы собираемся внести много конкретных изменений в проект из этого выпуска. :( (Нам нужно будет подать новые, чтобы добиться большего прогресса, я ожидаю.)

Я был бы очень заинтересован в том, чтобы мы задокументировали желаемые здесь конкретные изменения. Похоже, нужно больше фоновых примеров? (например, https://github.com/flutter/flutter/issues/23794)

В любом случае, мы бы хотели, чтобы отдельные вопросы регистрировались с отдельными запросами. Как уже отмечалось выше, Flutter — это большой и сложный проект, и, хотя у нас в Google большая (и быстро растущая) команда, у нас по-прежнему недостаточно инженеров, работающих полный рабочий день над Flutter, чтобы решать все вопросы одновременно. Flutter — это 100% открытый исходный код, и все наши проблемы находятся на GitHub. Патчи всегда приветствуются, конечно. :)

Если у вас есть какие-либо вопросы/изменения, отправьте новые вопросы, чтобы все участники знали, как мы можем помочь в дальнейшем: https://github.com/flutter/flutter/issues/new

Спасибо!

Вызов @eseidel принят: #24278

Я надеялся избежать написания кода для конкретного устройства и реализации API Flutter Dart, возможно, на основе событий, которые скрывали бы спецификации устройства и ОС и конкретную реализацию.

уже решил здесь

@ Krunal79-flutter, как именно, у этого подхода все равно будут те же проблемы. Дело в том, что в вашем сценарии флаттер уже инициализирован, и тогда это неправильный фоновый доступ. Проблема, которая у меня была и есть, заключается в том, что когда приложение фактически мертво, и тихое уведомление (или расширение приложения) разбудит ваше приложение, и вам нужно выполнить логику «дротика», пока флаттер еще не запущен (т.е. нет пользовательского интерфейса).

Это действительно должно быть гораздо более приоритетной проблемой для тех, кто управляет командой Flutter. Реализация фоновой функциональности — огромная проблема для среднего разработчика Flutter, и она часто ломается нетривиальными способами. И я уверен, что многие разработчики приложений в настоящее время борются с этим.

@tomoerlemans010 см. комментарий в https://github.com/flutter/flutter/issues/3671#issuecomment -438113161.

Эта конкретная проблема закрыта, пожалуйста, добавьте комментарии к другим открытым проблемам, связанным с фоновым выполнением, или создайте новую проблему с проблемами, с которыми вы столкнулись.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги