5.2 KiB
5.2 KiB
رفع مشکل فریز شدن اپ موبایل با اینترنت داخلی
مشکل
هنگام استفاده از اینترنت داخلی (بدون فیلترشکن)، اپلیکیشن موبایل در صفحه لودینگ فریز میشد و باز نمیشد. این به دلیل timeout های طولانی در موارد زیر بود:
- Firebase Initialization: تلاش برای اتصال به سرورهای گوگل تا 30 ثانیه
- Firebase Notifications: دریافت توکن FCM از سرورهای گوگل
- User Info Fetch: درخواستهای API بدون محدودیت زمانی
- 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) | اپ باز میشود |
تست
برای تست این تغییرات:
-
با اینترنت داخلی:
flutter run --releaseاپ باید در کمتر از 25 ثانیه باز شود
-
بدون اینترنت: اپ باید خطای اتصال نشان دهد و دکمه "تلاش مجدد" را نمایش دهد
-
با فیلترشکن: اپ باید نرمال کار کند (کمتر از 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