Silent Push Notification ใน iOS 7 ไม่ทำงาน


87

ในงานนำเสนอ "มีอะไรใหม่พร้อมมัลติทาสกิ้ง" ของ WWDC 2013 มีหัวข้อเกี่ยวกับ Silent Push Notifications ดูเหมือนตรงไปตรงมา ตามการนำเสนอหากคุณส่งเพย์โหลด 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 เป็น Remote Notification (ไม่ใช่จุดบกพร่องของ Silent Push ที่คุณต้องการคุณสมบัติเสียง)? ถ้าเป็นเช่นนั้นหมายความว่าไม่ จำกัด อัตราเช่น Silent Pushes are ... ซึ่ง Apple น่าจะแก้ไขได้ ดังนั้นฉันคงไม่ควรพึ่งพามัน
  3. ขีด จำกัด อัตราคือเท่าใด (N ผลักทุกๆ X วินาที ฯลฯ )

ขอบคุณล่วงหน้า.

แก้ไขด้วยข้อมูลเพิ่มเติม

สำหรับ A สถานะของแอปพลิเคชันไม่สำคัญ ไม่เคยได้รับการแจ้งเตือน

ดูเหมือนว่า B และ C จะใช้ได้ก็ต่อเมื่อคุณใส่แอตทริบิวต์และค่าไว้ในเครื่องหมายคำพูดเช่นด้านล่าง

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

และการแจ้งเตือนมาถึงในแอปพลิเคชัน: didReceiveRemoteNotification: fetchCompletionHandler:โดยไม่คำนึงถึงสถานะ


มันไม่ทำงานในสถานะแอพใด ๆ ? สำหรับฉัน " A " ใช้งานได้ตราบเท่าที่แอปทำงานอยู่เบื้องหน้า (มีการเรียก didReceiveRemoteNotification) แต่เมื่อแอปไม่ทำงานแอปจะไม่ได้รับการแจ้งเตือน (ฉันได้ยินแค่เสียงเมื่อลอง " B ") แอปของคุณถูกปลุก (didReceiveRemoteNotification) ในพื้นหลังเมื่อคุณใช้ " B " หรือ " C " หรือไม่
DerBernie

ฉันเห็นพฤติกรรมที่คล้ายกันฉันคิดว่าอาจเป็นเพราะฉันลองทำมาสักพักแล้วและฉันไม่ได้ตั้งค่าแอพอย่างถูกต้องในตอนแรกดังนั้น Apple อาจควบคุมฉันก่อนที่ฉันจะตั้งค่าได้ถูกต้อง
nickthedude

4
เพื่อน ... ฉันหวังว่าฉันจะให้ 10 โหวต
Michael Wiles

ดูว่าคุณBackground fetchทำเครื่องหมายในช่องProject Capabilities> Background Modesเพราะตัวเลือกแรกควรใช้งานได้ การกดแบบเงียบไม่จำเป็นต้องมีคุณลักษณะของเสียงและจะเข้ามาเสมอapplication:didReceiveRemoteNotification:fetchCompletionHandler:แม้ว่าแอปพลิเคชันจะทำงานในพื้นหลัง / เบื้องหน้าหรือไม่ทำงานก็ตาม
IgniteCoders

คำตอบ:


73

ใช้งานได้เช่นกันและไม่ส่งเสียงเมื่อมาถึง:

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

แก้ไข

ผู้ที่มีปัญหานี้อาจต้องการตรวจสอบลิงก์นี้ ฉันได้เข้าร่วมในเธรดในฟอรัมนักพัฒนาของ Apple ซึ่งกล่าวถึงสถานะของแอพทั้งหมดและเมื่อมีการรับและไม่ได้รับการพุชแบบเงียบ


ขอบคุณสำหรับลิงค์ มีกระทู้มากมายที่พูดถึงเรื่องนี้ในฟอรัมของ ADC บรรทัดล่าง: มีข้อผิดพลาด - หลังจากรีสตาร์ทอุปกรณ์ - ซึ่งตัวแทนของ Apple รับทราบว่าควรได้รับการแก้ไขในการอัปเดต (ในที่สุด)
SG1

3
ใน iOS7 ใช้งานได้ดีแม้ไม่มีปุ่มเสียง / เตือน เนื้อหาใช้ได้เป็นกุญแจสำคัญ! แต่ใน iOS8 เรามีพฤติกรรมที่แปลกมากเมื่อเราตั้งค่าคีย์การแจ้งเตือนด้วยสตริงที่ไม่ว่างเปล่านอกเหนือจาก "content-available": 1 เราได้รับเฉพาะแบนเนอร์ที่มีสตริง "alert" แต่ "content-available" จะไม่สนใจด้วยเหตุผลบางประการ
malex

ฉันประสบความสำเร็จในการเปิดตัวแอปจากการแจ้งเตือนโดยมีหรือไม่มีเสียงที่เพิ่มเข้ามา บางทีการตั้งค่าเสียงการแจ้งเตือนหรือป้าย (ว่างหรือไม่) จะเพิ่มลำดับความสำคัญของการแจ้งเตือนเริ่มต้นเป็น 10 ซึ่งจะช่วยเพิ่มความน่าเชื่อถือ ดูสิ่งที่ Apple พูดเกี่ยวกับ pans-priority: developer.apple.com/library/ios/documentation/…ลำดับความสำคัญเริ่มต้นคือ 10 (สูง) แต่มีข้อผิดพลาดในการใช้สิ่งนี้สำหรับการแจ้งเตือนแบบพุชที่มีเฉพาะคีย์ที่มีเนื้อหาเท่านั้น ดังนั้นอาจตั้งค่าเริ่มต้นเป็น 5 หากตั้งค่าเฉพาะคีย์ที่มีเนื้อหาเท่านั้น
emem

1
ไม่ทำงานบน iOS10 ฉันต้องผลักดันบางสิ่งบางอย่างเพื่อ "เสียง"
Stony

ทำงานบน iOS10 สำหรับฉัน แต่ตอนนี้ใช้ไม่ได้บน iOS11
Slav

30

ดังนั้นฉันเพิ่งเจอปัญหานี้เมื่อวานนี้และหลังจากลองส่งข้อมูลที่มีการตั้งค่าเสียงเป็นสตริงว่างแล้วก็ยังคงทำให้เกิดการสั่น / เสียงในอุปกรณ์ ในที่สุดฉันก็เจอบล็อกโพสต์จาก Urban Airship ที่แนะนำว่าต้องส่ง:

{ 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;
    };

คำตอบที่ยอดเยี่ยม Dave! อนุญาตให้ใช้ลำดับความสำคัญ 5 ในขณะที่ "เป็นข้อผิดพลาดในการใช้ลำดับความสำคัญนี้ [10] สำหรับการพุชที่มีเฉพาะคีย์ที่มีเนื้อหาเท่านั้น" developer.apple.com/library/ios/documentation/…
rjobidon

4
ควรมีลำดับความสำคัญรวมอยู่ในน้ำหนักบรรทุกหรือไม่ IMO เป็นแยกหนึ่งไบต์ในการผลักดันที่คุณส่ง
Foriger

6
ลำดับความสำคัญไม่ได้รับการตั้งค่าในเพย์โหลด สิ่งนี้ได้รับการตั้งค่าในการแจ้งเตือนไบนารี
Sandy D.

10

ฉันได้ลองตั้งค่าสตริงว่างเป็นแอตทริบิวต์การแจ้งเตือนแล้วและยังใช้งานได้:

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

ดูเหมือนว่า APNS กำลังตรวจสอบการมีอยู่ของแอตทริบิวต์นี้เพื่อจุดประสงค์ในการตรวจสอบความถูกต้องของน้ำหนักบรรทุกแบบพุช ที่น่าสนใจคือพวกเขาไม่ได้ตรวจสอบเนื้อหาจริง ดูเหมือนจะแฮ็คนิดหน่อย ...


การแก้ปัญหานี้ด้วยในส่วนของการทำงานสำหรับฉันเป็นอย่างดีในalert="" ไม่ได้ทำงานแทน iOS 9.0sound=""
loretoparisi

5

ฉันใช้เครื่องมือ - Knuffส่งการแจ้งเตือนแบบพุชไปยังอุปกรณ์ของฉัน

ดูเหมือนว่า: ใส่คำอธิบายภาพที่นี่

จากนั้นฉันลองใช้ตัวอย่างเหล่านี้

ทุกอย่างทำงานได้! แต่คุณต้องกำหนดลำดับความสำคัญ 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

ฉันพบปัญหาเดียวกัน หากฉันส่งข้อความ Push พร้อม "content-available": 1 และไม่มีการตั้งค่าแอตทริบิวต์อื่น ๆ การแจ้งเตือนจะไม่ได้รับ เมื่อฉันเพิ่มคุณสมบัติอื่น ๆ มันจะทำงานได้อย่างสมบูรณ์

ในการแก้ปัญหาชั่วคราวฉันกำลังเพิ่มแอตทริบิวต์ตราเนื่องจากจะไม่แจ้งเตือนผู้ใช้ แต่อย่างใดนอกเหนือจากการเพิ่มป้ายลงในไอคอน

โปรดแจ้งให้เราทราบหากคุณพบวิธีแก้ปัญหาที่ดีกว่า


1

ลำดับความสำคัญควรถูกตั้งค่าเป็นหนึ่งรายการในสตรีมไบนารี แต่ไม่ใช่ในสตริง payload json เห็นได้ชัดว่ามีเพียงรูปแบบ type 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 แม้ว่าอุปกรณ์จะเข้าสู่โหมดสลีปข้อความแจ้งเตือนจะปรากฏขึ้น

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

"apt" คือฟิลด์แบบกำหนดเองที่เราใช้เพื่อระบุประเภทการแจ้งเตือน


2
หากแอปอยู่ในพื้นหลังและหากคุณลบแอตทริบิวต์ "alert" คุณควรได้รับการติดต่อกลับในแอปพลิเคชัน: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon

@mkwon และถ้าฉันต้องการดูการแจ้งเตือน (การกดปกติ) ในขณะที่อยู่ในแอปพลิเคชัน BG + เรียกใช้: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR


0

การตั้งค่าลำดับความสำคัญเป็น 5 ไม่ได้ผลสำหรับฉัน แต่การตั้งค่าเสียงหรือการแจ้งเตือนเป็นสตริงว่างทำให้การแจ้งเตือนถูกจัดการเป็นลำดับความสำคัญสูง


0

เราประสบปัญหาเดียวกันโดยไม่มีการส่งการแจ้งเตือน ในกรณีของเราเราใช้การกดแบบไม่โต้ตอบเพื่ออัปเดตหมายเลขป้าย เมื่อเราตั้งค่าสตริงว่างสำหรับการแจ้งเตือน (เนื้อหาและชื่อเรื่อง) และส่งเสียงมันจะใช้งานได้ แต่หากไม่มีคีย์ใด ๆ แสดงอยู่ก็จะล้มเหลว นี่คือสิ่งที่ใช้ได้ผลการอัปเดตตราโดยไม่มีเสียงหรือการแจ้งเตือน (บันทึกของพจนานุกรม userInfo ที่เป็นผลลัพธ์ใน didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.