اذهب إلى المحتوى
  • 0

مشكلة تشغيل workmanager على ios flutter

Flutter Dev

السؤال

السلام عليكم ورحمة الله وبركاته

تحيه طيبه للجميع

قمت بعمل نموذج مشروع لتشغيل 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);
  }
}

 

 

اذا احد يعرف حل للمشكله ياليت يفيدنا ابها

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يوجد بعض الخطوات في توثيق المكتبة خاصة بعملها على IOS يمكنك مراجعتها

جلبت الخطوات الرئيسية :

  1. تأكد أن platform :ios,10.0 على الأقل
  2. تفعيل Enabling Background Fetchios_background_mode_fetch.thumb.png.521a713f6b8615075166b75502fcde64.png
  3. في ملف Info.plist أضف UIBackgroundModes بالطريقة التالية 
    <key>UIBackgroundModes</key>
    <array>
    	<string>fetch</string>
    </array>

     

  4. تعديل في ملف project.pbxproj 
    SystemCapabilities = {
    	com.apple.BackgroundModes = {
    		enabled = 1;
    	};
    };

     

  5. ضمن 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
بتاريخ 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 في الخلفية، تعمل بشكل خاص للمهام المجدولة كجلب بيانات من المخدم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Wael Aljamal:

يوجد بعض الخطوات في توثيق المكتبة خاصة بعملها على IOS يمكنك مراجعتها

جلبت الخطوات الرئيسية :

  1. تأكد أن platform :ios,10.0 على الأقل
  2. تفعيل Enabling Background Fetchios_background_mode_fetch.thumb.png.521a713f6b8615075166b75502fcde64.png
  3. في ملف Info.plist أضف UIBackgroundModes بالطريقة التالية 
    
    <key>UIBackgroundModes</key>
    <array>
    	<string>fetch</string>
    </array>

     

  4. تعديل في ملف project.pbxproj 
    
    SystemCapabilities = {
    	com.apple.BackgroundModes = {
    		enabled = 1;
    	};
    };

     

  5. ضمن 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
بتاريخ الآن قال 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 في الخلفية، تعمل بشكل خاص للمهام المجدولة كجلب بيانات من المخدم

ممتاز جد ربي يعطيك الف صحه وعافيه عزيزي على التوضيح

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...