IOS 7 में साइलेंट पुश नोटिफिकेशन काम नहीं करता है


87

WWDC 2013 की "व्हाट्स न्यू विद मल्टीटास्किंग" प्रस्तुति में, साइलेंट पुश नोटिफिकेशन के बारे में एक अनुभाग है। यह सीधे आगे लगता है। प्रस्तुति के अनुसार, यदि आप केवल सामग्री-उपलब्ध सेट के साथ APS पेलोड को 1 पर भेजते हैं, तो उपयोगकर्ताओं को अधिसूचना के बारे में सूचित नहीं किया जाएगा।

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}

मेरे परीक्षण से पता चलता है कि यह काम नहीं करता है क्योंकि कोई धक्का नहीं मिला है। लेकिन अगर मैं ध्वनि विशेषता को शामिल करता हूं, लेकिन चेतावनी विशेषता को बाहर करता हूं, तो यह काम करता है (हालांकि अब चुप नहीं है)।

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

हालाँकि, यदि मैं एक मूक ऑडियो चलाने के लिए ध्वनि विशेषता को बदलता हूं, तो मैं एक मूक पुश की नकल कर सकता हूं।

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

क्या कोई जानता है:

  1. अगर यह एक बग?
  2. और अगर यह मान लेना सही है कि B या C को रिमोट नोटिफिकेशन माना जा रहा है (और साइलेंट पुश वाला बग नहीं है जहां आपको साउंड एट्रीब्यूट चाहिए)? यदि हां, तो इसका मतलब यह है कि यह सीमित नहीं है, जैसे साइलेंट पुश हैं ... जो कि Apple को निश्चित रूप से ठीक करेगा। इसलिए मुझे शायद इस पर भरोसा नहीं करना चाहिए।
  3. दर की सीमा क्या है (एन हर एक्स सेकंड को धकेलता है, आदि)?

अग्रिम में धन्यवाद।

अधिक जानकारी के साथ संपादित करें

ए के लिए, आवेदन की स्थिति कोई फर्क नहीं पड़ता। अधिसूचना कभी प्राप्त नहीं होती है।

ऐसा लगता है कि बी और सी केवल काम करते हैं यदि आप नीचे दिए गए उद्धरणों में विशेषताओं और मूल्यों को शामिल करते हैं।

{"aps":{"content-available": 1, "sound":"silent.wav"}}

और अधिसूचना आवेदन में आती है : didReceiveRemoteNotification: fetchCompletionHandler: राज्य की परवाह किए बिना।


क्या यह किसी भी ऐप राज्य में काम नहीं करता है? मेरे लिए, " A " तब तक काम करता है जब तक ऐप अग्रभूमि में चल रहा हो (didReceiveRemoteNotification को कॉल किया जाता है)। लेकिन जब ऐप नहीं चल रहा होता है, तो ऐप अधिसूचित नहीं हो रहा होता है (जब मैं " बी " की कोशिश करता हूं, तो मैं केवल ध्वनि सुनता हूं )। जब आप " B " या " C " का उपयोग करते हैं तो क्या आपका ऐप बैकग्राउंड में जाग गया (didReceiveRemoteNotification) ?
डर्बर्नी

मैं इसी तरह का व्यवहार देख रहा हूं, सोच रहा हूं कि ऐसा हो सकता है क्योंकि मैं कुछ समय से यही कोशिश कर रहा था और मेरे पास ऐप पहले से सही तरीके से सेट नहीं था इसलिए सेटअप सही होने से पहले ही Apple ने मुझे थ्रॉटल कर दिया होगा।
निकथ्यूड

4
यार ... काश मैं तुम्हें 10 वोट दे पाता
माइकल विल्स

देखें कि क्या आप Background fetchचेकबॉक्स को Project Capabilities> चेक करते हैं Background Modesक्योंकि पहला विकल्प काम करना चाहिए। साइलेंट पुश नॉट को एक साउंड एट्रीब्यूट की आवश्यकता होती है और हमेशा यह application:didReceiveRemoteNotification:fetchCompletionHandler:भी आता है कि एप्लिकेशन बैकग्राउंड / अग्रभूमि में चल रहा है या नहीं चल रहा है।
इग्नाइटकॉडर्स

जवाबों:


73

यह भी काम करता है और यह आने पर ध्वनि नहीं बजाता है:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

संपादित करें

इस समस्या से जूझ रहे लोग इस लिंक को देख सकते हैं । मैं Apple के डेवलपर फोरम पर एक थ्रेड में भाग ले रहा हूं जो सभी ऐप स्टेट्स पर जाता है और जब साइलेंट पुश प्राप्त होते हैं और प्राप्त नहीं होते हैं।


लिंक के लिए धन्यवाद। एडीसी के मंचों पर इस पर चर्चा करने वाले कई सूत्र हैं। नीचे पंक्ति: डिवाइस पुनरारंभ होने के बाद एक बग है - जिसे एक Apple प्रतिनिधि ने स्वीकार किया है उसे एक अद्यतन (अंततः) में तय किया जाना चाहिए।
एसजी 1

3
IOS7 में यह साउंड / अलर्ट कीज के बिना भी बढ़िया काम करता है। सामग्री-उपलब्ध पर्याप्त कुंजी है! लेकिन iOS8 में हमारे पास वास्तव में अजीब व्यवहार होता है जब हम "सामग्री-उपलब्ध" के अलावा गैर-रिक्त स्ट्रिंग के साथ चेतावनी कुंजी भी सेट करते हैं: 1 हमें "अलर्ट" स्ट्रिंग के साथ केवल बैनर मिलता है, लेकिन "सामग्री-उपलब्ध" कुछ कारणों से अनदेखी कर रहा है
पुरुष मार्क्स

मुझे ऐप को लॉन्च किए गए साउंड के साथ या बिना नोटिफिकेशन के लॉन्च करने में सफलता मिली है। हो सकता है, ध्वनि, चेतावनी या बैज (खाली या नहीं) सेट करना डिफ़ॉल्ट अधिसूचना प्राथमिकता को 10 तक बढ़ा देता है, इस प्रकार इसकी विश्वसनीयता बढ़ जाती है। देखें कि Apple pans-प्राथमिकता के बारे में क्या कहता है: developer.apple.com/library/ios/documentation/… डिफ़ॉल्ट प्राथमिकता 10 (उच्च) है, लेकिन केवल सामग्री-उपलब्ध कुंजी के साथ पुश सूचना के लिए इसका उपयोग करना एक त्रुटि है। तो शायद डिफ़ॉल्ट 5 पर सेट है यदि केवल सामग्री-उपलब्ध कुंजी सेट है।
एम्म

1
iOS10 पर काम नहीं करता है। मुझे "ध्वनि" के लिए कुछ धक्का देना चाहिए।
स्टोनी

मेरे लिए iOS10 पर काम किया। लेकिन iOS11 पर अब काम नहीं करता है
स्लाव

30

इसलिए मैं कल ही इस मुद्दे पर आया था, और एक खाली स्ट्रिंग पर ध्वनि सेट के साथ पेलोड भेजने की कोशिश करने के बाद भी यह डिवाइस पर कंपन / ध्वनि पैदा कर रहा था। आखिरकार, मैंने अर्बन एयरशिप के एक ब्लॉग पोस्ट पर ठोकर खाई, जिसमें सुझाव दिया गया था:

{ priority: 5 }

धक्का अधिसूचना में, जो मैंने कभी नहीं देखा था। पुश सूचनाओं के लिए Apple के डॉक्स से इनकार करने के बाद, मैं इस पृष्ठ पर ठोकर खाई:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

जो इंगित करता है कि प्राथमिकता को "5" या "10" के रूप में सेट किया जाना चाहिए, और बताते हैं:

अधिसूचना की प्राथमिकता। निम्न में से एक मान प्रदान करें:

10 धक्का संदेश तुरंत भेजा जाता है।

पुश सूचना को डिवाइस पर अलर्ट, ध्वनि या बैज ट्रिगर करना चाहिए। यह एक धक्का के लिए इस प्राथमिकता का उपयोग करने के लिए एक त्रुटि है जिसमें केवल सामग्री-उपलब्ध कुंजी है।

5 पुश संदेश एक समय में भेजा जाता है जो इसे प्राप्त करने वाले उपकरण पर शक्ति का संरक्षण करता है।

अंत में, हम बिल्ला काउंट के साथ काम करने वाले साइलेंट पुश नोटिफिकेशन प्राप्त करने में सक्षम थे (और मुझे संदेह है कि आप निम्न अलर्ट के साथ भी ऐसा कर सकते हैं):

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };

महान जवाब डेव! 5 की प्राथमिकता दी जाती है, जबकि "इस प्राथमिकता का उपयोग करने में एक त्रुटि है [10] एक धक्का के लिए जिसमें केवल सामग्री-उपलब्ध कुंजी है।" developer.apple.com/library/ios/documentation/…
rjobidon

4
क्या पेलोड में प्राथमिकता शामिल होनी चाहिए? IMO यह आपके द्वारा भेजे जाने वाले पुश में एक बाइट है।
फॉरेस्ट डिक्

6
पेलोड में प्राथमिकता निर्धारित नहीं की जाती है। यह बाइनरी नोटिफिकेशन में सेट हो जाता है।
सैंडी डी।

10

मैंने चेतावनी विशेषता के रूप में एक खाली स्ट्रिंग सेट करने की कोशिश की है और यह भी काम किया है:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

ऐसा लगता है कि APNS पुश पेलोड को मान्य करने के उद्देश्य से इस विशेषताओं के अस्तित्व के लिए जाँच कर रहा है। दिलचस्प है, वे वास्तविक सामग्री की जांच नहीं कर रहे हैं। यह एक छोटे से hacky लगता है, हालांकि ...


alert=""पेलोड में इस समाधान ने मेरे लिए भी काम किया iOS 9.0। इसके sound=""बजाय काम नहीं किया।
लोरेटोपरिसी 14

5

मैं टूल का उपयोग करता हूं- नफ़ अपने डिवाइस को मेरा पुश नोटिफिकेशन भेजें।

ऐसा लग रहा है: यहाँ छवि विवरण दर्ज करें

फिर, मैंने इन उदाहरणों की कोशिश की।

वे सभी काम कर रहे हैं! लेकिन आपको प्राथमिकता 10 निर्धारित करनी चाहिए!

इसलिए यदि आप टूल का उपयोग नहीं कर रहे हैं, तो आप इसे नोट भी करते हैं।


उदाहरण:

  • कोई चेतावनी नहीं, कोई आवाज नहीं

{
    "aps":{
        "content-available":1,
    }
}

  • केवल सतर्क

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • केवल ध्वनि

{
    "aps":{
        "content-available":1,
        "sound":""
    }
}


4

यह मेरे लिए काम करता है:

{ 
  aps: { 
          content-available: 1 
       }
}

देखें कि क्या आप चेक Background fetchबॉक्स को Project Capabilities> चेक करते हैंBackground Modes


2

मैं वही समस्या देख रहा हूं। यदि मैं "सामग्री-उपलब्ध": 1 और कोई अन्य विशेषता सेट के साथ एक धक्का भेजता हूं, तो अधिसूचना कभी प्राप्त नहीं होती है। जब मैं किसी अन्य विशेषता को जोड़ता हूं तो यह पूरी तरह से काम करता है।

एक अस्थायी काम के रूप में मैं बैज विशेषता जोड़ रहा हूं क्योंकि यह उपयोगकर्ता को बैज को जोड़ने के अलावा किसी भी तरह से अलर्ट नहीं करता है।

मुझे पता है अगर आप एक बेहतर समाधान मिल गया है।


1

प्राथमिकता को बाइनरी स्ट्रीम में एक आइटम के रूप में सेट किया जाना चाहिए, लेकिन पेलोड जोंस स्ट्रिंग में नहीं। स्पष्ट रूप से केवल नवीनतम प्रकार 2 प्रारूप का उपयोग प्राथमिकता निर्धारित करने में किया जा सकता है:

$token      = chr(1) . pack('n', 32)     . pack('H*', $deviceToken);
$payload    = chr(2) . pack('n', strlen($json)) . $json;
$identifier = chr(3) . pack('n', 4)      . pack('N', $notification);
$expiration = chr(4) . pack('n', 4)      . pack('N', time()+86400);
$priority   = chr(5) . pack('n', 1)      . chr($priority);

$frame_data = $token.$payload.$identifier.$expiration.$priority;
$frame_length = strlen(bin2hex($frame_data))/2;

$msg = chr(2) . pack('N', $frame_length) . $frame_data;

दूरस्थ सूचना बाइनरी संदेश के लिए प्रारूप प्रकार (प्रथम बाइट):

0 - सरल (पुराना) 1 - संवर्धित (पुराना) 2 - अधिक मापदंडों के साथ नवीनतम (नया)


0

अरे! मेरे बालों को भी बाहर खींच रहा है - यह पेलोड के एक अन्य उदाहरण के रूप में इतना जवाब नहीं है जो काम नहीं करता है। DidReceiveRemoteNotification विधि कभी नहीं कहा जाता है, हालांकि अगर डिवाइस सो रहा है, तो अलर्ट टेक्स्ट IS प्रदर्शित होता है।

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

"apt" एक कस्टम फ़ील्ड है जिसका उपयोग हम सूचना प्रकार को इंगित करने के लिए करते हैं।


2
यदि एप्लिकेशन पृष्ठभूमि में है, और यदि आप 'अलर्ट' विशेषता को हटाते हैं, तो आपको एप्लिकेशन में कॉलबैक प्राप्त करना चाहिए: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon

@mkwon और यदि मैं बीजी + इनवॉइस एप्लिकेशन में अलर्ट (नियमित पुश) देखना चाहता हूं: didReceiveRemoteNotification: fetchCompletionHandh ler:? Tnx
DaNLtR


0

5 के लिए प्राथमिकता तय करना मेरे लिए काम नहीं करता था, लेकिन खाली स्ट्रिंग के लिए ध्वनि या चेतावनी सेट करने से अधिसूचना को उच्च प्राथमिकता के रूप में नियंत्रित किया जाता था


0

हमारा वही मुद्दा था जिसकी कोई अधिसूचना नहीं दी गई थी। हमारे मामले में हम बैज नंबर को अपडेट करने के लिए साइलेंट पुश का उपयोग कर रहे थे। जब हम अलर्ट (बॉडी और टाइटल) के लिए खाली तार सेट करते हैं और ध्वनि आती है तो यह काम करेगा, लेकिन यदि कोई भी चाबी मौजूद नहीं थी तो वह विफल हो गई। यहाँ वह काम किया गया है, जिसमें कोई आवाज़ या चेतावनी के साथ बिल्ला अपडेट नहीं किया गया है (जिसके परिणामस्वरूप userInfo शब्दकोश didReceiveRemoteNotification में है)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.