जब app पृष्ठभूमि में है, तो 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: विधि, जिसे केवल तभी कहा जाता है जब आपका ऐप अग्रभूमि में चल रहा हो, सिस्टम इस पद्धति को तब कॉल करता है जब आपका ऐप अग्रभूमि या पृष्ठभूमि में चल रहा हो।

आईओएस 13 के लिए मैं यहां क्या याद कर रहा हूं?


जांचें कि क्या आप इस विधि का उपयोग कर रहे हैं: developer.apple.com/documentation/uikit/uiapplicationdelegate/…

1
कृपया ऊपर देखें: सब कुछ ठीक काम कर रहा है (पुश प्राप्त होता है, बैज अपडेट किया जाता है) लेकिन iOS 13.3 के तहत विधि अनुप्रयोग (_: didReceiveRemoteNotification: fetchCompletionHandler :) को तब नहीं बुलाया जाता है जब ऐप पृष्ठभूमि में हो।
मार्टिनडब्लू १

आवेदन (_: didReceiveRemoteNotification: fetchCompletionHandler :) को तब बुलाया जाएगा जब आप सूचना बैनर पर टैप करेंगे

हां यह सही है। मेरा सवाल है: जब ऐप बैकग्राउंड में होता है तो इसे क्यों नहीं कहा जाता। मेरी समझ से डॉक्स ऐसा कहते हैं।
मार्टिनडब्ल्यू १

क्या आपने application(_:didReceiveRemoteNotification:withCompletionHandler:)विधि लागू करके प्रयास किया है ?
हार्दिक

जवाबों:


2

क्या आपने सेट किया है?

"content-available": 1

में आप ए पी एस पेलोड का समर्थन करते हैं?

यह भी सुनिश्चित करने की आवश्यकता है कि आपने अपने iOS ऐप की info.plist फ़ाइल में पृष्ठभूमि मोड सक्षम किया है

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

@ सभी उत्तरों में टाइप करने से पहले गलती से पोस्ट सबमिट कर दी गई थी। अब यह ऐप साइड बदलाव के साथ पूरा हो गया है।
जांग ज़ान

1
हाँ, मैंने किया। आप मेरी प्रारंभिक पोस्ट में मेरे CURL अनुरोध से देख सकते हैं। मैंने "सामग्री-उपलब्ध": 1 भी जोड़ा और सभी पृष्ठभूमि मोड (सक्षम, अक्षम, विविधताएं) की कोशिश की, लेकिन अभी भी अनुप्रयोग (_: didReceiveRemoteNotification: fetchCompletionHandler :) नहीं कहा जा रहा है। अगर ऐप सक्रिय है तभी।
मार्टिन

<string> प्रसंस्करण </ string> => यह महत्वपूर्ण रेखा है
डोंग माई

@ZhangZhan: क्या आपने कभी इस समस्या को हल किया? मैं उसी समस्या में चल रहा हूं जहां सामग्री-उपलब्ध कुंजी सही ढंग से सेट होने पर भी मौन / पृष्ठभूमि सूचनाएं प्राप्त नहीं होती हैं। IOS 12 पर, सब कुछ ठीक से काम करता है लेकिन iOS13 पर, केवल श्रव्य / दृश्य सूचनाएं काम कर रही हैं। मुझे पता है कि सेब को अधिसूचना में शामिल करने के लिए एक नए हेडर प्रकार की आवश्यकता होती है, लेकिन यह पहले से ही संभाला जाता है (हम एसएनएस का उपयोग कर रहे हैं)। दिलचस्प है, यह सिम्युलेटर में काम नहीं कर रहा है जिसमें नवीनतम एक्सकोड संस्करण के साथ एप्स फाइल है।
लहरत

2

मैं इस समस्या का उत्तर पाने के लिए एक समर्थन टिकट खर्च करता हूं।

यह पता चला है कि इस विषय पर iOS 13 के लिए प्रलेखन 100% "वैध" नहीं है। डिवाइस यह तय करता है कि जागना है या नहीं। हालाँकि प्रलेखन थोड़ा अलग है।

अधिसूचना विस्तार के रूप में Apple का पसंदीदा तरीका। उसके बाद, आपको "उत्परिवर्तित-सामग्री" को शामिल करने के लिए पेलोड को अनुकूलित करना होगा।

मैंने समर्थन के बाद पूछा कि क्या मुझे राडार दायर करना चाहिए और उन्होंने "हां" के साथ उत्तर दिया।


यदि आप एक अधिसूचना एक्सटेंशन प्रदान करते हैं, तो क्या ऐप जाग गया है?
पीटर लापिसु

0

लागू करें didRegisterForRemoteNotificationsWithDeviceTokenऔर didFailToRegisterForRemoteNotificationsWithErrorअपने ऐप के प्रतिनिधि में भी, यह जांचने के लिए कि क्या डिवाइस ऐप्पल के एपीएन सर्वर के साथ एक अच्छा संबंध बनाता है। यदि यह मामला नहीं है, तो डिवाइस को पुनरारंभ करें और / या किसी अन्य वाई-फाई नेटवर्क के माध्यम से कनेक्शन बनाने की कोशिश करें और ऐप को पुनरारंभ करें।


0

यह प्रतिनिधि विधि: -

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

जब हम iOS 13 के लिए अधिसूचना पर क्लिक करते हैं और ऐप बैकग्राउंड में होता है, तो इसे लागू किया जा रहा है।


1
हां, लेकिन मैं अधिसूचना को क्लिक किए बिना पेलोड प्राप्त करने का एक तरीका ढूंढ रहा था।
मार्टिनडब्लू १५

0

आपको एक अधिसूचना सामग्री एक्सटेंशन लागू करने की आवश्यकता है

जैसा कि मैं OneSignal का उपयोग कर रहा था और यह सेटअप कोड है, इसने मेरे लिए ठीक काम किया https://documentation.onesignal.com/docs/ios-sdk-setup

यकीन नहीं है कि अगर वनसिग्नल बिट्स में फर्क पड़ता है, लेकिन उन्हें वैसे भी जोड़ दिया जाए

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

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.