बैकग्राउंड में ऐप के दौरान पुश नोटिफिकेशन के साथ बैज अपडेट करें


82

जब ऐप को अग्रभूमि में लाया जाता है, तो मुझे पुश नोटिफिकेशन काम कर रहा होता है और आइकन बैज काउंट को अपडेट करने में कामयाब होता है।

हालांकि मैं इस बारे में थोड़ा उलझन में हूं ... iPhone को सूचना मिलती है और मेरे ऐप को सक्रिय करने के लिए पॉप अप संदेश दिखाई देता है, और मेरे द्वारा ऐप शुरू करने के बाद केवल बैज अपडेट होता है।

यह उपयोगकर्ता के अनुभव के संदर्भ में सही नहीं है। मेरी समझ यह है कि बैज काउंट को बढ़े हुए काउंट के माध्यम से उपयोगकर्ता को सूचित करना चाहिए कि कार्रवाई की क्या आवश्यकता है, लेकिन ऐप के लाइव होने पर बाद के चरण तक ऐसा नहीं होता है।

तो क्या एप्लिकेशन को अपना बैज काउंट अपडेट करने के लिए यह बताने का एक तरीका है कि वह पुश नोटिफिकेशन और पृष्ठभूमि में होने के दौरान प्राप्त करता है?

ध्यान दें कि मेरा एप्लिकेशन स्थान का उपयोग नहीं करता है और मुझे UIRemoteNotificationTypeBadgeअधिसूचना पंजीकरण अनुरोध में है।

चीयर्स एएफ


क्या आप ऐप आइकन पर बैज दिखाना चाहते हैं?
अमन अग्रवाल

मैं टैब पर गिनती प्रदर्शित कर रहा हूं। और उसी मुद्दे का सामना कर रहे हैं। जब ऐप बैकग्राउंड काउंट में होता है तो बढ़ नहीं रहा। मैं कैसे सेट कर सकता हूं?
श्रीस्टी ठक्कर

जवाबों:


79

चूंकि पुश अधिसूचना को iOS द्वारा नियंत्रित किया जाता है और आपके ऐप को नहीं आप पुश नोटिफिकेशन प्राप्त करने पर एप्लिकेशन बैज को नहीं बदल सकते।

लेकिन आप पुश सूचना के पेलोड में बैज नंबर भेज सकते हैं, लेकिन आपको गणना सर्वर की तरफ करनी होगी।

आपको स्थानीय और पुश अधिसूचना प्रोग्रामिंग गाइड और विशेष रूप से अधिसूचना पेलोड को पढ़ना चाहिए ।

पेलोड इस तरह दिख सकता है:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}

अब ऐप एप्लिकेशन बैज आइकन 9 दिखाएगा।


4
मैं पहले से ही ऐसा कर रहा हूं ... लेकिन इस मूल्य को केवल तभी प्राप्त किया जाता है जब मेरे ऐप को अग्रभूमि में लाया जाता है, जिसे बाद में मैं [UIApplication साझाApplication] का उपयोग करके बैज मूल्य को अपडेट करने के लिए उपयोग करता हूं;
अबॉल्फुदौड

7
नहीं, आपको पुश सूचना पेलोड में बैज नंबर सेट करने की आवश्यकता है।
rckoenes

11
मुझे अपनी पेलोड संरचना पर एक और नज़र थी और ऐसा लगता है कि मैं एक अंतर 4 के बजाय एक स्ट्रिंग '4' के रूप में बैज पैरामीटर का मान पारित कर रहा था! अब मैं इसे काम कर रहा हूँ ... मदद के लिए धन्यवाद
Abolfoooud

मैं यह काम नहीं करता परीक्षण किया जब पेलोड संरचना बैज पर परिवर्तन
WOD

1
@ क्या आप के साथ क्या मतलब है: पेलोड संरचना बिल्ला पर परिवर्तन।
15-28

11

जब हम पुश नोटिफिकेशन पैकेज में "बैज" पैरामीटर भेजकर हम बैज नंबर बदल सकते हैं । के रूप में @rckoenes ने बताया JSONबिल्ला के लिए पैरामीटर एक होना चाहिए पूर्णांक

समान करने के लिए नमूना PHP कोड

// Create the payload body
$body['aps'] = array(
        'alert' => $message,
        'badge' => 1,
        'sound' => 'default'
        );

badge => 1 जहां 1 पूर्णांक है, न कि एक स्ट्रिंग (यानी बिना एपोस्ट्रोफ के)


11

वास्तव में iOS 10 में एक रिमोट नोटिफ़िकेशन स्वचालित रूप didReceiveRemoteNotificationसे आपके AppDelegate में मेथड कहलाएगा।

आपके पास बैकग्राउंड में बैज काउंट अपडेट करने के 2 तरीके हैं।
मैंने अपने वर्तमान ऐप के लिए भी ऐसा किया है। आपको अधिसूचना सेवा विस्तार की भी आवश्यकता नहीं है।

पहला तरीका:

APN के लिए अपने पेलोड के साथ APS बैज कुंजी भेजें।
यह आपके पेलोड के बैज में आपके इंटेगर मूल्य के अनुसार बैज काउंट को अपडेट करेगा। पूर्व:

// Payload for remote Notification to APN
{
    "aps": {
        "content-available": 1,
        "alert": "Hallo, this is a Test.",
        "badge": 2, // This is your Int which will appear as badge number,
        "sound": default
    }
}

दूसरा तरीका:

आप अपने Application.applicationState को स्विच कर सकते हैं और अपने बैज को अपडेट कर सकते हैं जब ApplicationState अंदर हो .background। लेकिन आपको ध्यान रखना होगा कि APN पूर्व में भेजते समय अपने अधिसूचना पेलोड में बैज कुंजी पैरामीटर सेट न करें

// Payload to APN as silent push notification
{
    "aps": {
        "content-available": 1
    }
}

एप्लिकेशन स्थिति के अनुसार बैज अपडेट को हैंडल करें:

यहां APN के लिए पेलोड में बैज कुंजी के बिना बैज काउंट अपडेट के लिए मेरा कार्य कोड है।

func application(_ application: UIApplication, didReceiveRemoteNotification 
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("APN recieved")
    // print(userInfo)
    
    let state = application.applicationState
    switch state {
        
    case .inactive:
        print("Inactive")
        
    case .background:
        print("Background")
        // update badge count here
        application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
        
    case .active:
        print("Active")

    }
}

बैज गिनती गिनें:

जब आपका ऐप वापस सक्रिय अवस्था में आ जाए तो अपना बैज काउंट रीसेट करना न भूलें।

func applicationDidBecomeActive(_ application: UIApplication) {
    // reset badge count
    application.applicationIconBadgeNumber = 0
}

यदि ऐप बैकग्राउंड में नहीं चल रहा है तो आप बैज को कैसे अपडेट करेंगे?
नागेंद्र राव Rao ’

1
यदि आप APS को सामग्री-उपलब्ध कुंजी के साथ भेजते हैं तो यह एप्लिकेशन की स्थिति की परवाह किए बिना didReceiveRemoteNotification विधि को चलाएगा। बस इसे एक देशी डिवाइस के साथ आज़माएं। यदि आप iOS पर हैं तो आप अपने JSON ऑब्जेक्ट को APN पर भेजने के लिए इस टूल का उपयोग कर सकते हैं: github.com/noodlewerk/NWPusher
Gkiokan

वाह, बहुत अच्छा, और क्या होगा अगर मैं सामग्री-उपलब्ध बिना एक अधिसूचना भेज रहा हूं? (जो किसी भी गैर-पृष्ठभूमि अधिसूचना के बारे में है)। didReceiveRemoteNotificationनहीं कहा जाता है
StackExploded

6
    **This is the APNS payload get back from server.**

    {
        "aps" : {
            "alert" : "You got your emails.",
            "badge" : 9,
            "sound" : "bingbong.aiff"
        },
        "acme1" : "bar",
        "acme2" : 42
    }

कुंजी बैज के लिए मान को स्वचालित रूप से बैज काउंट माना जाता है। आईओएस ऐप की ओर से काउंट की गणना करने या उसे संभालने की कोई आवश्यकता नहीं है। ऊपर के उदाहरण में 9 बैज काउंट है। यदि आपका ऐप आइकन 9 दिखाएगा।

नोट जब आपका ऐप बंद हो जाता है तो आप अपने दम पर बैज नहीं संभाल सकते हैं। इसलिए हम APNS पेलोड से बैज कुंजी का उपयोग कर रहे हैं। अधिसूचना देखने के बारे में बेहतर स्पष्टीकरण के लिए

यदि आप अपने खुद के बैज की संख्या को कम करना चाहते हैं। गिनती को बढ़ाएं और इसे स्वयं अपडेट करें


4

यदि आप NotificationServiceExtension का उपयोग कर रहे हैं तो आप उसमें बैज अपडेट कर सकते हैं।

var bestAttemptContent : UNMutableNotificationContent? // 
bestAttemptContent.badge = 0//any no you wanna display

हर बार जब आपका आवेदन अधिसूचना प्राप्त करता है, तो आपका सेवा विस्तार कहा जाएगा। उपयोगकर्ता डिफ़ॉल्ट में वह मान दें और उसे प्रदर्शित करें। एप्लिकेशन और एक्सटेंशन के बीच उपयोगकर्ता डिफॉल्ट को साझा करने के लिए आपको एप्लिकेशन में एप्लिकेशन समूह को सक्षम करना होगा। यहाँ और पढ़ें


आप सर्वर पर उस सूचना गणना को सहेज सकते हैं और अधिसूचना के साथ भेज सकते हैं।
सुरजीत राजपूत

मैं फायरबेस क्लाउड मैसेजिंग का उपयोग करता हूं, क्या आप जानते हैं कि यह कैसे कर सकता है?
घिग्ग पिक्कोरो

3

IOS 10 के बाद से आप अपने ऐप के लिए एक अधिसूचना सेवा विस्तार विकसित कर सकते हैं। यह सिस्टम द्वारा शुरू किया जाएगा जब आप एक अधिसूचना प्राप्त करेंगे और आप बिल्ला के लिए एक वैध संख्या की गणना कर सकते हैं और इसे सेट कर सकते हैं।

प्रलेखन पर एक नजर डालें: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension


1

फायरबेस क्लाउड मैसेजिंग (FCM) के लिए यह इस तरह होना चाहिए:

{
  "to": "some_token",

  "notification": {
    "body": "this is a body",
    "title": "this is a title",
    "badge" : 1
  }, 

  "priority": "high", 
}

0
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    application.applicationIconBadgeNumber = 0;
    NSLog(@"userInfo %@",userInfo);

    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }

    [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];
    NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);
}

आप पूर्णांक के बजाय intValue का उपयोग क्यों कर रहे हैं जो NSInteger है? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
एलेक्स ज़ावाटोन

0

जैसा कि @rckoenes ने कहा है कि आपको गणना सर्वर की ओर करनी होगी, लेकिन आप यह कैसे जान सकते हैं कि बैज नंबर मान को बढ़ाने के लिए आपको पेलोड में भेजना चाहिए।

जब आप एप्लिकेशन लॉन्च करेंगे तो अपने सर्वर को एक संदेश भेजेंगे जो यह संकेत देगा कि एप्लिकेशन लॉन्च हो गया है। तो, सर्वर की ओर से आप बैज = 0 से फिर से शुरू करते हैं, और जबकि सर्वर द्वारा प्राप्त कोई संदेश नहीं है, हर पुश अधिसूचना पेलोड के साथ बैज संख्या बढ़ाता है।


0

एप्स पेलोड में बैकग्राउंड मोड में अपडेट बैज काउंट के लिए "कंटेंट उपलब्ध": 1 को परिभाषित करना होगा

func application(_ application: UIApplication, didReceiveRemoteNotification 
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {


// increase badge count, but no need if you include content-available

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1

}

func applicationDidBecomeActive(_ application: UIApplication) {

// reset badge count

application.applicationIconBadgeNumber = 0

}

उदाहरण के लिए।

"aps":{
    "alert":"Test",
    "sound":"default",
    "content-available":1

}

सामग्री-उपलब्ध = 1 का उद्देश्य खामोश अधिसूचना है जो बिल्ले के लिए नहीं है।
मनीष


-1

जब आप ऐप खोलते हैं, तो दूरस्थ सूचना प्राप्त करने के बाद,

didBecomeActiveअपना " " विधि में वर्तमान बैज नंबर प्राप्त करें AppDelegate

नीचे दिए गए कोड का उपयोग करके फ़ाइल:

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;

3
यह तब तक काम नहीं करेगा जब तक उपयोगकर्ता ऐप पर टैप नहीं करता है या ऐप लॉन्च करने की अधिसूचना नहीं है। यह वह नहीं करेगा जो ओपी चाहता है, ऐप में बैकग्राउंड होने पर बैज को अपडेट करना और इससे पहले यूज़र ने ऐप या नोटिफिकेशन के साथ इंटरैक्ट किया हो।
एलेक्स ज़ाटावोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.