بکاند و حسابهای کاربری
تحلیلها، ورود با Facebook و اشتراکها - راهاندازی
Firebase Analytics، Facebook Login و RevenueCat، مرحلهبهمرحله
1این کارت چه چیزی را وصل میکند#
مرحله Integrate کارتی به نام Sign-in, analytics & subscriptions دارد. این کارت حسابهای خودتان را وصل میکند:
- Firebase Analytics: چه کسانی از اپلیکیشن استفاده میکنند و چه میکنند
- Facebook Login: یک دکمه «ادامه با Facebook»، بهعلاوه Meta App Events
- RevenueCat: اشتراکها و خریدها
هر کلید جداگانه است. فقط آنچه استفاده میکنید روشن کنید؛ اپلیکیشنی که همه کلیدهایش خاموش است دقیقاً مثل قبل ساخته میشود.
2Firebase Analytics: یک پروژه بسازید یا انتخاب کنید#
کنسول Firebase را باز کنید و روی Create a project بزنید (یا پروژهای را که اپلیکیشن شما از قبل برای push استفاده میکند انتخاب کنید). وقتی پرسیده شد Google Analytics را روشن نگه دارید و یک حساب Analytics انتخاب یا ایجاد کنید.
پروژهای دارید که Analytics ندارد؟ Project settings ← Integrations ← Google Analytics ← Enable.
3Firebase Analytics: اپلیکیشن Android خود را اضافه کنید#
در پروژه، روی Add app ← Android بزنید.
- Android package name: نام بسته دقیق را از مرحله Basic جادوگر تایپ کنید، مثلاً com.yourname.myapp. یک حرف اشتباه و هیچ دادهای نمیرسد.
- نام مستعار اختیاری است، و SHA-1 برای تحلیلها لازم نیست.
روی Register app و سپس Download google-services.json بزنید. میتوانید بقیه مراحل Firebase را رد کنید؛ AppMint خودش SDK را اضافه میکند.
بعداً نام بسته را تغییر دادید؟ بسته جدید را بهعنوان یک اپلیکیشن Android دیگر اضافه کنید و فایل را دوباره دانلود کنید.
4Firebase Analytics: آن را در جادوگر روشن کنید#
مرحله Integrate ← Sign-in, analytics & subscriptions ← Firebase Analytics را روشن کنید. سپس بارگذاری google-services.json در کارت Push Notifications ظاهر میشود: فایل را همانجا بارگذاری کنید. این همان فایلی است که push استفاده میکند، پس اگر قبلاً برای push بارگذاری کردهاید، کار تمام است.
برای هر تغییر صفحه یک screen view ثبت کنید: وقتی این گزینه روشن است، اپلیکیشن هر بار که مسیر صفحه شما تغییر میکند (لینکها، تغییرات history، برگشت و جلو، تغییرات #) یک screen_view با مسیر و عنوان صفحه ثبت میکند. بدون نوشتن کد میبینید مردم از کدام صفحهها استفاده میکنند. اگر صفحه شما خودش فراخوانیهای screenView میفرستد آن را خاموش بگذارید، وگرنه صفحهها دوبار شمرده میشوند.
5رویدادهای خودتان را بفرستید#
AppMint.analytics.log(name, params) یک رویداد ثبت میکند. نامها از حروف، ارقام و _ تشکیل میشوند (حداکثر ۴۰ نویسه، با یک حرف شروع شوند). پاسخ میگوید چه فرستاده شد، یا چرا نه: no_consent, not_configured, invalid_name, reserved_name.
setUserId رویدادها را با شناسه کاربری خودتان برچسب میزند (هرگز ایمیل)، setUserProperty یک ویژگی مثل plan را تنظیم میکند و screenView خودتان یک صفحه را ثبت میکند. با روشن بودن Meta App Events، log همان رویداد را به Meta هم میفرستد.
if (window.AppMint && AppMint.analytics) {
AppMint.analytics.setUserId('u_42');
AppMint.analytics.setUserProperty('plan', 'pro');
const r = await AppMint.analytics.log('add_to_cart', { item_id: 'sku-42', value: 19.99, currency: 'USD' });
if (!r.ok) console.warn('not logged', r.providers);
AppMint.analytics.screenView('Checkout', 'CheckoutPage');
}6دادهها کجا ظاهر میشوند#
کنسول Firebase ← Analytics. Realtime چند دقیقه پس از باز کردن اپلیکیشن کاربران و رویدادها را نشان میدهد. گزارشهای Dashboard و Events حدود ۲۴ ساعت بعد پر میشوند، پس خالی بودن گزارش در روز اول طبیعی است.
برای دیدن زنده همه رویدادها در زمان تست، گوشی را به کامپیوتر وصل کنید و دستور زیر را اجرا کنید، سپس اپلیکیشن را باز کنید و به Analytics ← DebugView بروید. از نام بسته خودتان استفاده کنید.
adb shell setprop debug.firebase.analytics.app com.yourname.myapp
# turn it off again:
adb shell setprop debug.firebase.analytics.app .none.7رضایت و انصراف#
در اپلیکیشنی که تبلیغ نشان میدهد، فرم رضایت Google برای تحلیلها هم تعیینکننده است: تا کاربر پاسخ ندهد چیزی جمعآوری نمیشود، و جایی که GDPR اعمال میشود کاربر باید موافقت کند. تا آن زمان فراخوانیها با no_consent پاسخ میدهند و چیزی در صف نمیرود.
صفحه شما همیشه میتواند جمعآوری را خاموش کند: AppMint.analytics.setEnabled(false) آن را متوقف میکند و به خاطر سپرده میشود، setEnabled(true) دوباره روشنش میکند. تحلیلها را در سیاست حفظ حریم خصوصی خود و در فرم Data safety در Play ذکر کنید.
document.getElementById('optOut').onchange = (e) =>
AppMint.analytics.setEnabled(!e.target.checked);8Facebook Login: اپلیکیشن Facebook را بسازید#
Meta for Developers ← My Apps ← Create app را باز کنید. کاربرد مربوط به ورود افراد با Facebook Login را انتخاب کنید (یا محصول Facebook Login را به اپلیکیشنی که دارید اضافه کنید). یک نام و ایمیل تماس بدهید.
9Facebook Login: نشانی بازگشت را اضافه کنید#
Facebook Login ← Settings ← Valid OAuth Redirect URIs:
https://freewebtoapk.com/fb-return/
را دقیقاً، با اسلش آخر، اضافه کنید. جادوگر دکمه Copy redirect URL دارد تا لازم نباشد تایپش کنید. Client OAuth login و Web OAuth login را روشن نگه دارید، سپس Save changes.
به هش کلید یا تنظیم پلتفرم Android نیازی نیست: ورود در یک زبانه مرورگر باز میشود و به اپلیکیشن شما برمیگردد.
10Facebook Login: App ID و Client Token#
App settings ← Basic شناسه App ID را نشان میدهد. App settings ← Advanced ← Security مقدار Client token را نشان میدهد. هر دو را در فیلدهای Facebook Login جادوگر جایگذاری کنید.
تا وقتی اپلیکیشن Facebook در حالت Development است، فقط افرادی که نقشی در آن دارند (شما و آزمایشکنندگان) میتوانند وارد شوند. پیش از انتشار، در App settings ← Basic یک نشانی سیاست حفظ حریم خصوصی و یک آیکون اضافه کنید و اپلیکیشن را روی Live بگذارید.
11Facebook Login: ورود افراد#
AppMint.facebook.login(permissions) Facebook را باز میکند و با توکن تمام میشود، یا وقتی کاربر انصراف دهد با ok: false و cancelled. توکن را به سرور خود بفرستید و آنجا بررسی کنید. getAccessToken() هنگام شروع صفحه توکن ذخیرهشده را برمیگرداند؛ logout() خروج میدهد.
Meta App Events را روشن کنید تا نصبها، بازشدنهای اپلیکیشن و رویدادهای خودتان به Meta Events Manager فرستاده شوند. AppMint.facebook.logEvent(name, valueToSum, params) فقط به Meta میفرستد؛ از همان قانون رضایتِ تحلیلها پیروی میکند.
const r = await AppMint.facebook.login(['public_profile', 'email']);
if (r.ok) {
await fetch('/api/login/facebook', { method: 'POST', body: JSON.stringify({ token: r.accessToken }) });
} else if (!r.cancelled) {
alert('Facebook sign-in failed: ' + (r.message || r.error));
}
AppMint.facebook.logEvent('fb_mobile_purchase', 9.99, { fb_currency: 'USD' });12RevenueCat: پروژه را بسازید و Google Play را وصل کنید#
در RevenueCat یک پروژه بسازید و یک اپلیکیشن برای Google Play Store اضافه کنید. نام بسته دقیق را از مرحله Basic وارد کنید.
RevenueCat خریدها را از طریق یک service account با Google بررسی میکند: راهنمای خود RevenueCat را برای ساخت آن در Google Cloud دنبال کنید، آن را در Play Console با مجوزهای مالیای که فهرست میکند دعوت کنید و اعتبارنامه JSON آن را در اپلیکیشن RevenueCat بارگذاری کنید. ممکن است Google یک روز یا بیشتر زمان ببرد تا اعتبارنامههای جدید کار کنند.
13RevenueCat: محصولات، entitlement و offering#
- در Play Console اشتراکها یا محصولات درونبرنامهای خود را بسازید (اپلیکیشن باید ابتدا روی یک مسیر آزمایشی بارگذاری شده باشد).
- در RevenueCat ← Product catalog همان شناسههای محصول را اضافه کنید.
- یک Entitlement بسازید، مثلاً pro، و محصولاتی را که آن را باز میکنند به آن وصل کنید.
- یک Offering بسازید (مورد پیشفرض بهعنوان جاری نشان داده میشود) با بستههایی مثل Monthly و Annual که به آن محصولات اشاره میکنند.
صفحه شما offering جاری را میخواند تا صفحه پرداخت را بکشد، و entitlement را بررسی میکند تا قابلیتها را باز کند.
14RevenueCat: کلید عمومی Google#
RevenueCat ← Project settings ← API keys: کلید PUBLIC اپلیکیشن Google Play خود را کپی کنید. با goog_ شروع میشود. آن را در فیلد RevenueCat جادوگر جایگذاری کنید.
هرگز از کلید مخفی (sk_...) استفاده نکنید. هر چیزی داخل اپلیکیشن را هر کسی که آن را دانلود کند میتواند بخواند، و کلید مخفی کنترل کامل حساب RevenueCat شما را میدهد.
15RevenueCat: offeringها، خریدها و entitlementها#
configure() RevenueCat را راهاندازی میکند (شناسه کاربری خودتان را بدهید، یا برای کاربر ناشناس چیزی ندهید). getOfferings() صفحه پرداخت را برمیگرداند، purchase(package) خرید Google Play را اجرا میکند و getCustomerInfo() میگوید کاربر چه دارد. restore() خریدهای قبلی را برمیگرداند. با یک حساب license tester و نصب از یک مسیر آزمایشی Play تست کنید.
if (window.AppMint && AppMint.revenuecat) {
await AppMint.revenuecat.configure({ appUserId: 'u_42' });
const off = await AppMint.revenuecat.getOfferings();
if (off.ok && off.current) {
const pkg = off.current.availablePackages[0];
const r = await AppMint.revenuecat.purchase(pkg);
if (r.ok) unlock();
}
const info = await AppMint.revenuecat.getCustomerInfo();
const isPro = info.ok && !!info.customerInfo.entitlements.active.pro;
}