# الأسئلة الشائعة حول Pushwoosh Android SDK

* [كيف يبدو رمز الدفع و HWID في أندرويد؟](#what-does-android-push-token-and-hwid-look-like)
* [كيف يمكنني الحصول على رمز الدفع لجهاز الأندرويد الخاص بي؟](#how-can-i-obtain-my-android-device-push-token)
* [ما هي الأذونات الضرورية وما هي الاختيارية؟](#what-permissions-are-necessary-and-what-are-optional)
* [كيف يمكنني تعيين UserID؟](#how-do-i-set-a-userid)
* [ما مدى دقة العدد الإجمالي لمشتركي أندرويد؟](#how-accurate-is-the-total-number-of-android-subscribers)
* [هل يمكنني استخدام وسوم HTML في الإشعارات المرسلة إلى أندرويد؟](#can-i-use-html-tags-in-pushes-sent-to-android)
* [كيفية تعيين أيقونة إشعار في Android Lollipop (والإصدارات الأحدث)؟](#how-to-set-a-notification-icon-in-android-lollipop-and-later-versions)
* [استخدام Pushwoosh SDK مع خدمات FCM أخرى](#using-pushwoosh-sdk-with-other-fcm-services)
* [استخدام Pushwoosh مع مكتبات LeakCanary أو AppMetrica](#using-pushwoosh-with-leakcanary-or-appmetrica-libraries)
* [حذف إشعار مستلم من جهاز](#deleting-particular-received-notifications-from-a-device)

### كيف يبدو رمز الدفع و HWID في أندرويد؟

تختلف رموز الدفع لأجهزة أندرويد في الطول (أقل من 255 حرفًا) وتبدأ بـ **APA91b**، على سبيل المثال:

`APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq`

غالبًا ما تحتوي الرموز على بادئة مفصولة بنقطتين رأسيتين قبل **APA91b**، على سبيل المثال: `eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...`

يستخدم Pushwoosh معرفات UUID كـ HWIDs، أي سلاسل نصية مكونة من 32 حرفًا أبجديًا ورقميًا يتم إنشاؤها عشوائيًا: `123e4567-e89b-12d3-a456-426655440000`

### كيف يمكنني الحصول على رمز الدفع لجهاز الأندرويد الخاص بي؟

يمكنك الحصول على رمز الدفع لجهاز الأندرويد الخاص بك في سجل وحدة التحكم. استخدم أداة logcat في [Android Studio](https://developer.android.com/studio).

افتح **monitor.bat** في `%USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat`، وقم بتوصيل جهازك بالكمبيوتر واسمح بتصحيح أخطاء USB في إعدادات أندرويد. قم بتشغيل تطبيقك على الجهاز. حدد موقع `/registerDevice`، وابحث عن رمز الدفع لجهازك لاستخدامه في أجهزة الاختبار لاحقًا.

<img src="/android-push-notifications-android-faq-1.webp" alt="لقطة شاشة تظهر مخرجات logcat مع معلومات تسجيل رمز الدفع المعروضة في Android Studio"/>

### ما هي الأذونات الضرورية وما هي الاختيارية؟

عند تثبيته على جهاز أندرويد، سيطلب التطبيق الأذونات التالية فيما يتعلق بـ Pushwoosh SDK:

```java
<!-- 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؟

يمكنك تعيين [معرف المستخدم (UserID)](/ar/developer/first-steps/collecting-user-ids/)، والذي يمكن أن يكون معرف فيسبوك أو اسم مستخدم أو بريدًا إلكترونيًا أو أي معرف مستخدم فريد آخر. يتيح لك هذا مطابقة البيانات والأحداث عبر أجهزة متعددة مرتبطة بنفس المستخدم. لتعيين UserID، استدعِ طريقة **setUserId**.

**مثال**

```
Pushwoosh.getInstance().setUserId("testUser");
```

### ما مدى دقة العدد الإجمالي لمشتركي أندرويد؟

يقوم Pushwoosh بمسح أجهزة أندرويد التي ألغت اشتراكها من قاعدة البيانات عند تلقي استجابة "NotRegistered" من FCM، والتي يمكن إرجاعها بعد المحاولة الثانية للوصول إلى جهاز معين. هذا يعني أنه يجب عليك إرسال إشعارين إلى جهاز غير مشترك لإزالته من قاعدة البيانات.

فيما يلي السيناريو الأكثر شيوعًا الموضح في [وثائق FCM](https://firebase.google.com/docs/cloud-messaging/):

1. يقوم المشترك بإلغاء تثبيت التطبيق.
2. يرسل Pushwoosh رسالة إلى خادم FCM.
3. يرسل خادم FCM الرسالة إلى جهاز المستخدم.
4. يتلقى عميل FCM على الجهاز الرسالة ويكتشف أن تطبيقك قد تم إلغاء تثبيته؛ تعتمد تفاصيل الكشف على النظام الأساسي الذي يعمل عليه التطبيق.
5. يبلغ عميل FCM على الجهاز خادم FCM بأنه تم إلغاء تثبيت التطبيق.
6. يضع خادم FCM علامة على معرف التسجيل للحذف.
7. يرسل Pushwoosh رسالة أخرى إلى FCM.
8. يعيد FCM رسالة NotRegistered.
9. يزيل Pushwoosh رمز الدفع من قاعدة المستخدمين الخاصة بك.

قد يستغرق الأمر بعض الوقت حتى تتم إزالة معرف التسجيل بالكامل من FCM. وبالتالي، من الممكن أن تحصل رسالة مرسلة في الخطوة 7 أعلاه على معرف رسالة صالح كاستجابة، على الرغم من أن الرسالة لن يتم تسليمها إلى تطبيق العميل.

### هل يمكنني استخدام وسوم HTML في الإشعارات المرسلة إلى أندرويد؟

نعم، في أندرويد يمكنك استخدام وسوم HTML التالية لتعديل مظهر الإشعار:

```txt
<span style="color: green;"><b><i><span style="text-decoration: underline;">Hello world!
Hello hi hey</span></i></b></span>
```

ضع وسوم HTML هذه في حقل إدخال **الرسالة**، واستخدمها في طلب API أيضًا. قد تفشل بعض أجهزة أندرويد في معالجة وسوم HTML هذه بشكل صحيح، ولكن معظم الأجهزة تعرض التنسيق بشكل صحيح.

### كيفية تعيين أيقونة إشعار في Android Lollipop (والإصدارات الأحدث)؟

في Android Lollipop، تم تغيير الأيقونات لتكون بيضاء فقط. لذلك، إذا قمت بتحديد **targetSdkVersion >= 21** في ملف **AndroidManifest.xml** الخاص بك، فسيستخدم أندرويد قناة ألفا فقط للأيقونة.\
شاهد المزيد عن السلوك في [وثائق أندرويد](https://developer.android.com/docs).

يتجاهل النظام جميع القنوات غير ألفا في أيقونات الإجراءات وفي أيقونة الإشعار الرئيسية. افترض أن هذه الأيقونات ستكون ألفا فقط. يرسم النظام أيقونات الإشعارات باللون الأبيض وأيقونات الإجراءات باللون الرمادي الداكن. _هذا خارج عن سيطرة Pushwoosh SDK_.

**1.** قم بإنشاء أيقونة الإشعار وفقًا لـ [إرشادات أندرويد](https://material.io/design/platform-guidance/android-notifications.html#style). وفقًا لـ [الوثائق](https://developer.android.com/about/versions/lollipop/android-5.0-changes)، سيتجاهل النظام جميع الألوان.

**2.** قم بتسمية الأيقونة `pw_notification.png` وضعها في مجلد **res/drawable**. سيستخدم Pushwoosh SDK هذه الأيقونة كافتراضي للإشعارات.

**3.** بدلاً من ذلك، يمكنك استخدام Remote API وتعيين قيمة المعلمة `"android_icon"` إلى صورة الأيقونة (بدون امتداد الملف).

### استخدام Pushwoosh SDK مع خدمات FCM أخرى

يمكنك استخدام Pushwoosh جنبًا إلى جنب مع SDKs أخرى تستخدم FCM لرسائل الدفع. للقيام بذلك، قم بإنشاء خدمة توجيه لتوزيع الأحداث بين الخدمات. أولاً، أضف الاعتمادية **pushwoosh-firebase** بجانب وحدة Pushwoosh الرئيسية:

```groovy title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-firebase:6.0.3'
```

قم بإنشاء فئة التوجيه:

<Tabs>
<TabItem label="FirebaseMessagingRouterService.kt">
```kotlin
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
   }
}
```
</TabItem>

<TabItem label="FirebaseMessagingRouterService.java">
```java
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
    }
}
```
</TabItem>
</Tabs>

سجل الموجهات في AndroidManifest.xml الخاص بك:

```txt title="AndroidManifest.xml"
<service
    android:name=".FirebaseMessagingRouterService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
```

### استخدام Pushwoosh مع مكتبات LeakCanary أو AppMetrica

عندما تقوم بدمج أدوات التحليل مثل LeakCanary أو AppMetrica أو غيرها، تبدأ هذه المكتبات عملية جديدة، مما يؤدي إلى إنشاء مثيل جديد للتطبيق. نظرًا لأنه لا يمكنك الاستماع إلى إشعارات الدفع في عملية أخرى، فإن هذا يؤدي إلى طرح `java.lang.NullPointerException`.

إذا قمت باستدعاء `registerForPushNotifications` داخل `Application.onCreate()`، فيجب عليك التحقق مما إذا كنت في العملية الرئيسية للتطبيق. استخدم الكود التالي لإجراء هذا التحقق:

```java
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;
        }
    }
}
```

### حذف إشعارات معينة مستلمة من جهاز محليًا

إذا كنت ترغب في إزالة إشعار غير ذي صلة عند تنفيذ إجراء معين داخل تطبيقك، يمكنك استخدام النهج التالي:

```java title="MainActivity.java"
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());
		}
	}
}
```

## شاركنا ملاحظاتك

تساعدنا ملاحظاتك على إنشاء تجربة أفضل. إذا واجهت أي صعوبات أثناء عملية تكامل SDK، فشاركنا أفكارك [عبر هذا النموذج](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).