152 lines
5.2 KiB
Markdown
152 lines
5.2 KiB
Markdown
# رفع مشکل فریز شدن اپ موبایل با اینترنت داخلی
|
||
|
||
## مشکل
|
||
هنگام استفاده از اینترنت داخلی (بدون فیلترشکن)، اپلیکیشن موبایل در صفحه لودینگ فریز میشد و باز نمیشد. این به دلیل 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
|