Flutter Dev نشر 1 نوفمبر 2020 أرسل تقرير نشر 1 نوفمبر 2020 السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع قمت بعمل نموذج مشروع لتشغيل workmanager لجعل التطبيق يعمل في الخلفية اثناء ما المستخدم خارج التطبيق المشكلة الان التطبيق على الاندرويد شغال ولكن مع تشغيله في ios ومحاكي على الماك تظهر المكله التاليه: [VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: MissingPluginException(No implementation found for method initialize on channel be.tramckrijte.workmanager/foreground_channel_work_manager) #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:159:7) <asynchronous suspension> #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12) #2 Workmanager.initialize (package:workmanager/src/workmanager.dart:100:30) #3 _MyHomePageState.initState (package:toios/main.dart:58:17) #4 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4684:58) #5 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4520:5) #6 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3490:14) #7 Element.updateChild (package:flutter/src/widgets/framework.dart:3258:18) #8 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5874:14) #9 Element.inflat<…> [VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: MissingPluginException(No implementation found for method registerPeriodicTask on channel be.tramckrijte.workmanager/foreground_channel_work_manager) #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:159:7) <asynchronous suspension> #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12) #2 Workmanager.registerPeriodicTask (package:workmanager/src/workmanager.dart:158:32) #3 _MyHomePageState.initState (package:toios/main.dart:63:17) #4 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4684:58) #5 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4520:5) #6 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3490:14) #7 Element.updateChild (package:flutter/src/widgets/framework.dart:3258:18) #8 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5874:14) #9<…> وصفحات الكود كامل كالتالي انا عاملها: import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:workmanager/workmanager.dart'; import 'package:toios/notification.dart' as notif; const fetchBackground = "fetchBackground"; void callbackDispatcher() { Workmanager.executeTask((task, inputData) async { switch (task) { case fetchBackground: //Geolocator geoLocator = Geolocator()..forceAndroidLocationManager = true; Position userLocation = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high); notif.Notification notification = new notif.Notification(); notification.showNotificationWithoutSound(userLocation); break; } return Future.value(true); }); } void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override void initState() { super.initState(); // We don't need it anymore since it will be executed in background //this._getUserPosition(); Workmanager.initialize( callbackDispatcher, isInDebugMode: true, ); Workmanager.registerPeriodicTask( "1", fetchBackground, frequency: Duration(minutes: 30), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( "", style: Theme.of(context).textTheme.display1, ), ], ), ), ); } } import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:geolocator/geolocator.dart'; class Notification { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; Future showNotificationWithoutSound(Position position) async { print(position.toString()); var androidPlatformChannelSpecifics = new AndroidNotificationDetails( '1', 'location-bg', 'fetch location in background', playSound: false, importance: Importance.Max, priority: Priority.High); var iOSPlatformChannelSpecifics = new IOSNotificationDetails(presentSound: false); var platformChannelSpecifics = new NotificationDetails( androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); await flutterLocalNotificationsPlugin.show( 0, 'Location fetched', position.toString(), platformChannelSpecifics, payload: '', ); } Notification() { var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettingsIOS = new IOSInitializationSettings(); var initializationSettings = new InitializationSettings( initializationSettingsAndroid, initializationSettingsIOS); flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); flutterLocalNotificationsPlugin.initialize(initializationSettings); } } اذا احد يعرف حل للمشكله ياليت يفيدنا ابها اقتباس
1 Wael Aljamal نشر 3 نوفمبر 2020 أرسل تقرير نشر 3 نوفمبر 2020 يوجد بعض الخطوات في توثيق المكتبة خاصة بعملها على IOS يمكنك مراجعتها جلبت الخطوات الرئيسية : تأكد أن platform :ios,10.0 على الأقل تفعيل Enabling Background Fetch في ملف Info.plist أضف UIBackgroundModes بالطريقة التالية <key>UIBackgroundModes</key> <array> <string>fetch</string> </array> تعديل في ملف project.pbxproj SystemCapabilities = { com.apple.BackgroundModes = { enabled = 1; }; }; ضمن didFinishLaunchingWithOptions, حدد minimumBackgroundFetchInterval class AppDelegate:UIResponder,UIApplicationDelegate{ func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->Bool{ // Other intialization code… UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15)) return true } } بالتوفيق 1 اقتباس
1 Wael Aljamal نشر 3 نوفمبر 2020 أرسل تقرير نشر 3 نوفمبر 2020 بتاريخ 11 دقائق مضت قال مروان مروان3: ربي يعطيك الف عافيه عزيزي بس سوال لو تكرمت هل هذا الاضافة من خلالها اقدر استعملها على المنصتين مثل خدمة service في الجافا او الاندرويد بالاصح انا ارغب بتشغيل دالة استعلام في الخلفية بشكل مستمر طوال ما المستخدم خارج التطبيق حتى تجلب لي الاشعارات من قاعدة البيانات هل هذا الطريقة بتكون مفيده الى هذا العمل؟ نعم هي مصممة لهذا الغرض ويوجد مثال في شرح المكتبة يمكنك دراسته ومن ثم التعديل و كتابة الدوال الخاصة بك حسب توصيف المكتبة : Flutter WorkManager is a wrapper around Android's WorkManager and iOS' performFetchWithCompletionHandler, effectively enabling headless execution of Dart code in the background. This is especially useful to run periodic tasks, such as fetching remote data on a regular basis. هي تقوم بمحاكاة عمليات الخلفية لجلب البيانات في كلا نظامي أندرويد و ios و تساعد في تنفيذ شيفرة مكتوبة بلغة DART في الخلفية، تعمل بشكل خاص للمهام المجدولة كجلب بيانات من المخدم 1 اقتباس
0 Flutter Dev نشر 3 نوفمبر 2020 الكاتب أرسل تقرير نشر 3 نوفمبر 2020 بتاريخ 4 دقائق مضت قال Wael Aljamal: يوجد بعض الخطوات في توثيق المكتبة خاصة بعملها على IOS يمكنك مراجعتها جلبت الخطوات الرئيسية : تأكد أن platform :ios,10.0 على الأقل تفعيل Enabling Background Fetch في ملف Info.plist أضف UIBackgroundModes بالطريقة التالية <key>UIBackgroundModes</key> <array> <string>fetch</string> </array> تعديل في ملف project.pbxproj SystemCapabilities = { com.apple.BackgroundModes = { enabled = 1; }; }; ضمن didFinishLaunchingWithOptions, حدد minimumBackgroundFetchInterval class AppDelegate:UIResponder,UIApplicationDelegate{ func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->Bool{ // Other intialization code… UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15)) return true } } بالتوفيق ربي يعطيك الف عافيه عزيزي بس سوال لو تكرمت هل هذا الاضافة من خلالها اقدر استعملها على المنصتين مثل خدمة service في الجافا او الاندرويد بالاصح انا ارغب بتشغيل دالة استعلام في الخلفية بشكل مستمر طوال ما المستخدم خارج التطبيق حتى تجلب لي الاشعارات من قاعدة البيانات هل هذا الطريقة بتكون مفيده الى هذا العمل؟ اقتباس
0 Flutter Dev نشر 3 نوفمبر 2020 الكاتب أرسل تقرير نشر 3 نوفمبر 2020 بتاريخ الآن قال Wael Aljamal: نعم هي مصممة لهذا الغرض ويوجد مثال في شرح المكتبة لهذا الغرض يمكنك دراسته ومن ثم التعديل و كتابة الدوال الخاصة بك حسب توصيف المكتبة : Flutter WorkManager is a wrapper around Android's WorkManager and iOS' performFetchWithCompletionHandler, effectively enabling headless execution of Dart code in the background. This is especially useful to run periodic tasks, such as fetching remote data on a regular basis. هي تقوم بمحاكاة عمليات الخلفية لجلب البيانات في كلا نظامي أندرويد و ios و تساعد في تنفيذ شيفرة مكتوبة بلغة DART في الخلفية، تعمل بشكل خاص للمهام المجدولة كجلب بيانات من المخدم ممتاز جد ربي يعطيك الف صحه وعافيه عزيزي على التوضيح 1 اقتباس
السؤال
Flutter Dev
السلام عليكم ورحمة الله وبركاته
تحيه طيبه للجميع
قمت بعمل نموذج مشروع لتشغيل workmanager لجعل التطبيق يعمل في الخلفية اثناء ما المستخدم خارج التطبيق المشكلة الان التطبيق على الاندرويد شغال ولكن مع تشغيله في ios ومحاكي على الماك تظهر المكله التاليه:
وصفحات الكود كامل كالتالي انا عاملها:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:geolocator/geolocator.dart'; class Notification { FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; Future showNotificationWithoutSound(Position position) async { print(position.toString()); var androidPlatformChannelSpecifics = new AndroidNotificationDetails( '1', 'location-bg', 'fetch location in background', playSound: false, importance: Importance.Max, priority: Priority.High); var iOSPlatformChannelSpecifics = new IOSNotificationDetails(presentSound: false); var platformChannelSpecifics = new NotificationDetails( androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); await flutterLocalNotificationsPlugin.show( 0, 'Location fetched', position.toString(), platformChannelSpecifics, payload: '', ); } Notification() { var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettingsIOS = new IOSInitializationSettings(); var initializationSettings = new InitializationSettings( initializationSettingsAndroid, initializationSettingsIOS); flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); flutterLocalNotificationsPlugin.initialize(initializationSettings); } }
اذا احد يعرف حل للمشكله ياليت يفيدنا ابها
4 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.