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