ارسال اشعارات للهاتف في ايام معينه خلال الاسبوع ووقت محدد Flutter

 

ارسال اشعارات للهاتف في ايام معينه خلال الاسبوع ووقت محدد بفلاتر

ارسال اشعارات للهاتف في ايام معينه خلال الاسبوع ووقت محدد بفلاتر

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


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

تم تغيير ذلك بواسطة Flutter ، إطار عمل مفتوح المصدر أنشأته Google. Ionic و React Native و Xamarin ليست سوى عدد قليل من الحلول المتاحة للمطورين اليوم لبناء تطبيقات محمولة سريعة تعمل عبر منصات مختلفة. لا تزال Dart ، لغة البرمجة المدمجة في Flutter ، محبوبة ومستخدمة جيدًا.

بالإضافة إلى تطبيقات Android المكتبية الأولية ، فإن Flutter 3 ، الذي تم تقديمه في وقت سابق من هذا العام ، يدعم أيضًا تطبيقات سطح المكتب لنظامي التشغيل MacOS و Linux.


add this packages


dependencies:

  flutter_local_notifications: ^9.6.1

  rxdart: ^0.27.4

  flutter_native_timezone: ^2.0.0



How to send notification is match Date Time and dayWeek


هذا الدرس مشابه جدا للدرس السابق والذي قمنا فيه بشرح كيف تقوم بإرسال اشعارات بعد مده معينه ولكن في هذه المقالة سوف نرسل الاشعارات في ايام معنيه فقط لجهازك والامر بسيط جدا كل ما سوف نحتاج ان نستخدم الtz وهيا التي سوف تساعدنا في هذه العملية يمكنك انشاء scheduleWeekly او حتى بشكل يومي وبعدها تضع الكود الموجود بالاسفل في داخلها وبكل بساطة عندما تريد استعمالها سوف تكون بداخل الshowScheduleNotification وعندما تريد ارسال اي اشعار في ايام معينه سوف تستخدم Time(14,55),days:[DateTime.saturday , DateTime.sunday]

وهو انك تقوم بتحديد ساعه معينه يصل اليها الاشعار للمستخدم خلال اليوم وبعدها الايام التي تريد ان يصل فيها الاشعار للمستخدم , وهذا كل ما في الامر بكل سهوله والامر بسيط جدا كما اخبرناكم .


How to send notification is match Date Time and dayWeek

ui.dart


import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_native_timezone/flutter_native_timezone.dart';
import 'package:rxdart/subjects.dart';
import 'package:tfluttert/constants/constants.dart';
import 'package:tfluttert/pages/test.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;



class FullPage extends StatefulWidget {
  const FullPage({Key? key}) : super(key: key);

  @override
  State<FullPage> createState() => _FullPageState();
}

class _FullPageState extends State<FullPage> {

  @override
  void initState() {
    super.initState();
    // Initialization notification plugin
    NotificationApi.init(initSchedule: true);
    // listen notification is click ? if yes navigate to test page and send data
    listenNotification();
    // Initialization Tz .
    tz.initializeTimeZones();


    // background notification .
    NotificationApi.showScheduleNotification(
        body: 'Notification body',
        title: 'Notification title',
        payload: 'Notification payload',
        dateTime: DateTime.now().add(const Duration(seconds: 12)));

  }

  void listenNotification ()=>
      NotificationApi.onNotifications.stream.listen((event)=>
          navToPush(context, TestPage(text: event!)));


  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child:
        Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            MaterialButton(
              color: Colors.blueAccent,
              onPressed: () =>
                NotificationApi.showNotification(title: 'AM', body: 'geecoders is here !',payload: 'GeeCoders'),
              child: const Text('Go to showNotification',style: TextStyle(color: Colors.white),),
            ),
            SizedBox(height: 20,),
            MaterialButton(
              color: Colors.blueAccent,
              onPressed: () {

                NotificationApi.showScheduleNotification(
                  title: 'AM',
                  body: 'send notification after 5 seconds',
                  payload: 'GeeCoders',
                  dateTime: DateTime.now().add(const Duration(seconds: 5)),
                );
                print(DateTime.now());
                print(DateTime.now().day);
              },
              child: const Text('Go to showScheduleNotification',style: TextStyle(color: Colors.white),),
            ),
          ],
        ),
      )
    );
  }
}


class NotificationApi {
  // define notification plugin
  static final _notification = FlutterLocalNotificationsPlugin();
  // onClick Notification ? and send Data .
  static final onNotifications = BehaviorSubject<String?>();

  static Future _notificationDetails() async {
    // channels .
    return const NotificationDetails(
      android: AndroidNotificationDetails(
        'channel id',
        'channel name',
        importance: Importance.max,
        priority: Priority.high,
        // ticker: 'ticker',
      ),
      iOS: IOSNotificationDetails(),
    );
  }

  static Future init({bool initSchedule = false}) async {
    // Initialization
    const android =  AndroidInitializationSettings('@mipmap/ic_launcher');
    const ios =  IOSInitializationSettings();
    const settings = InitializationSettings(android: android,iOS: ios);
    await _notification.initialize(
      settings,
      // on click notification .
      onSelectNotification: (payload) async {
        onNotifications.add(payload);
      },
    );

    if (initSchedule) {
      tz.initializeTimeZones();
      final locationName  = await FlutterNativeTimezone.getLocalTimezone();
      tz.setLocalLocation(tz.getLocation(locationName));

    }

  }

  // show notification .
  static Future showNotification(
      {String? title,String? body,String? payload , int id=0}) async {
      _notification.show(id, title, body, await _notificationDetails() ,payload: payload);
  }

  static Future showScheduleNotification(
      {String? title,
        String? body,
        String? payload,
        int id=0 ,
        required DateTime dateTime
      }) async {
    _notification.zonedSchedule(
        id,
        title,
        body,


        // send daily notification |  hour 2 => you can use 2 , 30 = 2:30
        // _scheduleDaily(Time(14,46)),

        // ------- OR ----------

        // send weekly notification .(select days and time)
        _scheduleWeekly(Time(14,55),days:[DateTime.saturday , DateTime.sunday]),

        await _notificationDetails() ,
        payload: payload,
        androidAllowWhileIdle: true,
        uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime,
          // if you can use DateTimeComponents.time if send daily notification .
          // send Week notification dayOfWeekAndTime .
          matchDateTimeComponents: DateTimeComponents.dayOfWeekAndTime,


    );
  }

    static tz.TZDateTime _scheduleDaily(Time time) {
      final now = tz.TZDateTime.now(tz.local);
      final scheduledDate = tz.TZDateTime(
          tz.local,
          now.year,
          now.month,
          now.day,
          time.hour , time.minute , time.second
      );

      // if DateTime is 1:25am , then it will be 1:25am tomorrow .
      return scheduledDate.isBefore(now) ? scheduledDate.add(const Duration(seconds: 15)) : scheduledDate;

    }

    static tz.TZDateTime _scheduleWeekly(Time time , {required List<int> days}) {
      tz.TZDateTime scheduledDate = _scheduleDaily(time);

      while (!days.contains(scheduledDate.weekday)) {
        scheduledDate = scheduledDate.add(const Duration(days: 1));
      }
      return scheduledDate;
    }

}


مزيد من المقالات

تعليقات