84 lines
5.4 KiB
Markdown
84 lines
5.4 KiB
Markdown
# دلدل — 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) ساخت |
|