didReceiveRemoteNotification ไม่ได้เรียกใน iOS 13.3 เมื่อแอปอยู่ในพื้นหลัง


10

ฉันกำลังต่อสู้กับหัวของฉัน ฉันกำลังใช้การแจ้งเตือนแบบพุช ทุกอย่างทำงานได้ดี (ได้รับการผลักดันอัปเดตตราสัญลักษณ์) แต่ภายใต้ iOS 13.3 แอปพลิเคชันวิธีการ (_: didReceiveRemoteNotification: fetchCompletionHandler :) จะไม่ถูกเรียกเมื่อแอปอยู่ในพื้นหลัง หากแอปอยู่เบื้องหน้าหรือใช้อุปกรณ์ iOS 12 จะมีการเรียกใช้เมธอด ฉันลงทะเบียนสำหรับการแจ้งเตือนแบบพุชด้วยวิธีต่อไปนี้:

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

เพย์โหลดถูกตั้งค่าเป็นต่อไปนี้

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

ฉันพยายามเพิ่ม "การแจ้งเตือนระยะไกล" และ "การประมวลผลเบื้องหลัง" เป็นความสามารถของแอพในทุกรูปแบบ (เฉพาะ "การแจ้งเตือนระยะไกล" / "การประมวลผลเบื้องหลัง" โดยไม่มีความสามารถใด ๆ ฉันตั้งผู้แทนสำหรับ UNUserNotificationCenter แต่ไม่ประสบความสำเร็จอีกครั้ง ฉันตั้งค่าส่วนหัวตาม:

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

จากเอกสารระบุว่าวิธีนี้เรียกว่าแม้ว่าแอพจะอยู่ในพื้นหลัง:

ใช้วิธีนี้เพื่อประมวลผลการแจ้งเตือนระยะไกลที่เข้ามาสำหรับแอปของคุณ แตกต่างจากแอปพลิเคชัน: didReceiveRemoteNotification: วิธีการซึ่งเรียกว่าเฉพาะเมื่อแอปของคุณทำงานในเบื้องหน้าระบบจะเรียกวิธีนี้เมื่อแอปของคุณทำงานในเบื้องหน้าหรือพื้นหลัง

ฉันพลาดอะไรที่นี่สำหรับ iOS 13


ตรวจสอบว่าคุณใช้วิธีนี้หรือไม่: developer.apple.com/documentation/uikit/uiapplicationdelegate/?hl=th

1
โปรดดูด้านบน: ทุกอย่างทำงานได้ดี (ได้รับการผลักดันอัปเดตตราสัญลักษณ์) แต่ภายใต้ iOS 13.3 แอปพลิเคชันวิธีการ (_: didReceiveRemoteNotificationNotification: fetchCompletionHandler :) จะไม่ถูกเรียกเมื่อแอปอยู่ในพื้นหลัง
MartinW1985

แอปพลิเคชัน (_: didReceiveRemoteNotification: fetchCompletionHandler :) จะถูกเรียกเมื่อคุณแตะที่แบนเนอร์การแจ้งเตือน

ใช่ถูกต้องแล้ว คำถามของฉันคือทำไมมันไม่ถูกเรียกเมื่อแอพอยู่เบื้องหลัง จากความเข้าใจของฉันเอกสารพูดอย่างนั้น
MartinW1985

คุณได้ลองใช้application(_:didReceiveRemoteNotification:withCompletionHandler:)วิธีการใช้แล้วหรือยัง
HardikS

คำตอบ:


2

คุณได้ตั้งค่าไว้

"content-available": 1

ในแบ็กเอนด์ APS ของคุณบรรจุ?

ต้องตรวจสอบให้แน่ใจว่าคุณได้เปิดใช้งานโหมดพื้นหลังในไฟล์ info.plist ของ iOS App

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

@matt โพสต์ถูกส่งโดยไม่ตั้งใจก่อนที่ฉันจะพิมพ์ในคำตอบทั้งหมด ตอนนี้มันจะเสร็จสมบูรณ์พร้อมกับการเปลี่ยนด้านแอพ
จาง Zhan

1
ใช่ฉันทำ. คุณสามารถดูได้จากคำขอ CURL ของฉันในโพสต์เริ่มต้นของฉัน ฉันยังเพิ่ม "content-available": 1 และลองใช้โหมดพื้นหลังทั้งหมด (เปิดใช้งานปิดใช้งานการเปลี่ยนแปลง) แต่ยังคงแอปพลิเคชัน (_: didReceiveRemoteNotification: fetchCompletionHandler :) จะไม่ถูกเรียก เฉพาะเมื่อแอปทำงานอยู่
MartinW1985

<string> processing </string> => นี่คือสายการนำเข้า
Dong Mai

@ จางฉาง: คุณเคยแก้ปัญหานี้หรือไม่? ฉันกำลังประสบปัญหาเดียวกันกับที่ไม่ได้รับการแจ้งเตือนแบบเงียบ / เบื้องหลังแม้เมื่อตั้งค่าคีย์เนื้อหาที่ใช้ได้อย่างถูกต้อง บน iOS 12 ทุกอย่างทำงานได้อย่างถูกต้อง แต่บน iOS13 เฉพาะการแจ้งเตือนด้วยเสียง / ภาพเท่านั้นที่ทำงานได้ ฉันรู้ว่าแอปเปิ้ลต้องการประเภทส่วนหัวใหม่ที่จะรวมอยู่ในการแจ้งเตือน แต่มันได้รับการจัดการแล้ว (เรากำลังใช้ SNS) น่าสนใจว่านี่ใช้ไม่ได้กับเครื่องมือจำลองด้วยไฟล์ apns ด้วยรุ่น XCode ล่าสุด
สิ่งที่

2

ฉันใช้ตั๋วสนับสนุนเพื่อรับคำตอบปัญหานี้

ปรากฎว่าเอกสารไม่ถูกต้อง 100% สำหรับ iOS 13 ในหัวข้อนี้ อุปกรณ์ตัดสินใจว่าจะตื่นหรือไม่ แม้ว่าเอกสารประกอบจะระบุไว้แตกต่างกันเล็กน้อย

วิธีการนำไปปฏิบัติของ Apple ที่ต้องการเป็นส่วนขยายการแจ้งเตือน หลังจากนั้นคุณต้องปรับเพย์โหลดเพื่อรวม "เนื้อหาที่ไม่แน่นอน"

ฉันถามฝ่ายสนับสนุนในภายหลังว่าฉันควรยื่นเรดาห์หรือไม่และพวกเขาตอบกลับด้วย "ใช่"


หากคุณให้ส่วนขยายการแจ้งเตือนแอพจะปลุกหรือไม่
Peter Lapisu

0

ใช้งานdidRegisterForRemoteNotificationsWithDeviceTokenและdidFailToRegisterForRemoteNotificationsWithErrorในตัวแทนของแอปของคุณเพื่อตรวจสอบว่าอุปกรณ์ทำการเชื่อมต่อที่ดีกับเซิร์ฟเวอร์ APN ของ Apple หรือไม่ หากไม่ใช่กรณีนี้ให้รีสตาร์ทอุปกรณ์และ / หรือลองทำการเชื่อมต่อผ่านเครือข่าย Wi-Fi อื่นแล้วเริ่มต้นแอพใหม่


0

วิธีการมอบสิทธิ์นี้: -

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

กำลังถูกเรียกใช้เมื่อเราคลิกที่การแจ้งเตือนสำหรับ iOS 13 และแอปอยู่ในพื้นหลัง


1
ใช่ แต่ฉันกำลังมองหาวิธีรับน้ำหนักบรรทุกโดยไม่ต้องคลิกการแจ้งเตือน
MartinW1985

0

คุณต้องใช้ส่วนขยายเนื้อหาการแจ้งเตือน

ขณะที่ฉันใช้ OneSignal และเป็นรหัสการตั้งค่าสิ่งนี้ใช้ได้ดีสำหรับฉัน https://documentation.onesignal.com/docs/ios-sdk-setup

ไม่แน่ใจว่าบิต OneSignal สร้างความแตกต่างได้หรือไม่

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.