Thông báo đẩy từ xa có yêu cầu thêm UIBackgroundModes trong Info.plist không?


104

Tôi đã tích hợp thông báo đẩy từ xa, nhưng tôi nhận được cảnh báo này:

didReceiveRemoteNotification:fetchCompletionHandler:], nhưng bạn vẫn cần thêm " remote-notification" vào danh sách được hỗ trợ UIBackgroundModetrong của bạn Info.plist.

Phiên bản Xcode của tôi là 8.3.1. Tôi thực sự muốn thêm điều này vào Info.plist. Tôi đã làm theo một số hướng dẫn nhưng họ cũng không đề cập đến điều này. Tôi thực sự nên làm gì?

Câu trả lời:


245

Có, bạn nên bật Chế độ nền / Thông báo từ xa để có thể sử dụng thông báo từ xa cho các bản cập nhật nền.

Cách dễ nhất để làm điều này là thông qua cài đặt dự án. Điều hướng đến Mục tiêu -> Ứng dụng của bạn -> Khả năng -> Chế độ nền và chọn Thông báo từ xa . Điều này sẽ tự động kích hoạt các cài đặt cần thiết.

Danh sách thả xuống Chế độ nền trong Cài đặt dự án


3
Tôi đã kiểm tra trường đó nhưng vẫn gặp lỗi tương tự.
Anuj

Anuj xem câu trả lời của tôi dưới đây
Joshua Cleetus

1
Tôi không đồng ý với câu trả lời này. Bạn chỉ nên bật Chế độ nền -> Thông báo từ xa nếu bạn đang sử dụng thông báo từ xa để cập nhật nền. Vui lòng tham khảo các tài liệu ở đây Cấu hình một nền Cập nhật Thông báo
jzeferino

1
@jzeferino Cảm ơn bạn đã thông báo, tôi đã thêm một số thông tin làm rõ cho câu trả lời của mình. Lưu ý rằng câu hỏi ban đầu là về application(_:didReceiveRemoteNotification:fetchCompletionHandler:)hàm, được sử dụng để xử lý tìm nạp dữ liệu.
Tamás Sengel

Điều này thật tuyệt, nhưng hãy trả lời câu hỏi liệu bạn có cần khả năng cập nhật nền hay không. Tôi đã đăng một câu trả lời về việc liệu bạn có cần đặt khả năng chế độ nền đơn giản cho các thông báo đẩy (spoiler, thì không).
mobob

30

Bạn cũng có thể chỉnh sửa info.plist cần thiết (Open As -> Source Code) và dán:

<dict>
<key>UIBackgroundModes</key>
    <array>
        <string>remote-notification</string>
    </array>

7
Nó bây giờ đã tự động thêm bởi Xcode khi kiểm tra thông báo từ xa trong chế độ nền
Vinoth Vino

1
Không dành cho tôi: Phiên bản 11.4.1 (11E503a)
paiego

4

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.


3

Nó đã xảy ra với tôi ngay cả sau khi đặt chế độ nền thông báo từ xa trong khả năng. Vấn đề là tôi có ba mục tiêu, một cho sản xuất, một cho qa và một cho dàn dựng. Tôi đã phải đặt thông báo từ xa ở cả ba mục tiêu và điều đó đã khắc phục được cảnh báo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.