didvan-app/MOBILE_NETWORK_FIX.md

152 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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