Files

دلدل — 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 یا هر دامنه‌ای):

sed -i "s/app.deldel.ir/DOMAIN_واقعی/g" app/build.gradle twa-manifest.json

۲. اجرای build

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

برای اینکه اندروید به اپ اعتماد کنه و نوار آدرس مرورگر رو مخفی کنه، باید فایل assetlinks.json رو روی خودِ دامنه در مسیر /.well-known/assetlinks.json قرار بدی. این فایل شامل SHA-256 فینگرپرینت کلید امضاست. برای گرفتنش:

keytool -list -v -keystore android.keystore -alias android -storepass deldel1234

خروجی JSON مورد نیاز رو Bubblewrap خودش می‌تونه بسازه:

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) ساخت