Flutter: يجب أن يوفر Flutter فكرة تجريدية لتنفيذ الخلفية

تم إنشاؤها على ٢ مايو ٢٠١٦  ·  139تعليقات  ·  مصدر: flutter/flutter

يرغب العملاء في تنفيذ رمز dart كعمليات خلفية على كل من iOS و Android ، لأشياء مثل مزامنة البيانات عند توفر wifi ولكن التطبيق غير مفتوح ، إلخ.

أنشأ mpcomplete عملية خلفية على Android لتنفيذ كود Dart لتحديث الرفرفة. لكني لست على علم بالتوازي على نظام iOS.

تتعقب هذه المشكلة تطوير واجهات برمجة التطبيقات في المكونات الإضافية أو غير ذلك. يتم تتبع دعم المحرك لهذه التجريدات في https://github.com/flutter/flutter/issues/6192.

truckable wellbeing engine framework plugin new feature

التعليق الأكثر فائدة

تحديث سريع: تم تنفيذ تنفيذ الخلفية لنظام iOS وللمراجعة (رفرفة العلاقات العامة / المحرك # 5539). بمجرد وصول ذلك ، سأبدأ في تحديث تنفيذ خلفية Android للحصول على واجهة متسقة ونشر عينة مكون إضافي. نأمل أن يتم كل هذا بحلول نهاية الشهر.

ال 139 كومينتر

هل يجب كتابة الكود الذي يتم تشغيله في الخلفية بلغة Dart أو Java / Objective-C؟

جاء ذلك في سياق الرغبة في تحديث نموذج البيانات المحلي عندما يكون الاتصال متاحًا. على سبيل المثال خرائط مترو الأنفاق / الأوقات التي قد تكون فيها تمشي داخل / خارج مترو أنفاق. لذلك أعتقد أن الهدف هو أن يكون الكود المنفذ هو Dart حتى لا يكون لديك رمز منفصل لمعالجة نموذج البيانات لكل منصة.

CCkasperl ؛ لقد اكتشفنا العديد من الطرق لتنفيذ التعليمات البرمجية في الخلفية عبر أهدافنا المختلفة ، وربما يمكن استخلاص بعض الدروس من ذلك.

هل لدينا بعض حالات الاستخدام من مستخدمينا؟ الشيء الوحيد الذي سمعته هو "نريد تشغيل بعض التعليمات البرمجية على الجهاز ، ردًا على رسالة دفع. نريد مزامنة البيانات على الجهاز ، حتى إذا لم يكن التطبيق مفتوحًا."

عادةً ما يتم تقييد ما يُسمح للتطبيق به بالفعل في الخلفية ، لذلك في هذه الحالة أعتقد أنه يمكننا الحصول على الإلهام لحالات الاستخدام من هناك. على سبيل المثال ، هذا هو نموذج iOS:
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

أعتقد أن هذا هو نفس الخطأ مثل # 6192 ، نعم.

إضافة علامة ورقية وقيمة معلم من # 6192

@ mravn- googlesigurdm شيء للتفكير فيه!

التعيين إلى Mikkel لإجراء تحقيق أولي للغاية لفهم الجدوى والتكلفة بشكل أفضل.

هذا تحديث من Leafy:

نظرًا لقيود إخطارات البيانات (أي الإشعارات التي تتطلب من التطبيق الاستجابة بطريقة ما) ، يميل الورقي نحو استخدام إشعارات العرض (أي الإشعارات التي يتم دفعها مباشرة إلى شاشة المستخدم دون مشاركة التطبيق). يوجد دعم لهذه الميزات بالفعل في Flutter.

ومع ذلك ، أثناء المحادثات مع فرق أخرى ، ظهرت حالة استخدام أخرى: إذا كنت تريد دعم الأدوات القابلة للارتداء أو أدوات [الشاشة الرئيسية] من تطبيقك ، فستحتاج إلى كتابة واجهة المستخدم بالرمز الأصلي نظرًا لأن Flutter لم تدعم هذه الأسطح بعد. ومع ذلك ، سيكون من الجيد أن تكون قادرًا على "تنشيط التطبيق وطلب البيانات" بحيث يمكن مشاركة طبقة النموذج ومنطق العمل عبر تطبيق flutter والتطبيق القابل للارتداء. بعد أن لم أكتب أيًا من هذه ، لست متأكدًا من كيفية قيام التطبيقات الأصلية الحالية بذلك ، لكنها تبدو بالتأكيد حالة استخدام صالحة لمهام الخلفية.

تحدثت للتو إلى مؤلف Flutter talk for Berlin DroidCon ، وكان هذا أحد أهم طلباته. "كيف تفعل هذا ، طريقة Flutter"

لتوضيح الأمر ، من الممكن حاليًا كتابة عمليات الخلفية كجزء من تطبيق Flutter-using. ومع ذلك ، يمكن لهذه العمليات فقط تنفيذ كود Obj-C / Swift أو Java / Kotlin. يتعلق هذا الخطأ بإصلاح القيد في محركنا للسماح بتنفيذ كود Dart في عمليات الخلفية هذه ، بالإضافة إلى إمكانية توفير فكرة تجريدية للسماح بجدولة عمل الخلفية هذا من Dart (من المحتمل أن يكون ذلك في مكون إضافي بمجرد FlutterView- يحتاج- إلى- تمت إزالة قيود تكون على الشاشة).

https://github.com/flutter/flutter/issues/6192#issuecomment -258928555 يناقش قيود المحرك الحالية وعزمنا على حلها. لمعلوماتك @ a-siva

يرتبط هذا أيضًا بـ (نسخة مكررة من؟) 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 يتم استدعاؤه عبر مؤقت في رمز أصلي بدلاً من تنفيذ Timer في Dart. يمكننا فعل ذلك من خلال خدمة على Android.

أو

يمكننا ببساطة الحصول على HowTo لإنشاء تطبيقات KeepAlive ™ Flutter.

على نظام iOS ، يمكنك تعيين UIBackgroundMode في Info.plist لتقليل احتمالية قتل التطبيق.

على Android ، قم بإعداد خدمة فارغة. هذا هو في الغالب تغيير AndroidManifest.xml + تنفيذ فئة خدمة تافهة.

لا يبدو أن المكون الإضافي العام KeepAlive قابل للتطبيق لأنه لا يزال يتطلب إعدادًا يدويًا على نظام التشغيل iOS وليس من الواضح ما إذا كان سيتم استخدام خدمة المقدمة / الخلفية على Android (الخدمة الأمامية أصعب في القتل ولكنها تتطلب إشعارًا مستمرًا).

حتى مع وجود خدمة في المقدمة ، لا يزال بإمكان نظام التشغيل قتل عمليتنا لأي سبب من الأسباب.

أشعر أن الحل المثالي يجب أن يستخدم Android Alarm Manager ، وهو مخصص للحالات التي تريد فيها تشغيل كود التطبيق الخاص بك في وقت محدد ، حتى لو لم يكن التطبيق الخاص بك قيد التشغيل حاليًا. ولكن حتى مع هذا ، كيف يمكننا إعادة تشغيل عملية Dart بنفس الحالة ، حيث سيكون لدينا مستخدم Firebase مسجّل الدخول يقوم بإجراء عمليات كتابة قاعدة بيانات مصدق عليها؟

pauldemarco ومن هنا هذا الخطأ ... لا توجد طريقة لتطبيق Flutter في الوقت الحالي لتنفيذ رمز Dart في أي حالة بدون تشغيل FlutterView. يتضمن ذلك Alarm Manager أو Wearable / Native Widget Data Sync أو Push Notifications (على الرغم من أن حالة الاستخدام لآخر مرة تختفي ببطء https://github.com/flutter/flutter/issues/6192).

أعتقد أنه يجب حل مشكلة _ نفس الحالة_ على مستوى التطبيق وليس على مستوى Flutter. بالنسبة للتطبيقات الأصلية ، لديك نفس المشكلة. بمجرد أن تتوقف العملية ، لا يمكنك استعادة الحالة إلا إذا قمت بحفظها في مكان ما (التفضيلات المشتركة أو sqlite على سبيل المثال). من المفترض أنك ستفعل الشيء نفسه في رمز Dart الخاص بك. شيء واحد يمكن أن يفعله Flutter هو إرسال رسائل مثل applicationWillTerminate على iOS و onSaveInstanceState على Android حتى تتمكن من الاستعداد لذلك.

أسئلة:

  • ما هي طرازي iOS و Android لتنفيذ الخلفية؟

    • ما هي الإشارات التي يمكن أن تؤدي إلى تشغيل التطبيق؟

    • كم من الوقت عليك الجري؟ كيف تعرف متى ينفد هذا؟

  • ما هو نموذج التنفيذ الذي نريده لتنفيذ الخلفية؟ (على سبيل المثال ، عزل منفصل؟ استخدم السهم الرئيسي: مؤشر ترابط واجهة المستخدم؟)
  • هل نريد دعم تشغيل الكود بدون تشغيل التطبيق (كما في runApp ) لأول مرة؟
  • هل يمكننا جمع قائمة أساسية بحالات الاستخدام؟

حاليًا لم يتم التخطيط لهذا في المستقبل القريب. إنها عملية كبيرة ، سنحتاج إلى نقل شيء آخر من قائمة أولوياتنا قصيرة المدى للقيام بذلك قريبًا.

حالة الاستخدام
لدينا طرق تشغيل مختلفة تسجل الأحداث على فترات مختلفة (5 ثوان ، 10 دقائق ، 30 دقيقة ، 6 ساعات). نحتاج إلى طريقة للتأكد من تشغيل عملية التسجيل سواء كان التطبيق قيد التشغيل حاليًا أم لا.

ما هي الإشارات التي يمكن أن تؤدي إلى تشغيل التطبيق؟

على Android ، سيكون هذا عبر PendingIntent الذي يتم إرساله من إنذار مجدول في AlarmManager.
لست متأكدًا من نظير iOS لهذا في الوقت الحالي.

كم من الوقت عليك الجري؟ كيف تعرف متى ينفد هذا؟

يجب علينا أولاً جمع المعلومات المطلوبة للحدث ، وبعضها غير متزامن (موقع GPS) ، ثم تسجيل الحدث في مخزن بيانات عبر الإنترنت (Firebase). يمكن أن تستمر هذه العملية بأكملها حتى 30 ثانية.

ما هو نموذج التنفيذ الذي نريده لتنفيذ الخلفية؟ (على سبيل المثال ، عزل منفصل؟ استخدم السهم الرئيسي: مؤشر ترابط واجهة المستخدم؟)

لا أعتقد أن هذا يهمنا ، فلن نقوم بأي عمليات حسابية باهظة الثمن.

هل نريد دعم تشغيل الكود بدون تشغيل التطبيق (كما في runApp) لأول مرة؟

لست متأكدا من الآثار المترتبة هنا. أفترض منذ أن قمنا بتهيئة منطق عملنا والحالة في التطبيق العادي ، سيكون من الأفضل تشغيل هذه الأشياء أولاً ، حتى نتمكن من استخدام تقارير الأعطال وما إلى ذلك.

يمكنني إضافة حالة مستخدم أخرى ، هذه الوظيفة هي الشيء الوحيد الذي يمنعني من إنهاء تطبيقي. كان لدي تطبيق android لهذا الغرض وقررت إنشاء إصدار أحدث وأفضل يعمل بشكل مثالي أيضًا على iOS. لست على دراية بالمكونات الموجودة في نظام التشغيل iOS (عند البحث وجدت أن مهام الخلفية في نظام التشغيل iOS مقيدة بدرجة أكبر بكثير من تلك الموجودة على نظام Android) ولكن يمكنني تسمية مكونات Android التي استخدمتها.

ما هي الإشارات التي يمكن أن تؤدي إلى تشغيل التطبيق؟

يتم تشغيل معظم الكود بواسطة Alarm في AlarmManager أيضًا.

ومع ذلك ، لبدء هذا التنبيه طوال الوقت ، يتم تنفيذ بعض التعليمات البرمجية على تمهيد الجهاز وأيضًا عند ترقية الحزمة (android.intent.action.MY_PACKAGE_REPLACED) لأنه ستتم إزالة الإنذارات السابقة.

كم من الوقت عليك الجري؟ كيف تعرف متى ينفد هذا؟

مثالي لأقل من ثانية. يتم إجراء طلب شبكة صغير واستمرار النتيجة ، وفي بعض الحالات يتم عرض إشعار. بعد ذلك تعود الطريقة.

ما هو نموذج التنفيذ الذي نريده لتنفيذ الخلفية؟ (على سبيل المثال ، عزل منفصل؟ استخدم السهم الرئيسي: مؤشر ترابط واجهة المستخدم؟)

لا يهمني كذلك.

هل نريد دعم تشغيل الكود بدون تشغيل التطبيق (كما في 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)

CCkasperl ؛ لقد اكتشفنا العديد من الطرق لتنفيذ التعليمات البرمجية في الخلفية عبر أهدافنا المختلفة ، وربما يمكن استخلاص بعض الدروس من ذلك.

@ mit-mit هل قمت بتوثيق نتائجك بشكل أو شكل ما؟

سبب آخر لرغبتك في معالجة الخلفية هو إذا كنت تريد إنشاء تطبيق Streaming Audio. يفتح المستخدم التطبيق لبدء دفق صوتي. تقوم عملية الخلفية بتنزيل الدفق وتشغيل نهاية الصوت الذي يتلقى الأحداث لبدء / إيقاف / إيقاف مؤقت / ff / إرجاع نهاية ترسل الأحداث لتغيير واجهة المستخدم ، مثل بيانات التعريف الصوتية لشريط البحث إلى واجهة المستخدم. أنت بحاجة إلى عملية في الخلفية عندما يغادر المستخدم تطبيقاتك ، يجب أن يستمر تنزيل / تشغيل البث

نحن نعمل حاليا على هذا. ليس هناك وقت محدد للوصول في هذا الوقت.

نشر zanderso تحديثًا هنا: https://github.com/flutter/flutter/issues/6192#issuecomment -342214725

أخبرني @ a-siva أن هذا لا يزال مستمراً ؛ يعمل Android ونعمل على iOS الآن.

لدينا حالة استخدام لهذا حيث نرغب في تتبع موقع المستخدم في الخلفية لتسجيل ما إذا كانوا قد ذهبوا إلى موقع معين في وقت محدد أم لا (على سبيل المثال ، أثناء حدث).

bjornbjorn ألا يمكنك استخدام الأسوار الجغرافية لذلك؟ لا أعرف ما إذا كان لدى IOS شيئًا مشابهًا ولكن يمكنك تحقيق Play Service Geofencing

هل هناك أي أخبار Hixie ؟ أنا حاليًا في المرحلة التي أحتاج فيها إلى تشغيل تطبيقي كخدمة في الخلفية (معظم التطبيق مكتوب بلغة Go) ولكن يتم إيقافه في النهاية. لقد بدأت في تنفيذ الخدمة الأمامية في Java side ولكن سيكون الأمر سيئًا للغاية إذا اضطررت إلى إعادة تطبيقها في النهاية لنظام 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 . باختصار ، يدير تطبيقي روبوتًا لذا فهو يحتاج دائمًا إلى التشغيل.

سنحتاج إلى التأكد من أننا قمنا بتوثيق ذلك قبل أن نعتبر ذلك قد تم.

هل يجب أن نفتح مشكلة وثائق جديدة؟

الإضافة إلى الأسئلة الشائعة في https://github.com/flutter/website/pull/802

zanderso -mjohnsullivan هو أفضل جهة اتصال لجهة التوثيق.

هل الـ ETA معروف؟

@ it2bz ايتا لماذا بالضبط؟ الدعم على Android؟ توثيق؟ دعم على iOS؟ أمثلة؟

Hixie Support على Android و iOS وعلى الأقل التوثيق الأساسي مع الأمثلة

بالنسبة لنظام iOS ، هل يمكنك توضيح ما تريده بالضبط؟ تفرض Apple قيودًا صارمة على ما يمكن أن تفعله التطبيقات في الخلفية ، لذلك سيكون من المفيد لنا أن نعرف بالضبط واجهات برمجة التطبيقات التي تريد منا ربطها.

أنا أبحث عن فرصة عمل خلفية مع موقع المستخدم

يبدو أن هذا هو سلسلة محادثات "اسأل عن الخلفية" لذا سأبدأ. كنت أرغب في تشغيل مشغل موسيقى باستخدام الرفرفة ولكني لست متأكدًا مما إذا كان من الممكن (API الحكيم) الاستمرار في تشغيل الموسيقى حتى إذا تم تصغير التطبيق على الهاتف. أعلم أنه على نظام Android ، يمكنك بدء خدمة ستكون في الواقع قادرة على الاستمرار حتى إذا تم إغلاق التطبيق. ومن ثم يتم إعادة تشغيل النشاط إذا لزم الأمر. هل شيء مشابه ممكن في الرفرفة الآن؟

SirWindfield سيكون أفضل رهان لك هو استخدام مشغل الوسائط الأصلي لكل نظام أساسي ، والذي سيستمر في اللعب بشكل منفصل عن التطبيق.

@ kirbyfan64 اعتقدت ذلك ، شكرا لك!

Hixie ، حل مثل هذا (كوردوفا): https://github.com/katzer/cordova-plugin-background-mode ، أو مثل هذا (Swift): https://github.com/yarodevuci/backgroundTask سيكون لطيفًا لمهام Flutter الخلفية.

holospeed هذه هي الأساليب التي من المحتمل ألا تسمح لك Apple بشحنها ، لذلك أعتقد أننا لا نريد قضاء الوقت في تنفيذ هذا بأنفسنا. إنه بالتأكيد شيء نرحب بك لتنفيذه كحزمة يساهم بها المجتمع في الحانة ، إذا كنت تهتم بالتطبيقات الشخصية على iOS ، رغم ذلك.

ربما يكون الحل هو إنشاء مكونات إضافية محددة في الخلفية مثل مكون إضافي لتشغيل الصوت في الخلفية ، ومكوِّن إضافي لنظام تحديد المواقع / الموقع في الخلفية وما إلى ذلك بدلاً من محاولة إنشاء آلية خلفية مجردة تحتاج إلى دعم كل شيء.

هل من الممكن تشغيل مؤقت في الخلفية يقوم بإحضار التطبيق إلى
المقدمة في وقت معين؟

يوم الأربعاء ، 21 مارس 2018 الساعة 08:49 ، كتب Dylan Drost [email protected] :

ربما يكون الحل هو إنشاء إضافات خلفية محددة مثل ملف
البرنامج المساعد لتشغيل الصوت في الخلفية ، ومكوِّن إضافي لنظام تحديد المواقع العالمي / الموقع
في الخلفية وما إلى ذلك بدلاً من محاولة إنشاء خلفية مجردة
الآلية التي تحتاج إلى دعم كل شيء.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على 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 ، يمكنك إنشاء علاقات عامة للسماح بتمرير قاموس يمكنه الاحتفاظ بأزواج قيم المفاتيح.

بشكل عام ، على الرغم من ذلك ، بالنسبة لمثال الاستخدام الخاص بي ، سأحتاج إلى شيء مشابه لمكون خدمة androids. ونظرًا لأن flutter غير مصمم لتوفير كل واجهة برمجة تطبيقات يمكن أن يوفرها كل نظام تشغيل ، فقد يكون من الأفضل بالفعل كتابة التطبيق بلغة kotlin / java oder swift.

أعتقد أن bkonyi يبحث حاليًا في ما يمكننا فعله على iOS لهذه المشكلة.

هذا يعني أنه لا يمكننا الحصول على خدمة خلفية مع Flutter؟ على سبيل المثال: خدمة لإشعارات الدفع المنبثقة من الخادم.

@ s-bauer لا يعد التشغيل الدائم شيئًا لنظام Android ، ما لم تكن هناك إشعارات في المقدمة ، لكنني لم أجد إشارات إلى startForeground على الكود الخاص بك.

لست متأكدًا من المواصفات الخاصة بك ولكن تذكر أن هواتف Android تنام بعمق بعد بضع ساعات مع إيقاف تشغيل الشاشة وعدم تحريكها. ستتم جدولة جميع الخدمات (باستثناء المقدمة) ولكن يعتقد نظام التشغيل أنها الأفضل. قد يكون إشعار الدفع الذي يأتي من FCM أو إنذار قادم من AlarmManager ضمن إعداد معين هما الشيئين الوحيدان الخاضعين لتحكم المطور والقادران على إيقاظ جهاز / تطبيق يعمل بنظام Android متى شاء المطور ، ولكن ليس مقابل مبلغ غير محدد من زمن. هناك العديد من الطرق الأخرى التي تعتمد على ما يعتقد نظام التشغيل أنه الأفضل للبطارية. اطلع على وضع التجفيف لمزيد من التفاصيل. https://developer.android.com/training/monitoring-device-state/doze-standby

على iPhone الأشياء مقيدة بدرجة أكبر.

كما أنني لا أفهم لماذا يجب أن تظل الخدمة أو الاتصال على قيد الحياة من أجل تلقي إشعارات الدفع من FCM أو APNS ، فربما أفتقد شيئًا ما؟

تحديث سريع: تم تنفيذ تنفيذ الخلفية لنظام iOS وللمراجعة (رفرفة العلاقات العامة / المحرك # 5539). بمجرد وصول ذلك ، سأبدأ في تحديث تنفيذ خلفية Android للحصول على واجهة متسقة ونشر عينة مكون إضافي. نأمل أن يتم كل هذا بحلول نهاية الشهر.

bkonyi هل سيؤدي هذا أيضًا إلى حل المشكلة مع: https://github.com/flutter/flutter/issues/17566 ؟

piotrpalek ، نعم ، على الرغم من أن السلوك من المحتمل أن يكون مختلفًا قليلاً عما كان عليه في السابق حيث لم يعد بإمكاننا مشاركة عزل واجهة المستخدم لعمليات رد النداء لأسباب مختلفة. يجب إنشاء أي اتصال مع واجهة المستخدم الأمامية عبر منافذ معزولة ، MethodChannel s ، أو أي طريقة أخرى لا تعتمد على مشاركة الذاكرة مع المعزول الرئيسي.

تحديث الحالة: تغييرات تنفيذ الخلفية لنظامي التشغيل iOS و Android قيد المراجعة ولا يزال يتم تكرارها. أتوقع تغييرات iOS في الرفرفة / المحرك # 5539 ستهبط في الأيام المقبلة ، مع عدم وجود أي طلبات لإجراء تعديلات كبيرة ، ونأمل أن تتم تغييرات Android في الرفرفة / المحرك # 5640 الأسبوع المقبل بعد التعامل مع التعليقات من المراجعة. شكرا لصبرك!

مدهش. نعم ، لقد رأيت العلاقات العامة لأن كلاهما يشير إلى هذه المشكلة. لقد ذكرت عمل نموذج مكون إضافي ورأيت الإصدار iOS ، فهل سيكون هناك عينة من Android؟ أعتقد أنه يمكن تحديث المكون الإضافي لمدير إنذار Android بمجرد إدخال التغييرات

MaikuB ، نعم ، سيتم تحديث المكون الإضافي AlarmManager بمجرد اكتمال flutter / engine # 5640 و flutter / plugins # 642.

مرحبا. أي تحديث بخصوص هذا الموضوع؟ تم تأجيل الحل إلى معلم bucket7. هل حقا ستهبط هناك؟ هذه وظيفة حاسمة لمشروعنا. شكرا على أي رد.

لسوء الحظ ، اضطررت إلى تغيير الأولويات لبضعة أيام ، لكنني عدت إلى العمل على هذا الآن. نحن _ تقريبًا_ هناك ، لذا نشكرك على تحليك بالصبر!

الآن بعد أن هبطت الرفرفة / المحرك # 5539 ، والرفرفة / المحرك # 5947 ، والرفرفة / المحرك # 5954 ، يتم تنفيذ جميع الوظائف اللازمة لتنفيذ الخلفية على Android و iOS في المحرك ويجب أن تجعله في مستودع Flutter الرئيسي خلال اليوم التالي لفة المحرك. التوثيق والأمثلة قيد العمل ، وإصلاح المكون الإضافي android_alarm_manager جاهز للمراجعة (الرفرفة / الإضافات # 642).

bkonyi هل سيعمل android_alarm_manager أيضًا على IOs الآن؟

ianldgs ، للأسف لا. لا يوفر iOS أي نوع من الآلية لتنفيذ التعليمات البرمجية على أساس دوري ، لذلك من غير المحتمل إنشاء تطبيق iOS (انظر منشور SO هذا). غالبًا ما يكون من الممكن تحقيق نفس الأهداف باستخدام أحد أوضاع التنفيذ المحدودة في الخلفية (على سبيل المثال ، تغييرات كبيرة في الموقع ، وإشعارات الدفع ، وتغيير حالة Bluetooth ، إلخ).

bkonyi ، هل سيؤدي هذا إلى إصلاح مشكلة نواجهها حاليًا تتمثل في عدم قدرتنا على تنفيذ مهام الخلفية الأصلية لفترة ممتدة (3 دقائق) على نظام iOS؟

للتوضيح ، إليك مشكلتنا الحالية ...

خلفية:
يستخدم تطبيقنا إشارات Bluetooth لتحديد مقدار الوقت الذي يقضيه شخص ما في الموقع. لقد كتبنا كل كود المنارة الخاص بنا أصلاً في AppDelegate.swift.

القضية:
يبدو أن Flutter قد أغلق تطبيقنا بعد بضع ثوانٍ عندما ننفذ كودًا أصليًا في الخلفية بعد إيقاظنا من حدث الموقع (دخول / خروج المنطقة في هذه الحالة) على الرغم من أننا نطيل وقت التنفيذ في الخلفية .

لماذا نعتقد أنه متعلق بالرفرفة:
لقد اختبرنا كود المنارة الأصلي الخاص بنا باستخدام تطبيق iOS أصلي وليس لدينا مشكلة في الحصول باستمرار على 180 ثانية من وقت تنفيذ الخلفية.

ما جربناه:
الحل الوحيد الذي نجحنا فيه هو وضع تأخير لمدة 30 ثانية في الرئيسي () قبل runApp () عند إطلاق تطبيقنا في الخلفية. ومع ذلك ، فقد تسبب هذا في مشاكل أخرى.

نعتذر عن الشرح المطول ، لكن هذه مشكلة كبيرة بالنسبة لنا ونحاول الإفراج عنها في الأسابيع القليلة القادمة.

نأمل حقًا أن يؤدي هذا الإصلاح إلى حل مشكلتنا أيضًا.

أخيرًا ، لكي نكون واضحين ، لا نهتم كثيرًا بتنفيذ كود dart في الخلفية. بدلاً من ذلك ، فإن شاغلنا الرئيسي هو عدم قيام Flutter بإنهاء تطبيقنا قبل الأوان عند الاستيقاظ في الخلفية.

أي مساعدة سيكون موضع تقدير هائل.

شكرا!

AndrewPetrovics للأسف لا أعتقد أن هذا سيصلح المشكلات التي تراها لأن هذه التغييرات في المقام الأول للسماح بتشغيل كود Dart من الخلفية. لست على دراية كبيرة بسياسات تنفيذ الخلفية لنظام iOS ، لكنني أعمل بالفعل على مكون إضافي لتحديد المواقع الجغرافية لنظام Android + iOS والذي يبدو مشابهًا لحالة الاستخدام الخاصة بك ، لذلك سأراقب المشكلة التي تواجهها مرة واحدة أبدأ جزء iOS اليوم / غدًا.

chinmaygarde ، هل تعرف أي شيء عن المشكلات التي يواجههاAndrewPetrovics ؟ ربما هذا يستحق تقديم عدد جديد من أجل.

bkonyi ، يبدو جيدًا. انتهى بنا المطاف بإيجاد حل بديل في الوقت الحالي ، لكنه صعب للغاية. سأقوم بإنشاء إصدار منفصل عندما تسنح لي الفرصة.

شكرا!

bkonyi هل لي أن أسأل ، متى سيتم نشر android_alarm_manager 0.2.0 علنًا على pub.dartlang.org؟

ethael يجب أن يكون متاحًا الآن ، كان فقط ينتظر الحصول على أذونات لنشر التحديث.

هل هناك أمثلة أو بعض التوثيق متاح؟
شكرا!

Solban @ هناك مثالان في مستودع الرفرفة / الملحقات:

لدي أيضًا مكوِّن إضافي لتحديد المواقع الجغرافية في الأعمال التي تدعم كل من Android (Kotlin) و iOS (Obj-C) ، لكنني لست متأكدًا مما إذا كان سيعيش في رفرفة / مكونات إضافية أم لا.

فيما يلي بعض الوثائق المفيدة للوظائف المتعلقة بتنفيذ الخلفية:

  • فئة PluginUtilities لتمرير عمليات الاسترجاعات بين العزلات
  • IsolateNameServer مفيد لتسجيل كائنات SendPort مع Flutter لعزل أخرى للبحث (يبدو أن هذا يفتقد إلى الوثائق الفعلية ، لكن الواجهة مباشرة إلى الأمام).
  • FlutterNativeView الذي يستخدم لنشر الخلفية المعزولة للمكوِّن الإضافي على Android
  • FlutterHeadlessDartRunner الذي يستخدم لنشر الخلفية المعزولة للمكوِّن الإضافي على iOS

لا يوجد حاليًا أي توثيق رسمي حول كتابة المكونات الإضافية مع إمكانات التنفيذ في الخلفية. ومع ذلك ، يجب أن يكون هناك منشور متوسط ​​على مدونة Flutter يظهر في الأسابيع المقبلة والذي سيمضي خلال عملية تصميم وتنفيذ واستخدام المكونات الإضافية التي تستخدم التنفيذ في الخلفية.

هل هناك أي حل لاستمرار العمل في الخلفية؟ الطريقة الصحيحة الوحيدة للتنفيذ المستمر لبعض التعليمات البرمجية التي تعمل لفترة طويلة في Android هي Foreground service .
سيكون مثال حالة الاستخدام استمرار تتبع موقع GPS.

audkar حاليًا لا يوجد مكون إضافي يمكنه التعامل مع العمل المستمر في الخلفية ، لكن هذا لا يعني أنه لا يمكن القيام به. سيعمل المكون الإضافي الذي يستخدم الوظيفة التي أشرت إليها أعلاه بالاشتراك مع خدمة المقدمة (بدلاً من JobIntentService الذي استخدمته للمكوِّن الإضافي geofencing) بشكل جيد.

أقوم حاليًا بنقل SDK للموقع الجغرافي لخلفية iOS / Android / Geofencing إلى Flutter. سوف يطلق عليه flutter_background_geolocation .

لدي خبرة حوالي 5 أيام مع Dart / Flutter لكني حصلت عليها. يجب أن يكون جاهزًا في غضون أسبوعين (على الرغم من أن المستندات ستستغرق وقتًا أطول قليلاً مع أمثلة خاصة بـ Dart).

يبلغ عمر SDK 5 سنوات تقريبًا ويتم دعمها بدوام كامل. تم تطويره في الأصل لـ Apache Cordova ، ثم تم نقله لاحقًا إلى React Native و NativeScript . إنه يعمل في تطبيقات أصلية خالصة أيضًا. تحت الغطاء ، إنها نفس مكتبة Obj-c + Java الأساسية المستخدمة مع كل منصة تطوير.

تم تطوير SDK في الأصل لتتبع المستجيبين الأوائل في مناطق الكوارث (على سبيل المثال: الأعاصير والزلازل) في بيئة من المحتمل أن تتعرض فيها الشبكة الخلوية للتدمير. كان عليه متابعة التتبع حتى إذا تم إنهاء التطبيق أو إعادة تشغيل الجهاز. يحتوي المكون الإضافي على قاعدة بيانات SQLite الخاصة به وخدمة HTTP لتحميل المواقع تلقائيًا إلى الخادم الخاص بك. هذا مهم بشكل خاص لنظام Android في حالة إنهاء التطبيق ، وترك الخدمة الأمامية لـ SDK تعمل "بلا رأس".

: تحذير: لم يتم تصميم SDK للتطبيقات الاجتماعية. إنه مصمم خصيصًا لحالات استخدام "تتبع الأسطول" (على سبيل المثال: سيارات الأجرة ، وخدمة التوصيل ، والاستجابة للطوارئ ، والركض ، إلخ).

هذا فيديو تجريبي موجز.

انظر فلسفة العملية .

تحرير ، سأقوم أيضًا بنقل مكتبة أخرى كـ flutter_background_fetch ، والتي سيتم تضمينها كتبعية flutter_background_geolocation . ستوقظ هذه الوحدة تطبيق iOS / Android في الخلفية كل 15 دقيقة تقريبًا ، مما يوفر لك 30 ثانية من وقت الخلفية لأداء العمل الدوري. راجع الإصدار react-native لمزيد من المعلومات.

حسنًا ، لقد قمت بنشر flutter_background_geolocation . ربما لا يزال هناك عدد قليل من الثغرات للإضافة في الواجهة إلى libs الأصلية وتحتاج الأمثلة الموجودة في المستندات إلى أن تتم ترجمتها من النسخة الأصلية لـ React.

@ كريستوقراطية أخبار جيدة. ماذا عن جلب الخلفية؟ أي تقديرات بخصوص ذلك؟

سيأتيethael Fetch في غضون أسبوعين آخرين. إنه مكون إضافي بسيط للغاية.

bkonyi لقد جربت المكون الإضافي لتغيير الموقع الخاص بك لتجربة تنفيذ الخلفية. يبدو أن رد النداء الذي تم تنفيذه من المتسابق بدون رأس لا يمكنه استخدام مكونات إضافية أخرى ، حيث فشل مع 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. بعد أسبوعين مع Flutter ، أعتقد أنه ممتاز تمامًا ، على الرغم من وجود ثقوب بالتأكيد (مكون خريطة عبر النظام الأساسي ، على سبيل المثال ، وأنا متأكد من أنني سأساهم في المستقبل القريب.)

أنا مطور مكون إضافي محترف متخصص في تشغيل الخلفية لنظامي iOS و Android (تحديد الموقع الجغرافي والسياج الجغرافي ، على وجه الخصوص) على مدى السنوات الخمس الماضية. ماذا تريد أن تعرف؟

christocracy أوافق على أنه يجب أن تكون هناك مكونات إضافية لجهات خارجية ، ولكن يبدو أن تنفيذ الخلفية أو على الأقل القدرة على تسجيل وظائف رد الاتصال لأحداث معينة أمر يجب أن يوفره إطار عمل التطبيق. مشكلتي ليست في الاضطرار إلى إنشاء مكونات إضافية لتوسيع الوظائف الأساسية ، ولكن مع إصدار إطار عمل يفتقد الميزات الأساسية وتوقع أن يتطوع المطورون بوقتهم في شركة هادفة للربح لسد الثغرات. على أي حال ، هذا ليس المكان المناسب لمناقشة هذا الأمر.

أرغب في تشغيل خدمة في الخلفية وقراءة أحداث معينة ، ومعالجة البيانات وربما تسجيلها ، وإذا كان ذلك مناسبًا ، قم بإنشاء إشعار لتشغيل التطبيق الرئيسي إذا تم الضغط عليه. قد تكون بعض الأمثلة على الأحداث: جهاز Bluetooth جديد في النطاق ، والبيانات الواردة على المقبس ، والبيانات الواردة من جهاز USB ، ورسائل SMS المستلمة ، وتغيير موقع GPS ، ومحاولة اتصال جهاز Bluetooth ، والضغط على زر مادي معين ، وتجاوز بيانات مقياس التسارع القيمة المحددة ، إذا تم إنهاء التطبيق الرئيسي ، والكثير من الأشياء الأخرى التي لا أفكر فيها. إذا كان بإمكان شخص ما إنشاء مكون إضافي شامل (بترخيص مجاني أو مفتوح المصدر) لهذا يعمل على iOS و Android ، أعتقد أنه يمكن إغلاق هذه المشكلة. وسأكون ممتنًا إلى الأبد لأنني أستطيع البدء في التطوير باستخدام Flutter.

@ dude8604 أعتقد أنني أعرف ما تريد. من الواضح أن القيام بالكثير من هذا يتطلب خدمة مقدمة ، مع الإخطار المستمر المطلوب. المستخدم على علم بخدمتك قيد التشغيل.

تواصل معي عبر ملفي الشخصي على جيثب.

ضع في اعتبارك أن React Native كانت في الأساس مثل "تحصل على أزرار وحقول نصية وعرض قائمة ، والباقي متروك لك" وقد نما إلى ما هو عليه الآن بسبب المجتمع. لا تستطيع Google التعامل مع جميع عمليات التنفيذ ، ومن الجنون أن تعتقد أن فريق Flutter سيكون قادرًا على تكرار جميع الوظائف التي يوفرها كل من Android و iOS عندما تتم إضافة هذه الوظائف من قبل الفرق 100x (10000x؟) حجم Flutter.

يبدو أن android_alarm_manager و image_picker لا يعملان (إذا تم تثبيت كلاهما) بعد تنفيذه على مشروع جديد يعمل على Flutter 0.8.3-pre.47 . التطبيق يفرض على الإغلاق. يعمل المثال ، لذا قمت بنسخ كل شيء في المثال وقمت بإعداد قاعدة Firebase الخاصة بي ولكن ما زلت لا تعمل.

لإضافة المشكلة التي أثارها 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؟

أنا لا أفهم تماما. إذا كان Flutter يدعم الآن تنفيذ الخلفية ، فلماذا يحتوي البرنامج التعليمي في الغالب على كود خاص بالنظام الأساسي؟

احصل على Outlook لنظام Android https://aka.ms/ghei36


من: tonka [email protected]
تاريخ الإرسال: الجمعة 21 سبتمبر 2018 الساعة 3:39:28 صباحًا
إلى: رفرفة / رفرفة
نسخة إلى: فيليب فايس ؛ أشير
الموضوع: Re: [الرفرفة / الرفرفة] يجب أن توفر الرفرفة فكرة تجريدية لتنفيذ الخلفية (# 3671)

دعم الخلفية في الرفرفة مباشرة ، راجع https://www.youtube.com/watch؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423490126 ، أو قم بكتم صوت السلسلة https://github.com/notifications/unsubscribe-auth/ABWxFrGMGvfFtwkf025Q2Je6lUTZu2gIVs .

@ dude8604 البرنامج التعليمي مخصص لمطوري المكونات الإضافية الذين يرغبون في تطوير مكون إضافي لأداء بعض العمليات الخاصة في الخلفية.

مستهلكو بعض المكونات الإضافية المعينة عمياء (قدر الإمكان) عن عمليات التنفيذ الخاصة بالنظام الأساسي.

إذاً كمستهلك ، هل هناك طريقة لتشغيل تعليمات برمجية عشوائية في الخلفية ، إذا لم يكن هناك مكون إضافي لحالة الاستخدام الخاصة بي؟


من: Chris Scott [email protected]
تاريخ الإرسال: السبت ، 22 سبتمبر 2018 5:43:16 مساءً
إلى: رفرفة / رفرفة
نسخة إلى: فيليب فايس ؛ أشير
الموضوع: Re: [الرفرفة / الرفرفة] يجب أن توفر الرفرفة فكرة تجريدية لتنفيذ الخلفية (# 3671)

@ dude8604 https://github.com/dude8604 البرنامج التعليمي مخصص لمطوري المكونات الإضافية الذين يرغبون في تطوير مكون إضافي لأداء بعض العمليات الخاصة في الخلفية.

مستهلكو بعض المكونات الإضافية المعينة عمياء (قدر الإمكان) عن عمليات التنفيذ الخاصة بالنظام الأساسي.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/flutter/flutter/issues/3671#issuecomment-423783230 ، أو كتم صوت سلسلة المحادثات https://github.com/notifications/unsubscribe-auth/ABWxFhmlurQ08wWXLmMvE3E6yQ_lYvS1ks5ks .

@ dude8604 لا.

على حد علمي حاليًا:

لا تحصل على "تشغيل تعليمات برمجية عشوائية في الخلفية". Android صارم الآن . iOS كان دائمًا.

@ dude8604 ، @ كريستوقراطية صحيحة. تستهدف وظيفة تنفيذ الخلفية الموضحة في مقالة Medium المطورين الذين يرغبون في إنشاء مكونات إضافية يمكنها تنفيذ كود Dart في الخلفية. لن يضطر معظم مستخدمي Flutter أبدًا إلى كتابة رمز خاص بالنظام الأساسي لتنفيذ الخلفية ما لم يكن هناك مكون إضافي حالي يطابق حالة الاستخدام الخاصة بهم لأن هذه المكونات الإضافية ستجرد رمز النظام الأساسي المحدد خلف واجهة Dart.

يبدو أن android_alarm_manager و image_picker لا يعملان (إذا تم تثبيت كلاهما) بعد تنفيذه على مشروع جديد يعمل على Flutter 0.8.3-pre.47 . التطبيق يفرض على الإغلاق. يعمل المثال ، لذا قمت بنسخ كل شيء في المثال وقمت بإعداد قاعدة Firebase الخاصة بي ولكن ما زلت لا تعمل.

@ 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 هو عبر واجهة برمجة التطبيقات "background-fetch". سأقوم بنقل هذا البرنامج المساعد لرفرفة قريبًا.

ستقوم واجهة برمجة تطبيقات "جلب الخلفية" لنظام التشغيل iOS بإيقاظ تطبيق نائم في الخلفية كل 15 دقيقة تقريبًا (هذه أسرع فترة زمنية ممكنة ) مما يوفر لتطبيقك 30 ثانية بالضبط من وقت التشغيل في الخلفية. ومع ذلك ، يستخدم iOS التعلم الآلي (على الأرجح) وسيخنق ذلك بناءً على الوقت من اليوم وتكرار استخدام الجهاز / التطبيق (على سبيل المثال: في الليل ، عندما يكون المستخدم نائمًا ، قد تأتي أحداث الجلب مرة واحدة / ساعة.

christocracybkonyi إذن هل يمكن تحويل كل هؤلاء وما يكافئهم من Android إلى مكون إضافي؟ كيف يمكنني تقديم طلب ميزة لهذا؟

@ dude8604 لا يمكنك فقط التلويح بعصا سحرية و *poof* . تذهب وتلبس قفازات العمل الخاصة بك وتصنعها بنفسك. إذا لم تتمكن من تحقيق ذلك بنفسك ، فستجد شخصًا يستطيع ذلك وتدفع له عشرات الآلاف من الدولارات.

christocracy ، أنت على حق ، لكنني كنت آمل أن يكون لدى واحدة من أكبر الشركات في العالم الموارد اللازمة لتطوير منتج كامل الميزات ولا يتطلب من مستخدميه إنفاق عشرات الآلاف من الدولارات لجعله قابلاً للاستخدام بشكل كافٍ.

حسنًا ، نعم إنها شركة كبيرة.

تتكون الشركة المذكورة أيضًا من أفراد غير موجودين في كل مكان. لا يمكن لأي إطار عمل تغطية كل شيء خارج الصندوق ، لأنك إذا جربت مشروعك سيتحول إلى كومة من الحرق ... حسنًا ، قمامة.
هناك المئات من واجهات برمجة التطبيقات الخاصة بالنظام الأساسي ولن يقوم فريق واحد بتغطيتها. سيكون عليك ربط البعض بنفسك.

@ dude8604 ضع في اعتبارك أن تعريفك لمصطلح "مميز بالكامل" يختلف عن تعريفي. مسؤوليتهم هي التعامل مع التقاطع.

1 f you write this

هل لدينا اتجاه واضح من المستندات؟ رأيت Release Preview 2 تفيد بأنه يدعم تنفيذ الخلفية. سيكون من الجيد الذهاب إلى بعض الأمثلة.

@ Pushan-Gupta تنفيذ الخلفية هو شيء خاص بالملحق الإضافي.

ذلك يعتمد على ما تريد القيام به. تتبع الموقع؟ تلقي الإخطارات؟ مراقبة السياج الجغرافي؟ الكشف عن أجهزة 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) في كل مرة يسمح فيها نظام التشغيل بذلك.

لذلك ، إذا كان التطبيق قيد التشغيل بعد تلقي الإشعارات عن بُعد ، ويمكنك وضع نقطة توقف في الكود الأصلي الحالي ، فيجب أن تكون قادرًا على الاتصال برمز flutter / dart الخاص بك حيث توجد خدماتك ونماذجك وأخيراً واجهة المستخدم.

لجعلها في حالتك ... دعنا نقول أن الموسيقى الخاصة بك يتم تشغيلها في الخلفية ثم تنتهي من قائمة التشغيل الخاصة بك ... بعد 10 دقائق يتم إيقاف تشغيل التطبيق الخاص بك. ثم تتصل بـ siri ، أو تستخدم سماعات الرأس لبدء التشغيل مرة أخرى لتطبيقك ، مهما كانت نقطة الدخول التي اخترتها ... يتم تنفيذ الكود الأصلي ، ولكن ليس واجهة المستخدم الخاصة به ، لم يتم تهيئة رمز الرفرفة الخاص بك وفقدت كما أنا مع إشعاراتي.

لذلك لا ، ليس من الممكن ، يمكنني كتابة إشعار اصطياد المكون الإضافي الأصلي لي ، ولكن بعد ذلك أحتاج إلى الوصول إلى منطق الأعمال الفوضوية لمعالجة البيانات ، في حالتي ، فك تشفير التشفير وإصدار إشعار محلي بمحتوى غير مشفر

سنقوم باختباره على هاتفي على نطاق واسع وهو يعمل دون مشاكل على الإطلاق.
ربما لم يقتل هاتفي التطبيق أبدًا. سيئ بعد ذلك.

christocracy هل هناك تحديث بخصوص المكون الإضافي background_fetch ، كريس؟

ethael إليك الريبو الفارغ لتراقب التحديثات.
https://github.com/transistorsoft/flutter_background_fetch

@ radvansky-tomas يمكنك التعامل مع أحداث الخلفية في كود Dart عن طريق إنشاء خلفية معزولة كما هو موضح في هذا المنشور المتوسط ​​عند تنفيذ الخلفية . ستحتاج على الأرجح إلى كتابة بعض التعليمات البرمجية الأصلية لكل نظام أساسي لتلائم احتياجاتك الخاصة ما لم يكن هناك مكون إضافي موجود بالفعل يقوم بما تريد (من غير المحتمل ، لأنني غير مدرك للعديد من المكونات الإضافية التي تدعم تنفيذ الخلفية في الوقت الحالي).

bkonyi شكرًا لك على الرد ، لقد بدأت في تغيير المكون الإضافي firebase_messaging لدعم تنفيذ الخلفية ... لكن هذه المشكلة تتعلق أكثر بطريقة عامة للقيام بذلك. أعني أنه يجب أن يكون جزءًا من template = 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 لإضافة هذا الدعم ، لكننا سنكون أكثر من سعداء لمساعدتك في التصميم والمراجعات إذا كنت تخطط لتقديم طلب سحب.

لقد أنهيت هذا الجزء إلى حد كبير ، لذا يمكنني الآن تلقي إشعارات دفع صامتة ويتم تنفيذ رد الاتصال المكتوب في dart أثناء وجود التطبيق في الخلفية.

ومع ذلك ، لا يمكنني الوصول إلى أي مكون إضافي آخر هناك. يجب أن يكون رد الاتصال طريقة جذر / ثابتة ولا تعرف حقًا كيفية استدعاء أي شيء من هناك.

لذلك حاولت إجراء اختبار بسيط ، لاستخدام مكون إضافي للإعلام المحلي flutter لإرسال إشعار محلي بعد تلقي إشعار صامت ، ولكن يبدو أن المكون الإضافي لا يمكن الوصول إليه (غير مسجل؟)

لقد وجدت منشورات مماثلة هنا: 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()); }

السؤال ليس كيفية الوصول إلى جميع أكواد dart + المكونات الإضافية من رد الاتصال ... استعلام firestore ، إلخ

تم إطلاق تطبيق "جلب الخلفية" الخاص بي أخيرًا.
جلب_الخلفية

christocracy ، أنت على حق ، لكنني كنت آمل أن يكون لدى واحدة من أكبر الشركات في العالم الموارد اللازمة لتطوير منتج كامل الميزات ولا يتطلب من مستخدميه إنفاق عشرات الآلاف من الدولارات لجعله قابلاً للاستخدام بشكل كافٍ.

هذا صحيح جدا. إذا حصلت على وقت الناس ، فيجب أن ترد لهم شيئًا. إذا لم يكن الأمر كذلك ، فلا تصنع هذه العناوين التسويقية الفاخرة!

يبدو أن هذه المشكلة لا تزال تسبب مشاكل للناس؟ إنه مغلق ولديه الكثير من التعليقات ، لذلك من غير المحتمل أن نجري العديد من التغييرات الملموسة في المشروع من هذه المشكلة. :( (سنحتاج إلى تقديم ملفات جديدة لتحقيق المزيد من التقدم الذي أتوقعه.)

سأكون مهتمًا جدًا بتوثيق التغييرات الملموسة المطلوبة هنا. هل يبدو أن المزيد من الأمثلة الخلفية مطلوبة؟ (على سبيل المثال https://github.com/flutter/flutter/issues/23794)

على أي حال ، نود تقديم مشكلات فردية مع طلبات فردية. كما لاحظ آخرون أعلاه ، يعد Flutter مشروعًا كبيرًا ومعقدًا ، وعلى الرغم من أن لدينا فريقًا كبيرًا (ومتوسعًا بسرعة) هنا في Google ، إلا أننا ما زلنا لا نملك عددًا كافيًا من المهندسين يعملون بدوام كامل على Flutter للإجابة على جميع المشكلات في وقت واحد. Flutter هو مصدر مفتوح بنسبة 100٪ وجميع مشكلاتنا موجودة على GitHub. البقع هي دائما موضع ترحيب بالطبع. :)

بالنسبة إلى أي مشكلات / تغييرات مطلوبة ، يرجى تقديم مشكلات جديدة للسماح لجميع المساهمين بمعرفة كيف يمكننا تقديم المزيد من المساعدة: https://github.com/flutter/flutter/issues/new

شكرا!

قبول تحدي eseidel : # 24278

كنت آمل في تجنب كتابة رمز خاص بالجهاز والحصول على تطبيق Flutter Dart API ربما بناءً على الأحداث التي من شأنها إخفاء مواصفات الجهاز ونظام التشغيل والتنفيذ المحدد.

تم حلها بالفعل هنا

@ Krunal79-flutter كيف بالضبط ، هذا النهج لا يزال لديه نفس المشاكل. الشيء هو أنه في السيناريو الخاص بك تم تهيئة الرفرفة بالفعل ولم يكن الوصول إلى الخلفية مناسبًا بعد ذلك. المشكلة التي واجهتها هي عندما يكون التطبيق ميتًا بالفعل وسيؤدي الإشعار الصامت (أو إضافة التطبيق) إلى تنشيط تطبيقك وتحتاج إلى تنفيذ منطق "dart" أثناء عدم تشغيل flutter بعد (أي عدم وجود واجهة مستخدم).

يجب أن يكون هذا حقًا مسألة ذات أولوية أعلى بكثير لمن يدير فريق Flutter. يعد تنفيذ وظائف الخلفية بمثابة ألم كبير لمطور Flutter العادي وهو ينهار في كثير من الأحيان بطرق غير تافهة. وأنا متأكد من أن الكثير من مطوري التطبيقات يعانون حاليًا من هذا الأمر.

@ tomoerlemans010 يرجى الاطلاع على التعليق في https://github.com/flutter/flutter/issues/3671#issuecomment -438113161.

تم إغلاق هذه المشكلة بالذات ، يرجى إضافة تعليقات إلى المشكلات المفتوحة الأخرى المتعلقة بتنفيذ الخلفية أو إنشاء واحدة جديدة بالمشكلات التي تواجهها.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات