الأسئلة الشائعة حول Pushwoosh Android SDK
- كيف يبدو رمز الإشعار الفوري (push token) و HWID في أندرويد؟
- كيف يمكنني الحصول على رمز الإشعار الفوري (push token) لجهازي الأندرويد؟
- ما هي الأذونات الضرورية وما هي الأذونات الاختيارية؟
- كيف يمكنني تعيين UserID؟
- ما مدى دقة العدد الإجمالي لمشتركي أندرويد؟
- هل يمكنني استخدام علامات HTML في الإشعارات الفورية المرسلة إلى أندرويد؟
- كيف يمكن تعيين أيقونة إشعار في Android Lollipop (والإصدارات الأحدث)؟
- استخدام Pushwoosh SDK مع خدمات FCM أخرى
- استخدام Pushwoosh مع مكتبات LeakCanary أو AppMetrica
- حذف إشعار مستلم من جهاز
كيف يبدو رمز الإشعار الفوري (push token) و HWID في أندرويد؟
Anchor link toتختلف رموز الإشعارات الفورية (push tokens) لأجهزة أندرويد في الطول (أقل من 255 حرفًا) وتبدأ بـ APA91b، على سبيل المثال:
APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq
غالبًا ما تحتوي الرموز على بادئة مفصولة بنقطتين رأسيتين قبل APA91b، على سبيل المثال: eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...
يستخدم Pushwoosh معرفات UUID كـ HWIDs، أي سلاسل أبجدية رقمية مكونة من 32 حرفًا يتم إنشاؤها عشوائيًا: 123e4567-e89b-12d3-a456-426655440000
كيف يمكنني الحصول على رمز الإشعار الفوري (push token) لجهازي الأندرويد؟
Anchor link toيمكنك الحصول على رمز الإشعار الفوري (push token) لجهازك الأندرويد في سجل وحدة التحكم (console log). استخدم أداة logcat في Android Studio.
افتح monitor.bat في %USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat، وقم بتوصيل جهازك بالكمبيوتر واسمح بتصحيح أخطاء USB في إعدادات أندرويد. قم بتشغيل تطبيقك على الجهاز. حدد موقع /registerDevice، وابحث عن رمز الإشعار الفوري لجهازك لاستخدامه في أجهزة الاختبار لاحقًا.

ما هي الأذونات الضرورية وما هي الأذونات الاختيارية؟
Anchor link toعند تثبيته على جهاز أندرويد، سيطلب التطبيق الأذونات التالية المتعلقة بـ Pushwoosh SDK:
<!-- FCM connects to Firebase Services. --> <uses-permission android:name="android.permission.INTERNET"/>
<!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- This permission is used to determine whether the device can access the network. --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- This app has permission to register and receive data message. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />لا يطلب SDK الخاص بنا إذنًا للوصول إلى الصور أو جهات اتصال الجهاز، إلخ.
كيف يمكنني تعيين UserID؟
Anchor link toيمكنك تعيين معرف المستخدم (UserID)، والذي يمكن أن يكون معرف فيسبوك، أو اسم مستخدم، أو بريدًا إلكترونيًا، أو أي معرف مستخدم فريد آخر. يتيح لك هذا مطابقة البيانات والأحداث عبر أجهزة متعددة مرتبطة بنفس المستخدم. لتعيين UserID، استدعِ طريقة setUserId.
مثال
Pushwoosh.getInstance().setUserId("testUser");ما مدى دقة العدد الإجمالي لمشتركي أندرويد؟
Anchor link toيقوم Pushwoosh بمسح أجهزة أندرويد التي ألغت اشتراكها من قاعدة البيانات عند تلقي استجابة “NotRegistered” من FCM، والتي يمكن إرجاعها بعد المحاولة الثانية للوصول إلى جهاز معين. هذا يعني أنه يجب عليك إرسال إشعارين (2 pushes) إلى جهاز ألغى اشتراكه لإزالته من قاعدة البيانات.
السيناريو التالي هو الأكثر شيوعًا الموصوف في وثائق FCM:
- يقوم المشترك بإلغاء تثبيت التطبيق.
- يرسل Pushwoosh رسالة إلى خادم FCM.
- يرسل خادم FCM الرسالة إلى جهاز المستخدم.
- يتلقى عميل FCM على الجهاز الرسالة ويكتشف أنه تم إلغاء تثبيت التطبيق؛ تعتمد تفاصيل الاكتشاف على النظام الأساسي الذي يعمل عليه التطبيق.
- يبلغ عميل FCM على الجهاز خادم FCM بأنه تم إلغاء تثبيت التطبيق.
- يقوم خادم FCM بوضع علامة على معرف التسجيل للحذف.
- يرسل Pushwoosh رسالة أخرى إلى FCM.
- يعيد FCM رسالة NotRegistered.
- يزيل Pushwoosh رمز الإشعار الفوري من قاعدة المستخدمين الخاصة بك.
قد يستغرق الأمر بعض الوقت حتى يتم إزالة معرف التسجيل بالكامل من FCM. وبالتالي، من الممكن أن تحصل رسالة مرسلة في الخطوة 7 أعلاه على معرف رسالة صالح كاستجابة، على الرغم من أن الرسالة لن يتم تسليمها إلى تطبيق العميل.
هل يمكنني استخدام علامات HTML في الإشعارات الفورية المرسلة إلى أندرويد؟
Anchor link toنعم، في أندرويد يمكنك استخدام علامات HTML التالية لتعديل مظهر الإشعار الفوري:
<span style="color: green;"><b><i><span style="text-decoration: underline;">Hello world!Hello hi hey</span></i></b></span>ضع علامات HTML هذه في حقل إدخال الرسالة (Message)، واستخدمها في طلب API أيضًا. قد تفشل بعض أجهزة أندرويد في معالجة علامات HTML هذه بشكل صحيح، ولكن معظم الأجهزة تعرض التنسيق بشكل صحيح.
كيف يمكن تعيين أيقونة إشعار في Android Lollipop (والإصدارات الأحدث)؟
Anchor link toفي Android Lollipop تم تغيير الأيقونات لتكون بيضاء فقط. لذلك، إذا قمت بتحديد targetSdkVersion >= 21 في ملف AndroidManifest.xml الخاص بك، فسيستخدم أندرويد فقط قناة ألفا (alpha-channel) للأيقونة.
انظر المزيد عن السلوك في وثائق أندرويد.
يتجاهل النظام جميع القنوات غير الألفا في أيقونات الإجراءات وفي أيقونة الإشعار الرئيسية. افترض أن هذه الأيقونات ستكون ألفا فقط. يرسم النظام أيقونات الإشعارات باللون الأبيض وأيقونات الإجراءات باللون الرمادي الداكن. هذا خارج عن سيطرة Pushwoosh SDK.
1. قم بإنشاء أيقونة الإشعار وفقًا لـ إرشادات أندرويد. وفقًا لـ الوثائق، سيتجاهل النظام جميع الألوان.
2. قم بتسمية الأيقونة pw_notification.png وضعها في مجلد res/drawable. سيستخدم Pushwoosh SDK هذه الأيقونة كأيقونة افتراضية للإشعارات.
3. بدلاً من ذلك، يمكنك استخدام Remote API وتعيين قيمة المعلمة "android_icon" إلى صورة الأيقونة (بدون امتداد الملف).
استخدام Pushwoosh SDK مع خدمات FCM أخرى
Anchor link toيمكنك استخدام Pushwoosh جنبًا إلى جنب مع SDKs أخرى تستخدم FCM للمراسلة الفورية. للقيام بذلك، قم بإنشاء خدمة توجيه (router service) لتوزيع الأحداث بين الخدمات. أولاً، أضف الاعتمادية pushwoosh-firebase بجانب وحدة Pushwoosh الرئيسية:
implementation 'com.pushwoosh:pushwoosh-firebase:6.0.3'أنشئ فئة التوجيه:
import com.pushwoosh.firebase.PushwooshFcmHelper;
class FirebaseMessagingRouterService : FirebaseMessagingService() {
override fun onNewToken(token: String?) { super.onNewToken(token) PushwooshFcmHelper.onTokenRefresh(token) sendTokenToAnotherService(token) }
override fun onMessageReceived(remoteMessage: RemoteMessage) { if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) { //this is a Pushwoosh push, SDK will handle it automatically PushwooshFcmHelper.onMessageReceived(this, remoteMessage) } else { //this is not a Pushwoosh push, you should handle it by yourself dispatchNonPushwooshMessage(remoteMessage); } }
private fun dispatchNonPushwooshMessage(remoteMessage: RemoteMessage) { // Implement your push handling logics here }}import com.pushwoosh.firebase.PushwooshFcmHelper;
public class FirebaseMessagingRouterService extends FirebaseMessagingService {
@Override public void onNewToken(String token) { super.onNewToken(token); PushwooshFcmHelper.onTokenRefresh(token); sendTokenToAnotherService(token); }
@Override public void onMessageReceived(RemoteMessage remoteMessage) { if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) { //this is a Pushwoosh push, SDK will handle it automatically PushwooshFcmHelper.onMessageReceived(this, remoteMessage); } else { //this is not a Pushwoosh push, you should handle it by yourself dispatchNonPushwooshMessage(remoteMessage); } }
private void dispatchNonPushwooshMessage(RemoteMessage remoteMessage) { // Implement your push handling logics here }}سجل الموجهات في AndroidManifest.xml الخاص بك:
<service android:name=".FirebaseMessagingRouterService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter></service>استخدام Pushwoosh مع مكتبات LeakCanary أو AppMetrica
Anchor link toعندما تقوم بدمج أدوات التحليل مثل LeakCanary أو AppMetrica أو غيرها، تبدأ هذه المكتبات عملية جديدة، مما يؤدي إلى إنشاء نسخة جديدة من التطبيق. نظرًا لأنه لا يمكنك الاستماع إلى الإشعارات الفورية في عملية أخرى، فإن هذا يؤدي إلى إلقاء java.lang.NullPointerException.
إذا قمت باستدعاء registerForPushNotifications داخل Application.onCreate()، فيجب عليك التحقق مما إذا كنت في العملية الرئيسية للتطبيق. استخدم الكود التالي لإجراء هذا التحقق:
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();if (runningAppProcesses != null && runningAppProcesses.size() != 0) { for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) { boolean isCurrentProcess = runningAppProcessInfo.pid == android.os.Process.myPid(); boolean isMainProcessName = getPackageName().equals(runningAppProcessInfo.processName); if (isCurrentProcess && isMainProcessName) {
Pushwoosh.getInstance().registerForPushNotifications(...); break; } }}حذف إشعارات معينة مستلمة من جهاز محليًا
Anchor link toإذا كنت ترغب في إزالة إشعار فوري غير ذي صلة عند تنفيذ إجراء معين داخل تطبيقك، يمكنك استخدام النهج التالي:
public class MainActivity extends AppCompatActivity {
List<NotificationCreatedEvent> savedPushes = new ArrayList<>();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Pushwoosh.getInstance().registerForPushNotifications();
PushwooshNotificationSettings.setMultiNotificationMode(true);
findViewById(R.id.clear_button).setOnClickListener( v -> { cancelPushes(); });
EventBus.subscribe(NotificationCreatedEvent.class, event -> { try { if (event.getMessage().getCustomData() == null) return;
//cancel pushes only with a specific flag if (new JSONObject(event.getMessage().getCustomData()).getBoolean("cancel")) { savedPushes.add(event); } } catch (JSONException e) { } }); } private void cancelPushes() { NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
if (manager == null) { return; }
for (NotificationCreatedEvent event : savedPushes) { manager.cancel(event.getMessageTag(), event.getMessageId()); } }}شاركنا ملاحظاتك
Anchor link toتساعدنا ملاحظاتك في إنشاء تجربة أفضل. إذا واجهت أي صعوبات أثناء عملية تكامل SDK، فشاركنا أفكارك عبر هذا النموذج.