Trên thực tế, bạn không cần phải thêm UIBackgroundModes vào .plist để sử dụng thông báo từ xa.
Tôi biết tôi đang chia tách những người thừa kế một chút (câu trả lời khác hầu hết là tuyệt vời và có lẽ một cái gì đó mới kể từ iOS 11), nhưng câu hỏi đề cập đến thông báo đẩy yêu cầu cập nhật nền còn họ thì không.
Sự khác biệt ở đây là có hai phương pháp khác nhau chấp nhận thông báo trên AppDelegate;
Cái này không yêu cầu bạn sử dụng UIBackgroundModes:
optional func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
Ở trên thay thế cho iOS 11 không dùng nữa:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any])
Và cái này yêu cầu khả năng chế độ nền:
optional func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
Điều quan trọng ở đây là cái cũ (và cái không dùng nữa mà nó đã thay thế) chỉ chạy khi ứng dụng ở nền trước. Phần sau sẽ chạy nếu ứng dụng ở nền trước HOẶC nền. Xem thông số kỹ thuật cho nugget cụ thể này:
Sử dụng phương pháp này để xử lý thông báo từ xa đến cho ứng dụng của bạn. Không giống như phương thức application (_: didReceiveRemoteNotification :), chỉ được gọi khi ứng dụng của bạn đang chạy ở nền trước, hệ thống gọi phương thức này khi ứng dụng của bạn đang chạy ở nền trước hoặc nền.
Do đó, nếu bạn cần thông báo đẩy, hãy quyết định xem bạn có cần chạy trong nền hay không - chỉ khi bạn cần cả hai, bạn mới nên triển khai phương pháp mà cảnh báo đề xuất.