# رفع مشکل فریز شدن اپ موبایل با اینترنت داخلی ## مشکل هنگام استفاده از اینترنت داخلی (بدون فیلترشکن)، اپلیکیشن موبایل در صفحه لودینگ فریز می‌شد و باز نمی‌شد. این به دلیل 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](lib/main.dart)) ```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](lib/views/splash/splash.dart)) ```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 ```dart // قبل 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. **با اینترنت داخلی:** ```bash 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