ฉันสังเกตเห็นว่าใน 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
"content-available": 1
และแอพอยู่ด้านหน้าการโทรกลับจะไม่ถูกไล่ออก