การส่งข้อมูลแบบเงียบไม่ส่งไปยังแอปใน iOS 11


168

ฉันสังเกตเห็นว่าใน iOS 11 เบต้า 2 การแจ้งเตือนแบบเงียบจะไม่ถูกส่งไปapplication:didReceiveRemoteNotification:fetchCompletionHandlerยังสถานะของแอพ (พื้นหลัง / เบื้องหน้า)

ฉันใช้UIApplicationDelegeteวิธีนี้application:didReceiveRemoteNotification:fetchCompletionHandlerและส่งการแจ้งเตือนแบบเงียบ ๆ ดังต่อไปนี้

{  
  "aps": {  
    "content-available": 1  
  },  
  "mydata": {  
    "foo": "bar"  
  }  
} 

แต่วิธีการมอบสิทธิ์ไม่ได้ถูกเรียกบน iOS 11

ใช้งานได้ดีกับ iOS เวอร์ชันอื่นและส่วนเอกสารประกอบการกำหนดค่าการแจ้งเตือนแบบเงียบไม่ได้กล่าวถึงสิ่งอื่นใด

นี่เป็นข้อบกพร่องใน iOS 11 หรือฉันคิดถึงสิ่งใหม่ใน iOS 11 หรือไม่

โปรดทราบว่าฉันไม่ได้พูดถึงหรือใช้UserNotificationกรอบซึ่งไม่จำเป็นสำหรับการส่งสัญญาณเงียบ

นี่คือตัวอย่างโครงการที่แสดงปัญหา (คุณจะต้องตั้งค่าบันเดิลของคุณเอง)

เมื่อคุณส่งตัวอย่างโครงการและส่งส่วนของข้อมูลด้านบนไปยังแอปคุณสามารถใช้คอนโซล macOS เพื่อดูว่ามีการส่งการพุชไปยังอุปกรณ์อย่างถูกต้อง แต่ไม่ส่งไปยังแอป

อัพเดท 10.08

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

อย่างที่คุณเห็นในภาพหน้าจอต่อไปนี้การพุชที่ทำเครื่องหมายเป็น 1 จะถูกส่งไปยังอุปกรณ์เท่านั้นและการพุช 2 (หลังจากรีสตาร์ทอุปกรณ์) จะถูกส่งไปยังแอปด้วย

ป้อนคำอธิบายรูปภาพที่นี่

อัพเดท 14.08 - iOS 11 Beta 6

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

ป้อนคำอธิบายรูปภาพที่นี่

อัพเดท 21.08 - iOS 11 Beta 7

ยังคงเป็นพฤติกรรมเดิมและไม่อัปเดตจาก Apple ในรายงานข้อผิดพลาด

อัปเดต 29.08 - iOS 11 Beta 8

ยังคงเป็นปัญหาเดียวกัน ขั้นตอนในการทำซ้ำฉันใช้ตอนนี้มีดังต่อไปนี้:

  • ในชุดรูปแบบโครงการ Xcode เลือก "รอให้เปิดใช้งานโปรแกรมได้"
  • เพิ่มเบรกพอยต์ใน didReceiveRemoteNotification: fetchCompletionHandler
  • เริ่มแอปบนอุปกรณ์
  • ส่งการผลักดันเงียบข้างต้น

คาดว่า : แอปจะถูกนำมาจากสถานะระงับไปยังพื้นหลังและdidReceiveRemoteNotification: fetchCompletionHandlerเรียกว่า

จริง : ไม่มีอะไรเกิดขึ้น

อัปเดต 06.09 - iOS 11 Beta 10

ฉันยังคงมีพฤติกรรมบั๊กกี้เหมือนเดิม ตั๋วจาก Apple ได้รับการอัพเดตพร้อมคำตอบต่อไปนี้:

Apple Developer Relations 6 กันยายน 2017, 22:42 PM Engineering ได้ให้ข้อเสนอแนะต่อไปนี้เกี่ยวกับปัญหานี้:

เราสามารถทำให้แอปตัวอย่างทำงานและทดสอบพฤติกรรมได้ เราไม่เห็นปัญหาใด ๆ เมื่อเราทำการทดสอบตามที่อธิบายไว้

การผลักดันไม่ได้รับประกันว่าจะมาถึงแอปเมื่อมีการทำงานในพื้นหลังและบันทึกที่นี่ระบุว่าเราไม่เชื่อว่ามีการใช้แอปเพียงพอที่จะเปิดใช้งาน

เราเห็นว่าเราผลักดันให้เป็นครั้งคราวเมื่อสภาพดี

เราเชื่อว่านี่เป็นพฤติกรรมที่ถูกต้อง

อัปเดต 11.09

รายงานบั๊กของ Apple ของฉันถูกปิดและทำเครื่องหมายว่าซ้ำกัน33278611ซึ่งยังคงเปิดอยู่

อัพเดท 13.09 - iOS 11 GM

ขอบคุณที่ความคิดเห็นของ kam800 (ดูด้านล่าง) ฉันทำการทดสอบมากขึ้น

ดูเหมือนว่าจะมี daemon ใหม่ใน iOS 11 dasd DuetActivitySchedulerDaemonที่สามารถยกเลิกการส่งข้อมูลอย่างสมบูรณ์หรือชะลอการส่งข้อมูลได้:

เลื่อนการจัดส่ง

บันทึกของคอนโซล

default 13:11:47.177547 +0200   dasd    DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>!   lifecycle   com.apple.duetactivityscheduler
default 13:11:47.178186 +0200   dasd    DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private>   default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200   dasd    DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017   default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200   dasd    DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>)  scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200   dasd    DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private>  default com.apple.duetactivityscheduler

เลื่อนการส่งมอบออกไป

  • เมื่อเลื่อนการส่งข้อมูลไปแล้วและเปิดตัวแอพการส่งข้อมูลจะถูกส่งเฉพาะเมื่อถึงวันที่ส่งมอบซึ่งอาจใช้เวลาหลายนาทีในอนาคต นี่เป็นการเอาชนะจุดประสงค์ของการใช้ข้อมูลอย่างสมบูรณ์เพื่อให้เนื้อหาของแอปใหม่พร้อมสำหรับการเปิดตัวครั้งถัดไป ฉันพูดที่นี่เอกสารของ Apple อีกครั้ง:

"การแจ้งเตือนเงียบช่วยปรับปรุงประสบการณ์ผู้ใช้โดยช่วยให้แอพของคุณทันสมัยอยู่เสมอแม้จะไม่ได้ทำงานอยู่"

  • เมื่อมีการส่งข้อมูลสองรายการไปยังแอปที่ถูกระงับ iOS 11 จะถูกเลื่อนออกไปแทนที่จะเรียกใช้แอปโดยตรง เมื่อถึงเวลาส่งมอบจะมีการส่งข้อมูลครั้งสุดท้ายเท่านั้น ! การกดครั้งก่อนจะหายไปและไม่ได้ส่งผ่านวิธีการมอบหมายทำให้สูญเสียข้อมูล

การจัดส่งถูกยกเลิก

บันทึกของคอนโซล

default 13:35:05.347078 +0200   dasd    DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
 ], FinalDecision: Must Not Proceed}    scoring com.apple.duetactivityscheduler

ยกเลิกปัญหาการจัดส่ง

ในกรณีนี้การกดข้อมูลจะหายไปอย่างสมบูรณ์และไม่เคยส่งมอบใน iOS 11 ในขณะที่ส่งอย่างถูกต้องบน iOS 10

อัปเดต 19.09 - iOS 11 GM

ฉันยังสังเกตเห็นว่าเมื่อแอปพลิเคชันอยู่เบื้องหน้าและการแจ้งเตือนไม่ถูกส่งไปยังแอปฉันเห็นบันทึกต่อไปนี้ในคอนโซล:

default 08:28:49.354824 +0200   apsd    apsd    <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO   courier-oversized   com.apple.apsd

fault   08:33:18.128209 +0200   dasd    Foundation  <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
    NSArray,
    NSData,
    NSString,
    NSNumber,
    NSDictionary,
    NSUUID,
    _DASActivity,
    NSSet,
    _DASFileProtection,
    NSDate,
    NWParameters,
    NWEndpoint
)}'.    general com.apple.foundation.xpc

1
ยังคงไม่ได้รับการแก้ไขในเบต้า 8 เมื่อฉันดูในคอนโซลฉันเห็นข้อผิดพลาดต่อไปนี้: <NSXPCConnection: 0x123f43620> การเชื่อมต่อจาก pid 58: มีข้อยกเว้นเกิดขึ้นระหว่างการถอดรหัสข้อความที่ได้รับ ข้อยกเว้น: ข้อยกเว้นขณะถอดรหัสอาร์กิวเมนต์ 0 (# 2 ของการเรียกใช้): ข้อยกเว้น: ค่าสำหรับคีย์ 'NS.objects' เป็นของคลาสที่ไม่คาดคิด 'NSNull' คลาสที่อนุญาตคือ '{(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'
โทมัสไอน์วอลเลอร์

2
ฉันได้รับผลลัพธ์เดียวกันกับ iOS 11 (ไม่ใช่ก่อนหน้านี้) ถ้าฉันส่งด้วยการกดด้วย"content-available": 1และแอพอยู่ด้านหน้าการโทรกลับจะไม่ถูกไล่ออก
GoRoS

4
หลังจากการทดสอบด้วย iOS11.1 เบต้า 1 ใหม่ดูเหมือนว่าสิ่งนี้ได้รับการแก้ไขแล้วและใช้งานได้เหมือนเดิมบน iOS 10
Lee

3
ดูเหมือนว่า Whatsapp จะมีปัญหาคล้ายกันคือwhatsappen.com/news/5465/..สิ่งที่เกี่ยวกับผู้ใช้ที่ "บังคับให้ปิดแอปของพวกเขาเป็นประจำ" ซึ่งเป็นนักพัฒนาซอฟต์แวร์ส่วนใหญ่ ...
toxaq

3
และเหมือนกันกับการเปิดตัว 11.1 สาธารณะ หากคุณใช้การกดแบบเงียบและแอพของคุณอยู่ในเบื้องหน้าอย่าคาดหวังว่าจะได้รับการจัดส่งโดยขึ้นอยู่กับหลาย ๆ อย่าง แต่ระดับแบตเตอรี่เป็นหลักแม้ว่าอุปกรณ์นั้นจะเสียบอยู่กับแหล่งจ่ายไฟก็ตาม
2560

คำตอบ:


31

ดังนั้นบันทึกประจำรุ่นของ iOS 11.1 เบต้า 1 จึงบอกว่า

iOS 11.1 เบต้า 1 เพิ่งเปิดตัวและพวกเขาพูดถึง: "การแจ้งเตือนการแก้ไขปัญหา•การแจ้งเตือนแบบเงียบจะถูกประมวลผลบ่อยครั้งมากขึ้น (33278611)

ฉันทำการทดสอบบางอย่างและดูเหมือนว่าจะได้รับการแก้ไขแน่นอน:

รัฐที่ถูกระงับ

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

สถานะเบื้องหน้า

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


3
ในการทดสอบครั้งแรกของฉันฉันคิดว่ามันคงที่ มันใช้งานได้สักพัก แต่หลังจากการทดสอบอย่างหนักบางสิ่งก็เริ่มลดลง ทันใดนั้นมันก็หยุดเรียกผู้ได้รับมอบหมายให้กดเงียบทุกครั้งแม้จะมีแอพอยู่ด้านหน้า เห็นได้ชัดว่าระบบ "duet" ใหม่นี้กำลังบล็อกผู้ได้รับมอบอำนาจของแอพของฉันที่จะถูกเรียกเนื่องจากขาด "พลังงานงบประมาณ" ดังนั้นน่าเสียดายที่ยังคงไม่ได้รับการแก้ไข
Abras

ไม่น่าเชื่อ :(
Thomas Einwaller

ประสบการณ์ของฉันเหมือนกับ Abras ด้านบน ทำงานมาสักพักแล้วก็แยกจากกันและผู้ดูแลก็ไม่ได้ถูกเรียกอีกต่อไป - สิ่งนี้แย่มาก
ลี

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

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

18

แค่ต้องการเพิ่ม 2 เซ็นต์ของฉันที่นี่เนื่องจากฉันได้รับผลกระทบจากปัญหานี้เช่นกันและฉันสังเกตเห็นว่า Apple ได้ปิดเรดาร์หลายครั้งในปัญหานี้โดยบอกว่าพวกเขาไม่สามารถทำซ้ำได้ สิ่งที่น่าสนใจที่ฉันพบคือการกดจะได้รับหากแอปมีพื้นหลังในขณะที่แนบกับดีบักเกอร์

หากฉันฆ่าดีบั๊กเกอร์ให้ถอดปลั๊กโทรศัพท์ของฉันเปิดแอพและส่งข้อมูลการกดแบบเงียบ ๆ ที่ฉันเห็นว่าแอพไม่ได้รับการปลุก ฉันเห็นในบันทึกของคอนโซลว่าระบบยกเลิกการจัดส่งเพย์โหลดไปยังแอปของฉัน

ฉันส่งเรดาร์ด้วยแอปตัวอย่างขนาดเล็กที่ทำให้เกิดปัญหาขึ้นอีกครั้ง ฉันยังได้ระบุไว้อย่างชัดเจนในเรดาห์ว่าบุคคลที่ทำงานกับตั๋วของฉันจะต้องไม่เรียกใช้แอพที่แนบกับดีบักเกอร์เพื่อทำให้เกิดปัญหาอีกครั้ง นี่คือลิงค์: https://bugreport.apple.com/web/?problemID=34461063

หวังว่านี่จะทำให้เกิดความคืบหน้าในเรื่องนี้


2
ขอบคุณสำหรับการรายงาน Btw, การเชื่อมโยงข้อผิดพลาดของ Apple จะไม่ช่วยที่นี่เพราะพวกเขาเป็นส่วนตัวและมีเพียงนักข่าวและ Apple สามารถเห็นได้
Jan

ฉันต้องการที่จะเห็นผู้คนจำนวนมากใช้openradar.appspot.comเพื่อให้เราสามารถติดตามคนอื่น ๆ ได้
Thomas Einwaller

มีการอัปเดตใด ๆ เกี่ยวกับรายงานบั๊กของคุณด้วย apple @bill
MagicFlow

ฉันไม่ได้รับการอัปเดตใด ๆ จากเรดาร์ของฉันจาก Apple แต่เราได้ติดตั้งเบต้าของ iOS 11.1 และปรากฏว่าปัญหาได้รับการแก้ไข
Bill Dunay

ใช่เรากำลังเผชิญปัญหาเดียวกันใน iOS 11.2.6 วิธีแก้ปัญหาหรือการปรับปรุงใด ๆ
Gopik

14

ดูเหมือนว่าพฤติกรรมใหม่ของ iOS 11 iOS 11 เบต้า 10 มีบันทึกอธิบายเกี่ยวกับปัญหานี้:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

ดูเหมือนว่าทุกการส่งแบบเงียบจะถูกส่งไปยัง iOS แต่ dasd daemon ใช้นโยบายสองข้อในการตัดสินใจว่าควรส่งแบบเงียบแบบส่งไปยังแอป (เช่นระดับแบตเตอรี่) หรือไม่ เมื่อคืนวานนี้ฉันได้รับการแจ้งเตือนแบบเงียบหนึ่งครั้ง แต่ iPhone ของฉันเชื่อมต่อกับเครื่องชาร์จในเวลานั้น - อาจเป็นคะแนน BatteryLevelPolicy สูงพอที่จะรับการแจ้งเตือนแบบเงียบครั้งหนึ่งได้

Apple ไม่ให้ข้อมูลอย่างเป็นทางการเกี่ยวกับพฤติกรรมด้าน iOS นี้มีเพียงข้อมูลเกี่ยวกับการควบคุมปริมาณเซิร์ฟเวอร์:

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

ฉันใช้นิ้วของฉันข้ามพวกเขาเปลี่ยนพฤติกรรมนั้นเพราะนั่นจะแก้ไขแอปของฉัน :) ในทางกลับกันการเปลี่ยนแปลงนี้ดี - หนึ่งในหลาย ๆ สิ่งที่ทำให้แบตเตอรี่ iPhone ติดทนนานกว่าโทรศัพท์ Android


1
ใช่การพุชถูกส่งไปยังอุปกรณ์ แต่ไม่ใช่แอป นั่นคือสิ่งที่ฉันเขียนในโพสต์ต้นฉบับของฉัน "การแจ้งเตือนที่เงียบไม่ได้หมายถึงวิธีที่ทำให้แอปของคุณตื่นอยู่ในพื้นหลัง" นี่ก็โอเคตราบเท่าที่มีการส่ง "บางครั้ง" ปัญหาใหญ่คือการแจ้งเตือนแบบเงียบจะไม่ถูกส่งไปยังแอพใน iOS 11 เมื่ออยู่ในพื้นหลัง สิ่งนี้จะทำลายจุดประสงค์ทั้งหมดของข้อมูลอย่างสมบูรณ์
Jan

ใช่คุณได้เขียนไปแล้วว่าฉันแค่ต้องการให้คำอธิบายที่ครบถ้วนเกี่ยวกับนโยบายการผลักดันใหม่เหล่านี้ ฉันอ้างเอกสารของ Apple เพื่อแสดงว่าพวกเขาได้รับคำเตือนเกี่ยวกับความไม่แน่นอนของการจัดส่งแบบพุช ดังที่ฉันเขียน: "ฉันจัดการเพื่อรับการแจ้งเตือนแบบเงียบเมื่อคืนวานนี้" (ในแอพที่ฉันหมายถึง) และแอปอยู่เบื้องหลัง แต่ในวันนี้ - แอพของฉันไม่ได้รับการพุช: (ในความคิดของฉันแอปเปิ้ลจะคลายนโยบายการกดเหล่านี้ในเวอร์ชั่น RC ในทางกลับกันพวกเขาสามารถเรียกคืนพฤติกรรมการพุชดั้งเดิมได้ รุ่นเบต้า (เช่นรุ่น 10.3 พวงกุญแจอัตโนมัติ)
kam800

ฉันเห็นบันทึกที่คล้ายกันเมื่อได้รับการพุชและแอปถูกระงับ กระบวนการแล้วบันทึกdasd default 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017ดูเหมือนว่าจะมีการส่งเสียงเงียบในเวลานั้น
Jan

เริ่มการทดสอบกับ iOS 11 GM แล้วยังเห็นพฤติกรรมแปลก ๆ บันทึกเช่น com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Thomas Einwaller

1
นอกจากนี้ - ฉันจัดการเพื่อแก้ปัญหาแอพของฉันโดยการส่งข้อความแบบไม่โต้ตอบด้วยการแจ้งเตือนต้นขั้วและเติมการแจ้งเตือนด้วยเนื้อหาที่ถูกต้องโดยใช้ส่วนขยายบริการการแจ้งเตือน
kam800

9

บันทึกประจำรุ่นเบต้าของ iOS 11.1 รวมถึง: การแจ้งเตือนการแก้ไขปัญหาการแจ้งเตือนแบบเงียบจะถูกประมวลผลบ่อยครั้งมากขึ้น (33278611)


7

iOS 11.1 Beta 2 ยังมี

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

ในบันทึกย่อประจำรุ่น - จะทดสอบทันที

อัปเดต - 11.10.2017 - iOS 11.1 Beta 2

หลังจากใช้แอพของเราเป็นเวลา 2 วันใน "สถานการณ์ในโลกแห่งความจริง" ดูเหมือนว่ามีการปรับปรุงจริงใน iOS เวอร์ชันนี้ ฉันเริ่มที่จะระแวดระวังอย่างระมัดระวัง


1
ฉันทดสอบสถานการณ์ต่างๆ: มันทำงานในเบื้องหน้าและสถานะพื้นหลัง น่าเสียดายที่มันใช้งานไม่ได้หากแอปถูกยกเลิกโดยผู้ใช้ หลังจากยกเลิกอุปกรณ์จะไม่ได้รับการแจ้งเตือนแบบเงียบ ๆ ตราบใดที่ผู้ใช้ไม่ได้เปิดใช้งานแอปอีกครั้ง คุณเคยสัมผัสแบบเดียวกันหรือไม่?
AlexWoe89

ตอนนี้มันใช้งานได้ ... หลังจาก 'การหยุดทำงาน' ของประมาณ 5 ถึง 10 นาทีการแจ้งเตือนเงียบทำงานตามที่คาดไว้ ... ขออภัยสำหรับฉันก่อนหน้า ความคิดเห็น :)
AlexWoe89

1
การกดเงียบจะไม่ทำงานเมื่อผู้ใช้ยกเลิกแอป - ดูdeveloper.apple.com/documentation/uikit/uiapplicationdelegate/… "อย่างไรก็ตามระบบจะไม่เปิดแอปของคุณโดยอัตโนมัติหากผู้ใช้บังคับให้ออกจากระบบ"
Thomas Einwaller

1
ฉันเห็นว่า iOS11.1 เบต้า 3 ทำงานได้เหมือน iOS10 และดีกว่า iOS11.1 เบต้า 2 มาก
Lee

1
@Olecramoak สำหรับฉัน iOS11.1 beta 4 ทำงานเหมือน iOS 10
AlexWoe89

7

Apple Developer Relations เพิ่งเพิ่มความคิดเห็นใน Radar ของฉัน:

เราเชื่อว่าปัญหานี้ได้รับการแก้ไขใน iOS 11.2 เบต้าล่าสุด

โปรดทดสอบกับ iOS รุ่นเบต้าล่าสุด หากคุณยังคงมีปัญหาโปรดอัปเดตรายงานข้อผิดพลาดของคุณด้วยบันทึกหรือข้อมูลที่เกี่ยวข้องที่สามารถช่วยเราตรวจสอบ

https://developer.apple.com/download/

กำลังติดตั้ง iOS 11.2 เบต้า - จะทดสอบพฤติกรรมการกดเงียบ


ดังนั้นนี่หมายความว่า iOS 11.1 GM จะไม่แก้ไขปัญหาได้หรือไม่ :(
Olecramoak

เป็นสิ่งที่ดีที่จะได้ยินเมื่อใดที่เราสามารถคาดหวังการเปิดตัว iOS11.1 อย่างเป็นทางการ
AlexWoe89

ทำให้เราโพสต์ไม่สามารถติดตั้งแอปของฉันได้ในขณะนี้เนื่องจากไม่มี Xcode สำหรับ 11.2 (และฉันลบแอพออกจากอุปกรณ์ของฉัน)
Rool Paap

3

ฉันมีปัญหาคล้ายกันกับแอพของฉันจนถึง iOS 10 ฉันได้รับการแจ้งเตือนแบบพุชและapplication:didReceiveRemoteNotification:fetchCompletionHandlerได้รับการโทรอย่างถูกต้อง แต่เมื่ออัปเดตเป็น iOS 11 การแจ้งเตือนแบบพุชหยุดทำงาน

ปัญหาเกี่ยวกับรหัสของฉันคือแม้ว่าฉันใช้เนื้อหาที่มีอยู่: 1 และเนื้อหาที่ไม่แน่นอน: 1 ในส่วนของการแจ้งเตือนแบบพุชตัวเลือกการดึงข้อมูลพื้นหลังไม่ได้เปิดใช้งาน แต่มันทำงานได้อย่างสมบูรณ์แบบจนถึง iOS 10

ตรวจสอบให้แน่ใจว่าคุณเปิดใช้ความสามารถเหล่านี้ทั้งสอง

หลังจากที่เปิดใช้งานความสามารถในการดึงข้อมูลพื้นหลัง ON จะทำงานทันที


ไม่มันใช้ไม่ได้กับ iOS11 - เพียงแค่หยุดแอพของคุณหนึ่งครั้งจากนั้นมันจะหยุดการปลุกแอพของคุณ เพียงอ่านคำตอบและความคิดเห็นในหัวข้อนี้
AlexWoe89

2
สำหรับแอปที่ถูกยกเลิกการแจ้งเตือนแบบพุช (sielent หรือการพุชทั่วไป) จะไม่ใช้วิธีการมอบหมายในแอพผู้รับมอบสิทธิ์ นั่นคือพฤติกรรมเริ่มต้น ไม่มีเคสพิเศษสำหรับ iOS 11.0
Sudeep george

3

iOS 11.4.1, Swift 4

ฉันมีปัญหากับการกดเงียบ ๆ ที่ไม่มาถึง (จาก CloudKit) และฉันลองทุกสิ่งที่ทุกคนพูดถึงที่นี่ จากนั้นฉันตัดสินใจลองตั้งค่าวัตถุเปล่าalertBodyของฉันCKNotificationInfo()ดังนี้:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

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

ฉันหวังว่าจะช่วยใครบางคน :)


ใช้งานได้กับ CloudKit เช่นกัน หากไม่มี AlertBody คุณจะต้องเสียบอุปกรณ์เพื่อรับการแจ้งเตือนระยะไกล พฤติกรรมที่แปลกมาก ...
powertoold

2

ดังนั้นนี่จึงเป็นข้อผิดพลาดใน iOS 11 และตอนนี้ได้รับการแก้ไขใน iOS 11 เบต้า 3 application:didReceiveRemoteNotification:fetchCompletionHandlerตอนนี้ถูกเรียกอย่างถูกต้องเมื่อได้รับการกดแบบเงียบทั้งด้านหน้าและด้านหลัง

UPDATE

ไม่ได้รับการแก้ไขและยังคงเกิดขึ้นใน iOS เบต้า 3 และ 4


1
จริงๆแล้วมันไม่ใช่ :( มันยังคงเกิดขึ้นใน iOS 11 เบต้า 3
มกราคม

1
Apple เปิดรายงานข้อผิดพลาดอีกครั้งเช่นกัน ฉันจะแจ้งให้คุณทราบ
ม.ค.

1
ฉันไม่ได้รับการแจ้งเตือนแบบเงียบใน iOS 11 เบต้า 4. มีความเกี่ยวข้องเพิ่มเติมหากแอพไม่ได้อยู่เบื้องหน้าบางครั้งอาจปรากฏเป็นการแจ้งเตือนปกติ เกิดอะไรขึ้นอย่างแน่นอน!
Ben Dodson

1
ดังนั้นฉันเพิ่งติดตั้ง iOS 11 เบต้า 5 และมันดูดีขึ้นและการแจ้งเตือนแบบเงียบจะถูกส่งเมื่อแอปอยู่เบื้องหน้าหรือพื้นหลังผ่าน didReceiveRemote ตัวแทนการแจ้งเตือนครั้งหนึ่งแล้วมันหยุดทำงานอีกครั้งไม่ว่าฉันจะทำอะไร: / คุณมี พฤติกรรมเดียวกัน
ม.ค.

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

2

เพื่อเป็นการหลีกเลี่ยงปัญหาเรากำลังเพิ่มคีย์ "การแจ้งเตือน" และภายใน "ชื่อ" ที่มีสตริงว่างเปล่าเป็นค่า นี่เป็นการปลุกการเรียกกลับของ didReceive ใน appDelegate


1
สิ่งนี้ดูเหมือนจะใช้ได้กับฉันเช่นเดียวกับวิธีแก้ปัญหาเพื่อรับ DuetActivitySchedulerDaemon เพื่ออนุญาตให้การแจ้งเตือนปลุกแอปจนกว่าแอปเปิ้ลจะแก้ไขข้อบกพร่อง
Joe Benton

เมื่อผลักดัน JSON ที่มีชื่อว่างฉันยังคงได้รับข้อความบนคอนโซล "ละเว้นการแจ้งเตือนโดยไม่มีการเตือนเสียงหรือตรา ... " {"aps": {"alert": {"title": ""}, "content-available": "1"}, "gcm.message_id": "0 ... bb"} โครงสร้าง JSON นี้เหมาะสำหรับคุณหรือไม่?
Olecramoak

คุณไม่ควรส่ง 1 (ค่าสำหรับเนื้อหาที่มีอยู่) โดยไม่มีเครื่องหมายคำพูด?
elkorb

นั่นคือวิธีที่ Google Firebase จัดรูปแบบ Json (“ 1”) และใช้งานได้เสมอ แค่ iOS 11 ที่ไร้สาระ dasd กำลังสร้างปัญหา คุณช่วยกรุณาโพสต์ตัวอย่างของ Json ที่เหมาะกับคุณได้ไหม?
Olecramoak

ดังนั้นสิ่งที่ฉันสังเกตบน iOS 11.1 คือไม่มีการส่งสัญญาณเสียงแบบเงียบหากอุปกรณ์ทำงานบนแบตเตอรี่ (ไม่ชาร์จ) และระดับแบตเตอรี่น้อยกว่า 20% แม้ว่าโหมดพลังงานต่ำจะไม่เปิดใช้งาน นี้ไม่ดี. การกดเงียบบน iOS 11 ไม่น่าเชื่อถือเลยแทบไม่มีประโยชน์
Olecramoak

1

ขณะที่เขียนคำตอบนี้ฉันกำลังเผชิญปัญหาเดียวกันกับคำตอบของ Bill Dunay

ความต้องการของฉันคือการรับการแจ้งเตือนที่เงียบเมื่อแอปอยู่เบื้องหน้าและไม่มีสิ่งใดเมื่อแอปอยู่ในพื้นหลัง / ไม่ทำงาน และวิธีแก้ปัญหาของฉันคือ ฉันไม่ได้ใช้ตราสัญลักษณ์ดังนั้นการตั้งค่าเป็นศูนย์ไม่ใช่ปัญหาสำหรับฉัน

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

โปรดทราบว่าฉันตั้งใจไม่ใช้ "เนื้อหาที่มีอยู่" การตั้งค่าที่ทำให้ตรรกะการปรับให้เหมาะสมของ iOS เริ่มทำงานล่าช้า / ยกเลิกการส่งการแจ้งเตือน


1

ฉันได้รับปัญหาเดียวกันสำหรับการแจ้งเตือนบางอย่าง (ไม่จำเป็นต้องเงียบ)

หลังจากตรวจสอบการอัปเดตและคำตอบทั้งหมดฉันสามารถเพิ่มการอัปเดตสองรายการที่อาจช่วยได้:

  • ฉันพบว่าUIApplication.shared.isRegisteredForRemoteNotificationsวิธีการเข้าถึงในขณะที่ได้รับการแจ้งเตือนทำให้แอปพลิเคชันหยุดทำงานโดยไม่ต้องรายงานอะไรไปยัง Xcode ตรวจสอบว่าคุณกำลังเรียกใช้รหัสบางส่วนหลังจากที่คุณได้รับการแจ้งเตือนที่เข้าถึงวิธีการ ( isRegisteredForRemoteNotifications การล็อก UI ด้วย semaphore_wait_trap )

    • ผมค้นพบว่าผมมีการแจ้งเตือนผลักดันการแยกวิเคราะห์ข้อผิดพลาดบนคอนโซลเนื่องจากการ"title-loc-args" : [3333]ไม่ยอมรับอย่างแท้จริง 3333 "title-loc-args" : ["3333"]แต่ยอมรับว่ามันเป็นสตริง สิ่งนี้ทำให้แผงส่วนต่อประสานทั้งหมดของฉันหลังจากที่ฉันเข้าถึงวิธีการด้านบนเฉพาะบน iOS 11 เท่านั้นทำงานบน iOS 12
  • ฉันยังพบว่ามีรหัสเดียวกันแน่นอนก็ทำงานได้โดยไม่มีปัญหาใด ๆ บนiOS 12.0 (16A5366a) แต่ใน iOS 11 มันเกิดขึ้น


1

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

เพื่อให้การทำงานนี้ฉันเพิ่มผู้รับมอบสิทธิ์และสร้างส่วนขยายด้วยUNUserNotificationCenterDelegateโปรโตคอลและwillPresent notification(iOS 10+) วิธีการที่จะถูกเรียกทุกครั้งด้วยน้ำหนักบรรทุกที่ถูกต้อง หากต้องการไม่แสดงการแจ้งเตือนเมื่อแอปพลิเคชันเปิดใช้งานอยู่ให้โทรแจ้งด้วยเสียง ฉันลงเอยด้วยอะไรแบบนี้

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

และเพื่อให้ทำงานในสถานะเหล่านี้เมื่อแอปอยู่ในพื้นหลังและการแจ้งเตือนแบบไม่เรียกวิธีการของฉันฉันจะได้รับการแจ้งเตือนจากศูนย์การแจ้งเตือนโดยตรงapplicationDidBecomeActiveโดย:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

ในกรณีของฉัน "การรีเฟรชแอปพื้นหลัง" ถูกปิดในการตั้งค่า iPhone เนื่องจากการแจ้งเตือนแบบพุชนี้ถูกส่งไปยังอุปกรณ์ แต่ไม่ได้อยู่ในแอป การเปิดแอปพื้นหลังรีเฟรชจะได้รับการแจ้งเตือนแบบเงียบในแอป

นี่อาจไม่ใช่คำตอบที่แท้จริงสำหรับคำถามนี้ในกรณีที่มีใครต้องการตรวจสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.