إصلاح مسار الإشعار→الطلب عند الكابتن + توحيد إعادة اتصال سوكيت الراكب
سوكيت الراكب: - setReconnectionAttempts: من 20 إلى لا نهائي، توحيداً مع تطبيق السائق. بعد 20 محاولة كان يستسلم **نهائياً** فيصمت للأبد بعد دقائق من شبكة سيئة ويبقى الراكب على الـ polling بلا أن يدري — وخطره أكبر الآن لأن الاتصال صار يعيش من فتح الخريطة لا من إنشاء الرحلة. - الـ heartbeat من 15ث إلى 30ث: Socket.IO يعمل ping/pong على مستوى البروتوكول ومستمع 'heartbeat' في passenger_socket.php فارغ أصلاً. البدء البارد على iOS (سبب "التطبيق يغلق ونرجع من أول"): - didChangeAppLifecycleState لا يُنفَّذ عند إطلاق التطبيق (يبدأ في resumed بلا انتقال حالة)، وهو المُنادي الوحيد لـ _checkPendingTrip ⇒ الضغط على الإشعار والتطبيق مقتول لا يوجّه لصفحة الطلب إطلاقاً. - وحتى لو نُفِّذ، كان يستسلم على '/' ويحوّل المسؤولية لـ HomeCaptainController الذي لا يملك أي منطق كهذا ⇒ الطلب يبقى في التخزين للأبد. صار addPostFrameCallback + مُجدوِل يعيد المحاولة حتى خروج التطبيق من شاشة البداية (سقف ~30ث)، ولا يحذف الطلب قبل التوجيه. - حرس إضافي: لا اقتحام لرحلة نشطة بطلب قديم، لا توجيه مكرر إذا كنا على OrderRequestPage، وتنظيف الحمولة التالفة. TripOverlayPlugin أندرويد فقط بلا أي حرس منصّة: - كل دالة كانت تنادي invokeMethod مباشرة ⇒ MissingPluginException على iOS (لا يوجد ios/ ولا مدخل في pubspec.plugin.platforms). - الأخطر: backgroundMessageHandler كان ينادي showOverlay **قبل** حفظ pending_driver_list، فيسقط الاستثناء ويُلغي الحفظ كلياً على iOS. عُكس الترتيب — الحفظ أولاً دائماً، وهو الحدّ الأدنى الذي لا يتوقف على منصّة أو صلاحية. - أُضيف isSupported وحُصِّنت كل الدوال (ترجع false/no-op ولا ترمي أبداً)، فلا يُقطع أيضاً _initApp قبل _listenToOverlayEvents. أخطاء index في حمولة add_ride.php (أربع نقاط قبول): - 'Duration' كان index 4 وهو end_lng لا المدة ⇒ صار 15 (duration_text). أحد المواضع كان فيه تعليق "انتبه: تأكد من الإندكس الصحيح للوقت". - 'passengerWalletBurc' كان 26 وهو price_for_driver (أرباح السائق) لا رصيد الراكب ⇒ صار 27 (passenger_wallet). - الموضعان مكرران في main.dart و local_notification.dart و order_over_lay.dart و order_request_controller.dart — وُحِّدت كلها. - حرس الطول في backgroundMessageHandler: كان length > 29 مع قراءة index 30 ⇒ RangeError على قائمة طولها 30 بالضبط. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ab3be7e2e3
commit
a26472ed9f
@@ -87,7 +87,11 @@ class MapSocketController extends GetxController {
|
||||
.setTransports(['websocket'])
|
||||
.disableAutoConnect()
|
||||
.setQuery({'id': passengerId, 'jwt': jwt})
|
||||
.setReconnectionAttempts(20)
|
||||
// محاولات لا نهائية، توحيداً مع تطبيق السائق (background_service.dart).
|
||||
// كانت 20: بعدها يستسلم السوكيت **نهائياً** فيصمت للأبد بعد بضع دقائق
|
||||
// من شبكة سيئة، ويبقى الراكب على الـ polling بلا أن يدري. صار الاتصال
|
||||
// يعيش من فتح الخريطة لا من إنشاء الرحلة، فالسقف الثابت خطر أكبر الآن.
|
||||
.setReconnectionAttempts(double.infinity)
|
||||
.setReconnectionDelay(2000)
|
||||
.setReconnectionDelayMax(10000)
|
||||
.enableReconnection()
|
||||
@@ -266,9 +270,14 @@ class MapSocketController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
/// ⚠️ زائدة عن الحاجة عملياً: Socket.IO يعمل ping/pong على مستوى البروتوكول،
|
||||
/// ومستمع 'heartbeat' في passenger_socket.php فارغ ولا يفعل شيئاً. أبقيناها
|
||||
/// بفاصل 30ث بدل 15ث لتنصيف حركتها — الاتصال صار يعيش من فتح الخريطة لا من
|
||||
/// إنشاء الرحلة، فعدد الاتصالات الخاملة أعلى بكثير. حذفها كاملاً ممكن لاحقاً
|
||||
/// بعد التأكد أن لا شيء على السيرفر يعتمد عليها لقياس الحضور.
|
||||
void _startHeartbeat() {
|
||||
_heartbeatTimer?.cancel();
|
||||
_heartbeatTimer = Timer.periodic(const Duration(seconds: 15), (timer) {
|
||||
_heartbeatTimer = Timer.periodic(const Duration(seconds: 30), (timer) {
|
||||
if (isSocketConnected && socket.connected) {
|
||||
socket.emit('heartbeat',
|
||||
{'passenger_id': box.read(BoxName.passengerID).toString()});
|
||||
|
||||
Reference in New Issue
Block a user