# Pushwoosh Android SDK पर अक्सर पूछे जाने वाले प्रश्न

* [Android पुश टोकन और HWID कैसा दिखता है?](#what-does-android-push-token-and-hwid-look-like)
* [मैं अपना Android डिवाइस पुश टोकन कैसे प्राप्त कर सकता हूँ?](#how-can-i-obtain-my-android-device-push-token)
* [कौन सी अनुमतियाँ आवश्यक हैं और कौन सी वैकल्पिक हैं?](#what-permissions-are-necessary-and-what-are-optional)
* [मैं UserID कैसे सेट करूं?](#how-do-i-set-a-userid)
* [Android सब्सक्राइबर की कुल संख्या कितनी सटीक है?](#how-accurate-is-the-total-number-of-android-subscribers)
* [क्या मैं Android पर भेजे गए पुश में 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)
* [अन्य FCM सेवाओं के साथ Pushwoosh SDK का उपयोग करना](#using-pushwoosh-sdk-with-other-fcm-services)
* [LeakCanary या AppMetrica लाइब्रेरी के साथ Pushwoosh का उपयोग करना](#using-pushwoosh-with-leakcanary-or-appmetrica-libraries)
* [किसी डिवाइस से प्राप्त नोटिफिकेशन को हटाना](#deleting-particular-received-notifications-from-a-device)

### Android पुश टोकन और HWID कैसा दिखता है?

Android डिवाइस पुश टोकन की लंबाई अलग-अलग होती है (255 अक्षरों से कम) और यह **APA91b** से शुरू होता है, उदाहरण के लिए:

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

टोकन में अक्सर **APA91b** से पहले एक कोलन-पृथक उपसर्ग होता है, उदाहरण के लिए: `eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...`

Pushwoosh HWID के रूप में UUID का उपयोग करता है, यानी 32 अल्फान्यूमेरिकल अक्षरों की यादृच्छिक रूप से उत्पन्न स्ट्रिंग्स: `123e4567-e89b-12d3-a456-426655440000`

### मैं अपना Android डिवाइस पुश टोकन कैसे प्राप्त कर सकता हूँ?

आप कंसोल लॉग में अपना Android डिवाइस पुश टोकन प्राप्त कर सकते हैं। [Android Studio](https://developer.android.com/studio) में logcat टूल का उपयोग करें।

`%USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat` में **monitor.bat** खोलें, अपने डिवाइस को पीसी से कनेक्ट करें और Android सेटिंग्स में USB डिबगिंग की अनुमति दें। अपने डिवाइस पर अपना एप्लिकेशन चलाएं। `/registerDevice` का पता लगाएं, बाद में Test Devices में उपयोग करने के लिए अपने डिवाइस के लिए पुश टोकन ढूंढें।

<img src="/android-push-notifications-android-faq-1.webp" alt="Android Studio में पुश टोकन पंजीकरण जानकारी के साथ लॉगकैट आउटपुट दिखाने वाला स्क्रीनशॉट"/>

### कौन सी अनुमतियाँ आवश्यक हैं और कौन सी वैकल्पिक हैं?

Android डिवाइस पर इंस्टॉल होने पर, एप्लिकेशन Pushwoosh SDK के संबंध में निम्नलिखित अनुमतियों के लिए पूछेगा:

```java
<!-- FCM Firebase सेवाओं से जुड़ता है। -->
 <uses-permission android:name="android.permission.INTERNET"/>

<!-- जब कोई संदेश प्राप्त होता है तो प्रोसेसर को सोने से रोकता है। -->
 <uses-permission android:name="android.permission.WAKE_LOCK"/>

 <!-- इस अनुमति का उपयोग यह निर्धारित करने के लिए किया जाता है कि डिवाइस नेटवर्क तक पहुंच सकता है या नहीं। -->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- इस ऐप को डेटा संदेश पंजीकृत करने और प्राप्त करने की अनुमति है। -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
```

हमारा SDK छवियों, डिवाइस संपर्कों आदि तक पहुंचने की अनुमति नहीं मांगता है।

### मैं UserID कैसे सेट करूं?

आप एक [उपयोगकर्ता पहचानकर्ता (UserID)](/hi/developer/first-steps/collecting-user-ids/) सेट कर सकते हैं, जो एक Facebook ID, उपयोगकर्ता नाम, ईमेल, या कोई अन्य अद्वितीय उपयोगकर्ता ID हो सकता है। यह आपको एक ही उपयोगकर्ता से जुड़े कई उपकरणों में डेटा और घटनाओं का मिलान करने की अनुमति देता है। UserID सेट करने के लिए, **setUserId** विधि को कॉल करें।

**उदाहरण**

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

### Android सब्सक्राइबर की कुल संख्या कितनी सटीक है?

Pushwoosh FCM से "NotRegistered" प्रतिक्रिया प्राप्त होने पर डेटाबेस से अनसब्सक्राइब किए गए Android उपकरणों को साफ़ कर देता है, जो किसी विशिष्ट डिवाइस तक पहुंचने के दूसरे प्रयास के बाद वापस किया जा सकता है। इसका मतलब है कि आपको डेटाबेस से हटाने के लिए एक अनसब्सक्राइब किए गए डिवाइस पर 2 पुश भेजने होंगे।

निम्नलिखित सबसे आम परिदृश्य है जिसका वर्णन [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 में भेजे गए संदेश को प्रतिक्रिया के रूप में एक वैध संदेश आईडी मिले, भले ही संदेश क्लाइंट ऐप को वितरित नहीं किया जाएगा।

### क्या मैं Android पर भेजे गए पुश में HTML टैग का उपयोग कर सकता हूँ?

हाँ, Android में आप पुश की उपस्थिति को संशोधित करने के लिए निम्नलिखित HTML टैग का उपयोग कर सकते हैं:

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

इन HTML टैग को **Message** इनपुट फ़ील्ड में रखें, और उन्हें API अनुरोध में भी उपयोग करें। कुछ Android डिवाइस इन HTML टैग को ठीक से संसाधित करने में विफल हो सकते हैं, लेकिन अधिकांश डिवाइस स्वरूपण को सही ढंग से प्रदर्शित करते हैं।

### Android Lollipop (और बाद के संस्करणों) में नोटिफिकेशन आइकन कैसे सेट करें?

Android Lollipop में आइकन केवल सफेद होने के लिए बदल दिए गए थे। इसलिए, यदि आप अपनी **AndroidManifest.xml** फ़ाइल में **targetSdkVersion >= 21** चुनते हैं, तो Android केवल आइकन के अल्फा-चैनल का उपयोग करेगा।\
[Android दस्तावेज़ीकरण](https://developer.android.com/docs) में व्यवहार पर अधिक देखें।

सिस्टम एक्शन आइकन और मुख्य नोटिफिकेशन आइकन में सभी गैर-अल्फा चैनलों को अनदेखा करता है। मान लें कि ये आइकन केवल-अल्फा होंगे। सिस्टम नोटिफिकेशन आइकन को सफेद और एक्शन आइकन को गहरे भूरे रंग में खींचता है। _यह Pushwoosh SDK नियंत्रण से परे है_।

**1.** [Android दिशानिर्देशों](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"` पैरामीटर मान को आइकन छवि (बिना फ़ाइल एक्सटेंशन के) पर सेट कर सकते हैं।

### अन्य FCM सेवाओं के साथ Pushwoosh SDK का उपयोग करना

आप Pushwoosh का उपयोग अन्य SDK के साथ कर सकते हैं जो पुश मैसेजिंग के लिए FCM का उपयोग करते हैं। ऐसा करने के लिए, सेवाओं के बीच घटनाओं को वितरित करने के लिए एक राउटर सेवा बनाएं। सबसे पहले, मुख्य Pushwoosh मॉड्यूल के साथ **pushwoosh-firebase** निर्भरता जोड़ें:

```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>
```

### LeakCanary या AppMetrica लाइब्रेरी के साथ Pushwoosh का उपयोग करना

जब आप LeakCanary, AppMetrica या अन्य जैसे एनालिटिक्स टूल को एकीकृत करते हैं, तो ये लाइब्रेरी एक नई प्रक्रिया शुरू करती हैं, जिससे ऐप का नया इंस्टेंस बनता है। चूंकि आप किसी अन्य प्रक्रिया में पुश नोटिफिकेशन नहीं सुन सकते हैं, इसके परिणामस्वरूप `java.lang.NullPointerException` फेंका जाता है।

यदि आप `Application.onCreate()` के अंदर `registerForPushNotifications` को कॉल करते हैं, तो आपको जांचना चाहिए कि क्या आप एप्लिकेशन की मुख्य प्रक्रिया में हैं। इस जांच को करने के लिए निम्नलिखित कोड का उपयोग करें:

```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) साझा करें।