didvan-app/MOBILE_NETWORK_FIX.md

5.2 KiB
Raw Blame History

رفع مشکل فریز شدن اپ موبایل با اینترنت داخلی

مشکل

هنگام استفاده از اینترنت داخلی (بدون فیلترشکن)، اپلیکیشن موبایل در صفحه لودینگ فریز می‌شد و باز نمی‌شد. این به دلیل timeout های طولانی در موارد زیر بود:

  1. Firebase Initialization: تلاش برای اتصال به سرورهای گوگل تا 30 ثانیه
  2. Firebase Notifications: دریافت توکن FCM از سرورهای گوگل
  3. User Info Fetch: درخواست‌های API بدون محدودیت زمانی
  4. Server Data Fetch: دریافت اطلاعات سرور بدون timeout

تغییرات انجام شده

1. Firebase Initialization با Timeout (main.dart)

// قبل
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
await FirebaseApi().initNotification();

// بعد
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform)
    .timeout(
  const Duration(seconds: 10),
  onTimeout: () {
    debugPrint("Firebase initialization timed out - continuing without Firebase");
    throw TimeoutException('Firebase initialization timeout', const Duration(seconds: 10));
  },
);

await FirebaseApi().initNotification().timeout(
  const Duration(seconds: 5),
  onTimeout: () {
    debugPrint("Firebase notification init timed out - continuing");
  },
);

مزایا:

  • اگر Firebase در 10 ثانیه initialize نشد، اپ ادامه می‌دهد
  • اگر FCM توکن دریافت نشد، اپ باز می‌شود (فقط نوتیفیکیشن کار نمی‌کند)
  • کاربر دیگر در لودینگ گیر نمی‌کند

2. User Info با Timeout (splash.dart)

// قبل
final result = await userProvider.getUserInfo();

// بعد
final result = await userProvider.getUserInfo().timeout(
  const Duration(seconds: 15),
  onTimeout: () {
    debugPrint("getUserInfo timed out - treating as failure");
    return false;
  },
);

مزایا:

  • اگر سرور در 15 ثانیه پاسخ نداد، کاربر به صفحه لاگین می‌رود
  • جلوگیری از انتظار نامحدود

3. Server Data با Timeout و Error Handling

// قبل
await ServerDataProvider.getData();

// بعد
try {
  await ServerDataProvider.getData().timeout(
    const Duration(seconds: 10),
    onTimeout: () {
      debugPrint("ServerDataProvider.getData timed out - continuing without server data");
    },
  );
} catch (e) {
  debugPrint("ServerDataProvider.getData failed: $e - continuing");
  // Continue even if server data fetch fails
}

مزایا:

  • اگر دریافت تنظیمات سرور fail شد، اپ باز می‌شود
  • از مقادیر پیش‌فرض استفاده می‌شود

نتیجه

قبل از تغییرات

  • اپ در لودینگ فریز می‌شد
  • زمان انتظار: 30+ ثانیه
  • در نهایت خطا نشان می‌داد یا crash می‌کرد

بعد از تغییرات

  • اپ حداکثر در 15-25 ثانیه باز می‌شود
  • اگر Firebase/Notifications fail شد، اپ باز می‌شود (فقط نوتیفیکیشن ها کار نمی‌کنند)
  • اگر Server Data fail شد، از مقادیر پیش‌فرض استفاده می‌شود
  • تجربه کاربری بسیار بهتر با اینترنت داخلی

Timeout Summary

بخش Timeout قبل Timeout جدید رفتار در Timeout
Firebase Init 30s+ 10s ادامه بدون Firebase
FCM Token 30s+ 5s ادامه بدون Notification
User Info نامحدود 15s برو به صفحه لاگین
Server Data نامحدود 10s استفاده از مقادیر پیش‌فرض
کل 90s+ 40s (max) اپ باز می‌شود

تست

برای تست این تغییرات:

  1. با اینترنت داخلی:

    flutter run --release
    

    اپ باید در کمتر از 25 ثانیه باز شود

  2. بدون اینترنت: اپ باید خطای اتصال نشان دهد و دکمه "تلاش مجدد" را نمایش دهد

  3. با فیلترشکن: اپ باید نرمال کار کند (کمتر از 10 ثانیه)

نکات مهم

⚠️ Firebase و Notification

  • اگر Firebase initialize نشود، امکانات زیر کار نمی‌کنند:
    • Push Notifications
    • FCM
    • Firebase Analytics (اگر استفاده شود)

امکانات اصلی اپ

  • تمام امکانات اصلی اپ بدون Firebase هم کار می‌کنند
  • API ها
  • لاگین/ثبت نام
  • محتوای اپ
  • پخش رسانه

مقایسه با نسخه وب

پلتفرم مشکل راه‌حل
Web CanvasKit و فونت‌های گوگل محلی‌سازی فایل‌ها
Mobile Firebase Timeout Timeout کوتاه‌تر + Graceful Degradation

توسعه داده شده در: ژانویه 2026 نسخه اپ: 5.0.0+7006