didReceiveRemoteNotification không được gọi trong iOS 13.3 khi ứng dụng ở chế độ nền


10

Tôi đang đập đầu mình. Tôi đang thực hiện thông báo đẩy. Mọi thứ đều hoạt động tốt (nhận được đẩy, huy hiệu được cập nhật) nhưng trong iOS 13.3, ứng dụng phương thức (_: didReceiveRemoteNotification: fetchCompletionHandler :) không được gọi khi ứng dụng ở chế độ nền. Nếu ứng dụng ở phía trước hoặc sử dụng thiết bị iOS 12, phương thức được gọi. Tôi đăng ký thông báo đẩy theo cách sau:

[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        });
    }
}];

Tải trọng được đặt thành như sau

{"aps": {
    "badge": 10,
    "alert": "test",
    "content-available": 1
}}

Tôi đã thử thêm "Thông báo từ xa" và "Xử lý nền" làm khả năng của ứng dụng trong tất cả các biến thể (chỉ "Thông báo từ xa" / "Xử lý nền", không có bất kỳ khả năng nào trong số đó, cho phép cả hai) mà không thay đổi. Tôi đặt đại biểu cho UNUserNotificationCenter nhưng một lần nữa không thành công. Tôi đặt tiêu đề cho phù hợp:

curl -v \
 -H 'apns-priority: 4' \
 -H 'apns-topic: xx.xxxxx.xxxx' \
 -H 'apns-push-type: alert' \
 -H 'Content-Type: application/json; charset=utf-8' \
 -d '{"aps": {"badge": 10,"alert": "test", "content-available":1}}' \
 --http2 \
 --cert pushcert.pem \
 https://api.sandbox.push.apple.com/3/device/1234567890

Từ các tài liệu, nó nói rằng phương thức này được gọi ngay cả khi ứng dụng ở chế độ nền:

Sử dụng phương pháp này để xử lý các thông báo từ xa đến cho ứng dụng của bạn. Không giống như phương thức: 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.

Tôi còn thiếu gì ở đây cho iOS 13?


Kiểm tra xem bạn có đang sử dụng phương pháp này không: developer.apple.com/documentation/uikit/uiapplicationdelegate/

1
Vui lòng xem ở trên: Mọi thứ đều hoạt động tốt (nhận được đẩy, huy hiệu được cập nhật) nhưng trong iOS 13.3, ứng dụng phương thức (_: didReceiveRemoteNotification: fetchCompletionHandler :) không được gọi khi ứng dụng ở chế độ nền.
MartinW1985

ứng dụng (_: didReceiveRemoteNotification: fetchCompletionHandler :) sẽ được gọi khi bạn nhấn vào biểu ngữ thông báo

Vâng cái này đúng rồi. Câu hỏi của tôi là: Tại sao nó không được gọi khi ứng dụng ở chế độ nền. Từ sự hiểu biết của tôi, các tài liệu nói như vậy.
MartinW1985

Bạn đã thử bằng application(_:didReceiveRemoteNotification:withCompletionHandler:)phương pháp thực hiện chưa?
HardikS

Câu trả lời:


2

Bạn đã đặt

"content-available": 1

trong bạn phụ tải APS?

Ngoài ra, cần đảm bảo rằng bạn đã bật chế độ nền trong tệp thông tin.plist của Ứng dụng iOS

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

@matt bài đăng đã vô tình được gửi trước khi tôi gõ tất cả các câu trả lời. Bây giờ nó được hoàn thành với sự thay đổi bên ứng dụng.
Zhang Zhan

1
Vâng, tôi đã làm. Bạn có thể thấy từ yêu cầu CURL của tôi trong bài viết ban đầu của tôi. Tôi cũng đã thêm "nội dung khả dụng": 1 và đã thử tất cả các chế độ nền (đã bật, tắt, biến thể) nhưng vẫn ứng dụng (_: didReceiveRemoteNotification: fetchCompletionHandler :) không được gọi. Chỉ khi ứng dụng được kích hoạt.
MartinW1985

<chuỗi> xử lý </ chuỗi> => đây là dòng nhập khẩu
Đông Mai

@ZhangZhan: Bạn đã bao giờ giải quyết vấn đề này chưa? Tôi đang gặp vấn đề tương tự khi không nhận được thông báo im lặng / nền ngay cả khi khóa có sẵn nội dung được đặt chính xác. Trên iOS 12, mọi thứ đều hoạt động bình thường nhưng trên iOS13, chỉ có các thông báo bằng âm thanh / hình ảnh đang hoạt động. Tôi biết rằng apple yêu cầu loại tiêu đề mới được đưa vào thông báo nhưng đã được xử lý (chúng tôi đang sử dụng SNS). Thật thú vị, điều này không hoạt động trong trình giả lập với tệp apns với phiên bản XCode mới nhất.
whawhat

2

Tôi dành một vé hỗ trợ để có câu trả lời cho vấn đề này.

Hóa ra tài liệu này không "hợp lệ" 100% cho iOS 13 về chủ đề này. Thiết bị quyết định có thức dậy hay không. Mặc dù các tài liệu nêu một chút khác nhau.

Cách thức thực hiện ưa thích của Apple như một phần mở rộng thông báo. Sau đó, bạn phải điều chỉnh tải trọng để bao gồm "nội dung có thể thay đổi".

Tôi đã hỏi bộ phận hỗ trợ sau đó nếu tôi nên nộp một radar và họ trả lời "có".


nếu bạn cung cấp tiện ích mở rộng thông báo, ứng dụng có bị đánh thức không?
Peter Lapisu

0

Triển khai didRegisterForRemoteNotificationsWithDeviceTokenvà cũng didFailToRegisterForRemoteNotificationsWithErrortrong đại biểu ứng dụng của bạn, để kiểm tra xem thiết bị có kết nối tốt với máy chủ APN của Apple hay không. Nếu đây không phải là trường hợp, hãy khởi động lại thiết bị và / hoặc thử tạo kết nối qua mạng Wi-Fi khác và khởi động lại ứng dụng.


0

Phương thức đại biểu này: -

(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler

đang được gọi khi chúng tôi nhấp vào thông báo cho iOS 13 và ứng dụng ở chế độ nền.


1
Có, nhưng tôi đang tìm cách để có được trọng tải mà không cần nhấp vào thông báo.
MartinW1985

0

Bạn cần triển khai Tiện ích mở rộng nội dung thông báo

Vì tôi đang sử dụng OneSignal và đó là mã thiết lập, điều này hoạt động tốt với tôi https://documentation.onesignal.com/docs/ios-sdk-setup

không chắc các bit OneSignal có tạo ra sự khác biệt hay không, nhưng dù sao chúng cũng nối thêm chúng

import UserNotifications
import OneSignal

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var receivedRequest: UNNotificationRequest!
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.receivedRequest = request;
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

}
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.