# دلدل — 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) ساخت |