ในความเป็นจริงคุณไม่จำเป็นต้องเพิ่ม UIBackgroundModes ใน. plist เพียงเพื่อใช้การแจ้งเตือนระยะไกล
ฉันรู้ว่าฉันกำลังแยกทายาทเล็กน้อย (คำตอบอื่น ๆ ส่วนใหญ่ดีมากและอาจมีบางอย่างใหม่ใน iOS 11) แต่คำถามหมายถึงการแจ้งเตือนแบบพุชที่จำเป็นต้องมีการอัปเดตเบื้องหลังและไม่ทำ
ความแตกต่างที่นี่คือมีสองวิธีที่แตกต่างกันที่ยอมรับการแจ้งเตือนบน AppDelegate
อันนี้ไม่ต้องการให้คุณใช้ UIBackgroundModes:
optional func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
ข้างต้นแทนที่การเลิกใช้งานเมื่อ iOS 11:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any])
และสิ่งนี้ต้องการความสามารถในโหมดพื้นหลัง:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
สิ่งสำคัญที่นี่คืออันเก่า (และอันที่เลิกใช้แล้วมันถูกแทนที่) จะทำงานเฉพาะเมื่อแอพอยู่เบื้องหน้า ส่วนหลังจะทำงานหากแอปอยู่ในพื้นหน้าหรือพื้นหลัง ดูข้อมูลจำเพาะสำหรับนักเก็ตเฉพาะนี้:
ใช้วิธีนี้เพื่อประมวลผลการแจ้งเตือนระยะไกลที่เข้ามาสำหรับแอปของคุณ ซึ่งแตกต่างจากเมธอดแอปพลิเคชัน (_: didReceiveRemoteNotification :) ซึ่งจะเรียกเฉพาะเมื่อแอปของคุณทำงานอยู่เบื้องหน้าระบบจะเรียกเมธอดนี้เมื่อแอปของคุณทำงานอยู่ในส่วนหน้าหรือพื้นหลัง
ดังนั้นหากคุณต้องการการแจ้งเตือนแบบพุชให้ตัดสินใจว่าคุณจำเป็นต้องทำงานในพื้นหลังหรือไม่ - เฉพาะในกรณีที่คุณต้องการทั้งสองอย่างคุณควรใช้วิธีการที่แนะนำโดยคำเตือน