Uygulama arka planda olduğunda iOS 13.3'te didReceiveRemoteNotification çağrılmadı


10

Kafamı vuruyorum. Push bildirimi uyguluyorum. Her şey iyi çalışıyor (push alındı, rozet güncellendi), ancak iOS 13.3 altında, uygulama arka planda olduğunda uygulama uygulaması (_: didReceiveRemoteNotification: fetchCompletionHandler :) çağrılmaz. Uygulama ön plandaysa veya bir iOS 12 cihazı kullanılıyorsa yöntem çağrılır. Push bildirimi için şu şekilde kayıt oluyorum:

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

Yük kapasitesi aşağıdaki gibi ayarlanmıştır

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

"Uzaktan bildirimler" ve "Arka plan işleme" özelliklerini tüm varyasyonlarda (yalnızca "Uzaktan bildirimler" / "Arka plan işleme", bu özelliklerin hiçbiri olmadan, her ikisini de etkinleştirmeden) eklemeyi denedim. UNUserNotificationCenter temsilcisini ayarladım ama yine başarılı olamadım. Başlıkları buna göre ayarladım:

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

Dokümanlar'dan, uygulama arka planda olsa bile bu yöntemin çağrıldığını belirtir:

Uygulamanız için gelen uzak bildirimleri işlemek üzere bu yöntemi kullanın. Yalnızca uygulamanız ön planda çalışırken çağrılan uygulama: didReceiveRemoteNotification: yönteminin aksine, uygulamanız ön planda veya arka planda çalışırken sistem bu yöntemi çağırır.

İOS 13 için burada ne eksik?


Bu yöntemi kullanıp kullanmadığınızı kontrol edin: developer.apple.com/documentation/uikit/uiapplicationdelegate/…

1
Lütfen yukarıya bakın: Her şey iyi çalışıyor (push alındı, rozet güncellendi), ancak iOS 13.3'te uygulama arka planda olduğunda uygulama uygulaması (_: didReceiveRemoteNotification: fetchCompletionHandler :) çağrılmaz.
MartinW1985

Bildirim başlığına dokunduğunuzda (_: didReceiveRemoteNotification: fetchCompletionHandler :) çağrılır

Evet bu doğru. Benim sorum: Uygulama arka planda olduğunda neden çağrılmaz. Anladığım kadarıyla, dokümanlar bunu söylüyor.
MartinW1985

application(_:didReceiveRemoteNotification:withCompletionHandler:)Yöntemi uygulayarak denediniz mi?
HardikS

Yanıtlar:


2

Ayarladın mı

"content-available": 1

APS yükünü arka uçta mı?

Ayrıca iOS Uygulamanızın info.plist dosyasında arka plan modunu etkinleştirdiğinizden emin olun.

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

@matt, tüm cevapları yazmadan önce yanlışlıkla yanlışlıkla gönderildi. Şimdi uygulama tarafı değişikliği ile tamamlandı.
Zhang Zhan

1
Evet yaptım. İlk yazımda CURL isteğimi görebilirsiniz. Ayrıca "content-available": 1 ekledim ve tüm arka plan modlarını (etkin, devre dışı, varyasyonlar) denedim ama yine de uygulama (_: didReceiveRemoteNotification: fetchCompletionHandler :) çağrılmıyor. Yalnızca uygulama etkinse.
MartinW1985

<string> işleme </string> => bu önemli hat
Dong Mai

@ZhangZhan: Bu sorunu hiç çözdünüz mü? İçerik kullanılabilir anahtar doğru ayarlandığında bile sessiz / arka plan bildirimlerinin alınmadığı aynı sorunla karşılaşıyorum. İOS 12'de her şey düzgün çalışıyor, ancak iOS13'te yalnızca sesli / görsel bildirimler çalışıyor. Apple'ın bildirime dahil edilmesi için yeni bir başlık türü gerektirdiğinin farkındayım, ancak bu zaten ele alındı ​​(SNS kullanıyoruz). İlginçtir, bu simülatörde en son XCode sürümüne sahip apns dosyası ile çalışmıyor.
whawhat

2

Bu soruna cevap almak için bir destek bileti harcıyorum.

Bu konudaki belgelerin iOS 13 için% 100 "geçerli" olmadığı anlaşılıyor. Cihaz uyanıp uyanmayacağınıza karar verir. Belgelerin biraz farklı olmasına rağmen.

Apple'ın bildirim uzantısı olarak tercih edilen uygulama şekli. Bundan sonra, yükü "değişebilir içerik" içerecek şekilde uyarlamanız gerekir.

Daha sonra desteğe bir radar dosyalamam gerekip gerekmediğini sordum.


Bir bildirim uzantısı sağlarsanız uygulama uyandırılır mı?
Peter Lapisu

0

Uygulamak didRegisterForRemoteNotificationsWithDeviceTokenda ve didFailToRegisterForRemoteNotificationsWithErrorcihaz Apple'ın APN sunucusu ile iyi bir bağlantı yapar olmadığını kontrol etmek için uygulamanızın temsilci. Aksi takdirde, cihazı yeniden başlatın ve / veya başka bir Wi-Fi ağı üzerinden bağlantı kurmayı deneyin ve uygulamayı yeniden başlatın.


0

Bu temsilci yöntemi: -

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

iOS 13 için bildirimi tıkladığımızda çağrılıyor ve uygulama arka planda.


1
Evet, ancak bildirime tıklamadan yükü almanın bir yolunu arıyordum.
MartinW1985

0

Bir Bildirim İçeriği Uzantısı uygulamanız gerekiyor

OneSignal'ı kullandığım ve kurulum kodu olduğu için, bu benim için iyi çalıştı https://documentation.onesignal.com/docs/ios-sdk-setup

OneSignal bitlerinin bir fark yaratıp yaratmadığından emin değilim, ancak yine de ekleme

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.