مرکز راهنماراهنما در پنلبسته اتصال

پوش Godot

Inbox مستقیم و پوش پس‌زمینه با تنظیم واقعی سرویس.

پوش Godot برای Android و Web — نسخه ۱

اعلان این اتصال در نوار اعلان سیستم‌عامل نمایش داده می‌شود؛ کارت داخل اپ ساخته نمی‌شود. سرور اختصاصی ناشر، JWT و کلید خصوصی در اپ لازم نیست. روش استاندارد از FCM/APNs یا Web Push استفاده می‌کند؛ روش مستقیم از خود دیدنکس می‌خواند. مجوز و رضایت واقعی مخاطب در هر دو لازم است.

روش دریافت را انتخاب کنید

- استاندارد: آماده‌سازی و کد ابتدای همین صفحه مربوط به FCM/Web Push است. - مستقیم، بدون Firebase: به بخش «اتصال مستقیم بدون Firebase» در ادامه همین صفحه بروید؛ وابستگی و تنظیمات FCM بخش استاندارد را نصب نکنید. محدودیت پس‌زمینه همان‌جا نوشته شده است. - فقط یک روش را برای هر نصب فعال کنید. برای تغییر روش، adapter قبلی را close/dispose و روش جدید را فعال کنید؛ برای توقف دریافت unsubscribe لازم است.

شناسه جایگاه چیست و از کجا بگیرم؟

پوش در دیدنکس از شناسه عمومی یکی از جایگاه‌های فعال همان رسانه برای پیدا کردن اپ یا سایت شما استفاده می‌کند. پیشوند واقعی این شناسه UNT_ است. این مقدار نام اپ، شناسه بسته، شناسه رسانه با پیشوند AST_، توکن FCM یا کلید API نیست و محرمانه نیست.

در پنل ناشر، «جایگاه‌های تبلیغ» را باز کنید؛ شناسه زیر نام جایگاه دیده می‌شود. همان شناسه کامل را کپی کنید. راه ساده‌تر: در «پوش ← اتصال رسانه‌ها»، برای رسانه خود «کد پوش» را بزنید و پلتفرم را انتخاب کنید؛ کد با شناسه واقعی شما ساخته می‌شود و نیازی به حدس یا جایگزینی دستی ندارد.

در مثال عمومی زیر، placementId یا PlacementId یا PLACEMENT_ID متغیری برای نگهداری همین شناسه است. متن PASTE_YOUR_PLACEMENT_ID_HERE فقط محل جایگزینی است و شناسه قابل استفاده نیست. آن را با شناسه کامل جایگاه خودتان که با UNT_ شروع می‌شود عوض کنید. یک جایگاه فعال کافی است؛ جایگاه مخصوص پوش و نمایش تبلیغ برای عضوکردن مخاطب لازم نیست. رسانه نیز باید فعال و تأییدشده باشد و پوش آن در پنل فعال شده باشد.

مقدارمحل دریافت / کاربرد
شناسه جایگاه (UNT_…)پنل ناشر ← جایگاه‌های تبلیغ؛ ورودی ایجاد کنترلر پوش
شناسه بستهتنظیمات پروژه اپ؛ باید با رسانه اپ ثبت‌شده یکسان باشد
دامنه دیدنکسنشانی همین سرویس؛ سرور اختصاصی ناشر لازم نیست
کلید خصوصی APIداخل اپ یا مرورگر قرار نمی‌گیرد

اگر inactive_inventory دیدید، فعال و تأییدبودن رسانه و فعال‌بودن جایگاه همان رسانه را بررسی کنید. کپی‌کردن شناسه از یک حساب یا رسانه دیگر اتصال را درست نمی‌کند.

روش استاندارد — آماده‌سازی

Android: افزونه AAR را در native با ./gradlew assembleRelease -PdidnexFirebase=true بسازید و در export مبتنی بر Gradle قرار دهید. Google Services plugin و google-services.json را روی پروژه میزبان export اعمال کنید تا Firebase App با تنظیمات خود اپ مقداردهی شود. این variant، bridge توکن و سرویس FCM را وارد AAR می‌کند. اگر سرویس FCM دیگری دارید، callbackها را ادغام کنید. enable_system مجوز و توکن را بررسی می‌کند؛ نبود bridge یا پیکربندی با خطا اعلام می‌شود، نه کارت داخل بازی. مقدار بازگشتی enable_system شروع درخواست است؛ نتیجه نهایی را از system_subscription بگیرید.

Web: HTML shell را با SDK وب و worker هم‌دامنه آماده کنید؛ فعال‌سازی باید از gesture دکمه کاربر انجام شود. Godot iOS و desktop در این بسته افزونه پوش ندارند و خطای صریح می‌گیرند؛ پشتیبانی جعلی با پیام داخل بازی انجام نمی‌شود.

AAR خام وابستگی Maven را همراه خود بسته‌بندی نمی‌کند. در build.gradle ماژول app میزبانِ Gradle export این وابستگی‌ها را هم اضافه کنید:

dependencies {
 implementation platform("com.google.firebase:firebase-bom:34.4.0")
 implementation "com.google.firebase:firebase-messaging"
}

Google Services plugin به‌تنهایی جای وابستگی Firebase Messaging را نمی‌گیرد. این وابستگی‌ها فقط برای export دارای پوش لازم‌اند.

کد اتصال استاندارد

extends Node
const PLACEMENT_ID="PASTE_YOUR_PLACEMENT_ID_HERE"
var client: Didnex
var push: DidnexPush
func _ready() -> void:
 client=Didnex.new()
 add_child(client)
 client.initialize("https://didnex.com")
 push=client.create_push(PLACEMENT_ID)
 push.push_error.connect(func(code: String): push_warning(code))
 push.system_subscription.connect(func(enabled: bool): print("push enabled: ",enabled))
 push.notification_opened.connect(func(value: Dictionary): print("notification_opened"))
func enable_notifications() -> void:
 await push.enable_system(true) # Bind to a real consent button.
func disable_notifications() -> void:
 push.unsubscribe()
func _exit_tree() -> void:
 if is_instance_valid(push): push.close()

Manifest و مجوز روش استاندارد

Android Gradle export: INTERNET + POST_NOTIFICATIONS + Firebase App configuration + FCM AAR variant.
Web: HTTPS + /didnex-push-sw.js + shared SDK in HTML shell.

تنظیم یک‌باره ناشر

در «پوش ← اتصال رسانه‌ها»، پوش همان رسانه فعال و تأییدشده را روشن کنید. فقط اگر روش استاندارد FCM را انتخاب کرده‌اید، JSON حساب سرویس همان پروژه Firebase را فقط در پنل ثبت کنید؛ کلید خصوصی Service Account نباید داخل اپ، مخزن عمومی یا مرورگر باشد. google-services.json و GoogleService-Info.plist تنظیمات کلاینت اپ هستند و با Service Account فرق دارند. iOS در روش استاندارد به کلید APNs و قابلیت Push Notifications همان bundle نیاز دارد. برای وب، VAPID را دیدنکس ایجاد می‌کند و Service Worker روی دامنه خود ناشر است. سرویس OneSignal وابستگی این اتصال نیست؛ مخاطبان، صف و آمار در دیدنکس مدیریت می‌شوند.

کلاینت تبلیغات و پوش را مشترک نگه دارید. init هیچ اجازه‌ای درخواست نمی‌کند. فعال‌سازی را فقط در پاسخ به دکمه رضایت انجام دهید؛ برای راه‌اندازی بعدی، restore صرفاً رضایت قبلی را بازیابی می‌کند و مجوز تازه نمی‌خواهد. توکن تازه را دوباره ثبت و opt-out را به unsubscribe متصل کنید. close/dispose فقط شنونده محلی را می‌بندد؛ برای لغو عضویت سرور، unsubscribe لازم است. خطاها را کنترل کنید تا اپ به کار عادی ادامه دهد. اگر Firebase یا Service Worker دارید، callbackها را ادغام کنید و سرویس/worker تکراری نسازید.

تأیید ایمیل، مربوط به حساب ناشر در پنل است؛ کاربر نهایی اپ برای دریافت تبلیغ یا پوش، به حساب دیدنکس یا ورود نیاز ندارد. رضایت و مجوز اعلان همچنان الزامی است.

لینک مقصد اعلان

لینک لمس، دکمه و گونه می‌تواند HTTP یا HTTPS هر دامنه باشد؛ محدود به رسانه نیست. لینک اجرایی، فایل، داده و اطلاعات ورود رد می‌شوند. خالی یعنی صفحه اصلی سایت یا صفحه انتشار اپ. این مجوز برای مقصد است؛ اتصال سرویس و رسید فقط HTTPS خود دیدنکس است. Worker روی سایت ناشر نصب می‌شود. پشتیبانی HTTP در دستگاه نیازمند SDK همین انتشار است.

تست دستگاه

۱. بسته جدید همین پلتفرم و adapter آن را در اپ جایگزین کنید؛ آپدیت سرور به‌تنهایی SDK نصب‌شده روی دستگاه را تغییر نمی‌دهد. خروجی Release واقعی بگیرید. مجوز را با دکمه فعال‌سازی دریافت کنید.

۲. در پنل باید اشتراک FCM یا Web Push دیده شود؛ Inbox برای ارسال پنل کافی نیست. اعلان آزمایشی بفرستید. در پیش‌زمینه، پس‌زمینه و شروع سرد با لمس اعلان، نوار اعلان سیستم‌عامل را بررسی کنید؛ صفحه اپ نباید کارت اعلان اضافه کند.

۳. رد مجوز، اینترنت قطع، پیام منقضی و پیام تکراری را بررسی کنید؛ نباید delivered جعلی ساخته شود. بعد از لغو عضویت، ارسال بعدی نباید مخاطب را صف کند. اعلان قبلاً تحویل‌شده به provider ممکن است هنوز در مسیر باشد. receipt حاوی دسترسی خصوصی است و نباید وارد گزارش عمومی شود.

۴. دریافت پذیرفته‌شده توسط FCM به معنی دیده‌شدن نیست. در بعضی اعلان‌های پس‌زمینه، OS بدون اجرای SDK نمایش می‌دهد و delivered قابل گزارش نیست؛ آن را از accepted حدس نزنید. روی Android بدون Google Play Services یا بدون دسترسی شبکه به FCM، این مسیر ممکن است آماده نباشد. محدودیت سیستم‌عامل را با پیام داخل اپ جایگزین نکنید.

انتخاب مسیر و محدودیت مستقیم

برای فعال‌سازی روش مستقیم، روشن‌بودن پوش رسانه کافی است؛ Service Account، google-services.json و VAPID لازم نیست. هنگام ارسال پنل، همه مسیرهای اعلان به‌صورت پیش‌فرض مخاطب هستند؛ در تنظیمات بیشتر می‌توانید فقط «مستقیم» یا فقط «استاندارد» را انتخاب کنید. یک نصب هم‌زمان یک مسیر فعال دارد؛ تغییر روش، اشتراک روش قبلی را لغو می‌کند. controller/adapter قبلی را قبل از انتخاب تازه close کنید و فقط controller انتخاب‌شده را restore کنید. برای انصراف مخاطب از همه اعلان‌های این نصب unsubscribe را به کار ببرید.

در Android بومی، B4A، Flutter Android، Unity Android و Godot Android دریافت دوره‌ای JobScheduler با حداقل ۱۵ دقیقه ممکن است. این زمان‌بندی دقیق نیست و سیستم می‌تواند آن را عقب بیندازد. در iOS، React Native و وب دریافت مستقیم فقط زمان فعالیت اپ/صفحه است؛ برای دریافت از راه دور هنگام بسته‌بودن، مسیر استاندارد را انتخاب کنید. nativeBuild=not_run را به معنی تست دستگاه نگیرید.

API قدیمی

Inbox صرفاً برای سازگاری و ارسال صریح deliveryChannel=inbox باقی مانده و مسیر پنل نیست. برچسب‌ها، بخش مخاطب، quiet hours و هویت امضاشده در همان کنترلر قابل استفاده‌اند. اتصال عادی به سرور اختصاصی ناشر نیاز ندارد؛ اگر هویت امضاشده کاربر خودتان را می‌خواهید، فقط تولید همان proof به سرور امن خودتان نیاز دارد.

رفتار اعلان استاندارد

پیام notification+data در پس‌زمینه توسط provider به سیستم‌عامل می‌رسد؛ آن را دوباره نمایش ندهید. در پیش‌زمینه، adapter این بسته اعلان بومی می‌سازد. accepted پذیرش سرویس است؛ delivered ثبت اعلان در سیستم‌عامل از دید SDK و opened لمس واقعی است. حالت مزاحم نشوید، محدودیت باتری یا Force Stop ممکن است نمایش را محدود کند.

مرجع رسمی

https://docs.godotengine.org/en/stable/tutorials/platform/android/android_plugin.html https://firebase.google.com/docs/cloud-messaging/android/client

اتصال مستقیم بدون Firebase

برای Android، AAR پیش‌فرض native را بدون -PdidnexFirebase=true بسازید و در Gradle export نصب کنید. manifest و نمایشگر مستقیم همراه آن هستند؛ Google Services و Firebase لازم نیستند. در Web، SDK وب و worker هم‌دامنه را مثل روش مستقیم وب آماده کنید. نتیجه نهایی از سیگنال system_subscription می‌آید، نه مقدار بازگشتی شروع درخواست.

extends Node
const PLACEMENT_ID="PASTE_YOUR_PLACEMENT_ID_HERE"
var client: Didnex
var push: DidnexPush
func _ready() -> void:
 client=Didnex.new()
 add_child(client)
 client.initialize("https://didnex.com")
 push=client.create_push(PLACEMENT_ID)
 push.push_error.connect(func(code: String): push_warning(code))
 push.system_subscription.connect(func(enabled: bool): print("direct enabled: ",enabled))
 await push.restore_direct(true)
func enable_from_consent_button() -> void:
 await push.enable_direct(true, true)
func disable_notifications() -> void:
 push.unsubscribe()
func _exit_tree() -> void:
 if is_instance_valid(push): push.close()

Manifest مستقیم

Android: default AAR + merged direct JobService, INTERNET, POST_NOTIFICATIONS, RECEIVE_BOOT_COMPLETED.
Web: HTTPS + same-site Service Worker; no VAPID or Firebase needed.

محدودیت دریافت مستقیم

Android دوره‌ای نامعین حداقل ۱۵ دقیقه؛ Web فقط هنگام فعال‌بودن صفحه. Godot iOS و desktop در این بسته افزونه پوش ندارند.