Files

84 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

2026-09-27 10:32:14 +03:30
# دلدل — TWA (Trusted Web Activity)
این پوشه یک پروژه‌ی کامل اندرویدی (Gradle) است که وب‌اپ `dating-app-web` رو به شکل TWA
بسته‌بندی می‌کنه — یعنی روی گوشی مثل یک اپ واقعی نصب می‌شه (بدون نوار آدرس مرورگر)، ولی
در واقع همون وب‌سایت شما رو نمایش می‌ده.
## وضعیت فعلی
- `twa-manifest.json` و کل پروژه‌ی اندروید (`app/`, `build.gradle`, `gradlew`, ...) ساخته شده.
- کلید امضا (`android.keystore`) ساخته شده — الگوریتم/شکل درست، ولی **رمز عبورش placeholder
و ناامنه** (پایین توضیح داده شده).
- `packageId` فعلاً `ir.deldel.app` و دامنه (`host`) فعلاً placeholder یعنی
`app.deldel.ir` — چون هنوز وب‌اپ روی دامنه‌ی واقعی دیپلوی نشده.
- وابستگی `com.google.androidbrowserhelper` (که در نسخه‌ی فعلی Bubblewrap استفاده می‌شه)
دیگه منتشر نمی‌شه؛ جایگزینش کردم با `com.meta.androidbrowserhelper:androidbrowserhelper:2.5.0`
(متا نگهداری این کتابخونه رو از گوگل تحویل گرفته) و `jcenter()` غیرفعال‌شده‌ی قدیمی رو با
`mavenCentral()` عوض کردم.
## ⚠️ محدودیت این سندباکس (نه پروژه)
نتونستم `./gradlew assembleRelease` رو همین‌جا کامل اجرا کنم چون این محیط sandbox به
`dl.google.com` (مخزن Maven گوگل که کتابخونه‌های androidx ازش دانلود می‌شن) دسترسی نداره —
دقیقاً همون محدودیتی که قبلاً موقع build داکر ایمیج‌ها (`docker pull`) هم دیدیم. این یک
محدودیت شبکه‌ی همین سندباکسه، نه مشکل پروژه؛ روی سیستم خودت یا هر CI عادی (GitHub Actions و
غیره) که دسترسی اینترنت کامل داره، این build بدون مشکل انجام می‌شه.
## قدم‌های باقی‌مونده (روی سیستم خودت)
### ۱. دامنه‌ی واقعی رو جایگزین کن
وقتی وب‌اپ رو دیپلوی کردی (مثلاً `app.deldel.ir` یا هر دامنه‌ای):
```bash
sed -i "s/app.deldel.ir/DOMAIN_واقعی/g" app/build.gradle twa-manifest.json
```
### ۲. اجرای build
```bash
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 # یا مسیر JDK 17 خودت
export ANDROID_HOME=~/Android/Sdk # یا مسیر Android SDK خودت
./gradlew bundleRelease # فایل AAB برای آپلود به Google Play (توصیه‌شده)
./gradlew assembleRelease # فایل APK مستقیم (برای تست/نصب دستی)
```
خروجی‌ها:
- APK: `app/build/outputs/apk/release/app-release.apk`
- AAB: `app/build/outputs/bundle/release/app-release.aab`
### ۳. Digital Asset Links (حتماً لازمه)
برای اینکه اندروید به اپ اعتماد کنه و نوار آدرس مرورگر رو مخفی کنه، باید فایل
`assetlinks.json` رو روی خودِ دامنه در مسیر `/.well-known/assetlinks.json` قرار بدی.
این فایل شامل SHA-256 فینگرپرینت کلید امضاست. برای گرفتنش:
```bash
keytool -list -v -keystore android.keystore -alias android -storepass deldel1234
```
خروجی JSON مورد نیاز رو Bubblewrap خودش می‌تونه بسازه:
```bash
npx @bubblewrap/cli fingerprint add # یا دستی طبق مستندات:
# https://developers.google.com/digital-asset-links
```
### ۴. امنیت کلید امضا (خیلی مهم)
فایل `android.keystore` با رمز placeholder `deldel1234` ساخته شده — **این فقط برای تست
محلیه**. قبل از هر انتشار واقعی روی Google Play:
- این فایل رو **هرگز به گیت commit نکن** (توی `.gitignore` بذارش).
- یا با رمز قوی‌تر از نو بسازش (`keytool -genkeypair ...`)، یا حداقل جاش رو امن نگه دار.
- گوگل‌پلی از نسخه‌های بعدی همین کلید برای آپدیت اپ استفاده می‌کنه؛ اگه گمش کنی، دیگه
نمی‌تونی همون اپ رو آپدیت کنی. توصیه می‌شه از **Play App Signing** گوگل هم استفاده کنی
(موقع اولین آپلود AAB بهت پیشنهاد می‌ده).
### ۵. آپلود به Google Play Console
فایل `.aab` تولیدشده رو در بخش Production/Internal testing کنسول Google Play آپلود کن.
حتماً `packageId` (`ir.deldel.app`) رو اگه دوست نداری قبل از هر آپلودی عوض کن — بعد از اولین
انتشار دیگه قابل تغییر نیست.
## فایل‌های کلیدی
| فایل | توضیح |
|---|---|
| `twa-manifest.json` | تنظیمات اصلی TWA (دامنه، رنگ‌ها، آیکون، signingKey) |
| `app/build.gradle` | تنظیمات build اندروید + وابستگی‌ها |
| `app/src/main/AndroidManifest.xml` | مجوزها، اکتیویتی‌ها، asset statement |
| `android.keystore` | کلید امضای اپ (placeholder — بالا توضیح داده شد) |
| `generate.js` | اسکریپتی که این پروژه رو (به‌جای ویزارد تعاملی bubblewrap) ساخت |