arc/docs/ANDROID_AUTO_UPDATE.md

90 lines
4.7 KiB
Markdown
Raw Permalink 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.

# به‌روزرسانی خودکار اندروید (Forgejo Releases)
## هدف
کاربران APK خارج از مارکت، هنگام انتشار نسخهٔ جدید در
[ریلیزهای مخزن](https://source.hesabix.ir/hesabix/arc/releases) اعلان بگیرند،
APK را دانلود کنند و نصب را آغاز کنند. **وب تحت تأثیر قرار نمی‌گیرد**
(مسیر `version.json` / `web/index.html` دست‌نخورده می‌ماند).
## معیار نسخه (قرارداد الزامی از این پس)
| مورد | مقدار |
|------|--------|
| منبع حقیقت | تگ ریلیز Forgejo (`tag_name`) |
| قالب | `MAJOR.MINOR.PATCH` — سه عدد صحیح نامنفی، مثلاً `70.9.911` |
| `versionName` در APK | **همان** تگ ریلیز |
| `versionCode` پیشنهادی | `MAJOR * 1_000_000 + MINOR * 1_000 + PATCH` (مثلاً `70009911`) |
| مقایسه | تاپل `(MAJOR, MINOR, PATCH)`؛ نسخهٔ جدیدتر = بزرگ‌تر بودن تاپل |
| ریلیز معتبر | `draft=false` و `prerelease=false` |
| فایل APK | اولین asset با پسوند `.apk`؛ در صورت چندتایی، اولویت با نام شامل `app-release` |
در `pubspec.yaml` باید همان نسخه تنظیم شود، مثلاً:
```yaml
version: 70.9.911+70009911
```
یا هنگام بیلد:
```bash
flutter build apk --build-name=70.9.911 --build-number=70009911
```
## سناریوی کاربر
1. اپ اندروید پس از اتمام splash (با تأخیر کوتاه) آخرین ریلیز را از API Forgejo می‌خواند.
2. اگر نسخهٔ ریموت از نسخهٔ نصب‌شده بزرگ‌تر باشد و کاربر آن را «بعداً» نزده باشد:
- اعلان درون‌برنامه‌ای (دیالوگ) با changelog نمایش داده می‌شود.
- در صورت فعال بودن دانلود خودکار، دانلود APK شروع می‌شود.
3. پس از اتمام دانلود، نصب‌کنندهٔ سیستم باز می‌شود (تأیید کاربر الزامی است؛ محدودیت اندروید).
4. در **تنظیمات حساب کاربری → به‌روزرسانی برنامه**:
- نمایش نسخهٔ فعلی / آخرین نسخه
- بررسی دستی
- دانلود و نصب
- تنظیمات: بررسی خودکار هنگام شروع، دانلود خودکار
- در صورت نیاز، هدایت به تنظیمات «نصب از منابع ناشناس»
## فازهای اجرایی
| فاز | شرح | وضعیت |
|-----|------|--------|
| ۱ | هسته: پارس نسخه، کلاینت Forgejo، گیت پلتفرم | پیاده‌سازی‌شده |
| ۲ | نیتیو: FileProvider + MethodChannel نصب APK | پیاده‌سازی‌شده |
| ۳ | سرویس: چک / دانلود با progress / نصب | پیاده‌سازی‌شده |
| ۴ | اعلان استارت‌آپ + صفحه تنظیمات حساب | پیاده‌سازی‌شده |
| ۵ | l10n و ایزوله‌سازی از وب | پیاده‌سازی‌شده |
## API مصرف‌شده
- `GET https://source.hesabix.ir/api/v1/repos/hesabix/arc/releases/latest`
- دانلود از `assets[].browser_download_url`
## نکات امنیتی / عملیاتی
- APK باید با **همان keystore** قبلی امضا شود.
- مخزن ریلیز عمومی است؛ کلاینت اپ برای خواندن `releases/latest` توکن لازم ندارد.
- حجم APK حدود ۱۳۰MB+ است؛ progress در UI و اعلان سیستم نمایش داده می‌شود و دانلود در پس‌زمینه ادامه می‌یابد.
- وب و دسکتاپ این ماژول را اجرا نمی‌کنند (`supportsAndroidApkUpdate`).
- ریلیزهای مشترک می‌توانند هم‌زمان asset اندروید و ویندوز داشته باشند؛ کلاینت اندروید فقط `.apk` را برمی‌دارد. جزئیات ویندوز: [`WINDOWS_AUTO_UPDATE.md`](./WINDOWS_AUTO_UPDATE.md).
## انتشار خودکار ریلیز اندروید
پس از بیلد APK، از ریشهٔ مخزن:
```bash
# ترجیحاً با توکن API
FORGEJO_TOKEN='...' ./release_android_forgejo.sh
# یا با یوزر/پسورد
FORGEJO_USER='...' FORGEJO_PASSWORD='...' ./release_android_forgejo.sh
# پیش‌نمایش بدون آپلود
./release_android_forgejo.sh --dry-run
# جایگزینی ریلیز هم‌تگ
FORGEJO_TOKEN='...' ./release_android_forgejo.sh --force
```
اسکریپت نسخه را از `pubspec.yaml` می‌خواند، ریلیز با تگ `MAJOR.MINOR.PATCH` می‌سازد و
`app-release.<version>.apk` را آپلود می‌کند. جزئیات: `./release_android_forgejo.sh --help`