İOS 11'de uygulamaya teslim edilmeyen sessiz itmeler


168

İOS 11 beta 2'de, application:didReceiveRemoteNotification:fetchCompletionHandleruygulamanın ne olursa olsun (arka plan / ön plan) sessiz bildirimlerin teslim edilmediğini fark ettim .

UIApplicationDelegeteYöntemi uyguladım application:didReceiveRemoteNotification:fetchCompletionHandlerve aşağıdaki sessiz push'u gönderdim

{  
  "aps": {  
    "content-available": 1  
  },  
  "mydata": {  
    "foo": "bar"  
  }  
} 

ancak temsilci yöntemi iOS 11'de çağrılmaz.

İOS'un diğer sürümlerinde ve Sessiz Bildirimi Yapılandırma dokümantasyon bölümünde iyi çalışır, başka bir şey yapılması gerektiğini belirtmez.

Bu iOS 11'de bir hata mı yoksa iOS 11'de yeni bir şey mi kaçırdım?

UserNotificationSessiz itme göndermek için gerekli olmayan çerçeveden bahsetmediğimi veya kullanmadığımı lütfen unutmayın .

İşte sorunu gösteren örnek bir proje (kendi paket kimliğinizi ayarlamanız gerekecek)

Örnek projeyi öğle yemeğine eklediğinizde ve uygulamaya yukarıdaki yükü gönderdiğinizde, itme işleminin cihaza doğru bir şekilde teslim edildiğini ancak uygulamaya değil teslim edildiğini görmek için macOS konsolunu kullanabilirsiniz.

GÜNCELLEME 10.08

Davranışın rastgele olduğu anlaşılıyor. Bazen cihazı yeniden başlattıktan sonra, yük doğru bir şekilde teslim edilir, ancak bir süre sonra çalışmayı durdurur.

Aşağıdaki ekran görüntüsünde görebileceğiniz gibi, 1 olarak işaretlenen itme yalnızca cihaza teslim edilir ve itme 2 (cihaz yeniden başlatıldıktan sonra) da uygulamaya teslim edilir.

resim açıklamasını buraya girin

14.08 GÜNCELLEME - iOS 11 Beta 6

Hala aynı davranış. Çalışması gereken ama yapmayan bir başka şey de şudur. Uygulamanın şeması "Yürütülebilir dosyanın başlatılmasını bekle" olarak ayarlandığında, sessiz bir uygulamanın uygulamayı uyandırması ve arka planda başlatması gerekir.

resim açıklamasını buraya girin

GÜNCELLEME 21.08 - iOS 11 Beta 7

Yine aynı davranış ve hata raporunda Apple güncellemeleri değil.

GÜNCELLEME 29.08 - iOS 11 Beta 8

Yine de aynı sorun. Şimdi kullandığım çoğaltma adımları şunlardır:

  • Xcode proje şemasında, "Yürütülebilir dosyanın başlatılmasını bekleyin" seçeneğini belirleyin.
  • Bir kesme noktası ekleyin didReceiveRemoteNotification: fetchCompletionHandler
  • Uygulamayı cihazda başlat
  • Yukarıdaki sessiz push'u gönder

Beklenen : Uygulama askıya alınmış durumdan arka plana getirilir ve didReceiveRemoteNotification: fetchCompletionHandlerdenir

Gerçek : hiçbir şey olmuyor

GÜNCELLEME 06.09 - iOS 11 Beta 10

Hala aynı arabası davranışına sahibim. Apple'ın bileti aşağıdaki cevapla güncellendi:

Apple Geliştirici İlişkileri 6 Eylül 2017, 22:42 Mühendislik, bu sorunla ilgili aşağıdaki geri bildirimleri sağlamıştır:

Örnek uygulamayı çalıştırmayı ve davranışı test etmeyi başardık. Bunu açıklandığı gibi test ettiğimizde hiçbir sorun görmedik.

İtme işlemlerinin arka planda çalışırken uygulamaya ulaşması garanti edilmez ve buradaki günlükler, uygulamanın uygulamayı başlatmak için yeterince kullanıldığına inanmadığımızı gösterir.

Koşulların iyi olduğu zamanlarda zaman zaman baskılar yaptığımızı görüyoruz.

Bunun doğru davrandığına inanıyoruz.

Güncelleme 11.09

Apple hata raporum kapatıldı ve yinelenenleri 33278611açık olarak işaretlendi

GÜNCELLEME 13.09 - iOS 11 GM

Kam800'ün yorumları sayesinde (aşağıya bakınız) daha fazla test yaptım ve bu gözlemleri buldum:

İOS 11'de dasd DuetActivitySchedulerDaemonveri aktarımını tamamen ortadan kaldıran veya veri aktarımı dağıtımını geciktiren yeni bir arka plan programı var gibi görünüyor :

Teslimat ertelendi

Konsol Günlükleri

default 13:11:47.177547 +0200   dasd    DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>!   lifecycle   com.apple.duetactivityscheduler
default 13:11:47.178186 +0200   dasd    DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private>   default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200   dasd    DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017   default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200   dasd    DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>)  scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200   dasd    DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private>  default com.apple.duetactivityscheduler

Ertelenen teslimat sorunları

  • Veri aktarımı teslimi ertelendiğinde ve uygulama başlatıldığında, veri aktarımı yalnızca ileride birkaç dakika olabilen teslim tarihine ulaşıldığında teslim edilir . Bu, yeni uygulamanın içeriğini bir sonraki lansman için hazır tutmak için veri itme amacını tamamen ortadan kaldırır. Burada Apple'ın belgelerini bir kez daha teklif ediyorum:

"Sessiz bildirimler, uygulamanızı çalışmadığında bile güncel tutmanıza yardımcı olarak kullanıcı deneyimini geliştirir."

  • Ne zaman iki veri iter bir askıya alınmış uygulama gönderilir onlar iOS 11 yerine doğrudan uygulama uyanma tarafından ertelendi. Teslim süresine ulaşıldığında, yalnızca son veri aktarımı gerçekleştirilir! Önceki itmeler kaybedilir ve veri kaybı ile sonuçlanan temsilci yöntemi aracılığıyla iletilmez.

Teslimat iptal edildi

Konsol Günlükleri

default 13:35:05.347078 +0200   dasd    DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
 ], FinalDecision: Must Not Proceed}    scoring com.apple.duetactivityscheduler

İptal edilen teslimat sorunları

Bu durumda, veri aktarımı tamamen kaybolur ve iOS 10'da doğru şekilde teslim edilirken asla iOS 11'de yayınlanmaz.

GÜNCELLEME 19.09 - iOS 11 GM

Ayrıca, uygulama ön planda olduğunda ve uygulamaya bildirilmediğinde, konsolda aşağıdaki günlükleri gördüğümü fark ettim:

default 08:28:49.354824 +0200   apsd    apsd    <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO   courier-oversized   com.apple.apsd

fault   08:33:18.128209 +0200   dasd    Foundation  <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
    NSArray,
    NSData,
    NSString,
    NSNumber,
    NSDictionary,
    NSUUID,
    _DASActivity,
    NSSet,
    _DASFileProtection,
    NSDate,
    NWParameters,
    NWEndpoint
)}'.    general com.apple.foundation.xpc

1
yine de Beta 8'de düzeltilmemiş, konsola baktığımda şu hatayı görüyorum: <NSXPCConnection: 0x123f43620> pid 58'den bağlantı: Gelen iletinin kodunun çözülmesi sırasında alınan kural dışı durum yakalandı. İstisna: Bağımsız değişken 0 kod çözülürken istisna (çağırma # 2): İstisna: 'NS.objects' anahtarının değeri, beklenmeyen 'NSNull' sınıfıydı. İzin verilen sınıflar '{(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'.
Thomas Einwaller

2
İOS 11 ile aynı sonucu alıyorum (daha önce değil), push ile gönderirsem "content-available": 1ve uygulama ön plandaysa, geri arama tetiklenmez.
Goros

4
Yeni iOS11.1 beta 1 ile test ettikten sonra, bunun şimdi düzeltildiği ve iOS 10'da olduğu gibi çalıştığı görülüyor
Lee

3
Whatsapp benzer bir konu olmuş görünmektedir whatsappen.com/news/5465/... çoğu geliştirici olduğunu "alışkanlıkla yakın şekilde uygulama zorlamak" olduğunu kullanıcılar hakkında bir şey ...
toxaq

3
11.1. Sessiz itmeler kullanıyorsanız ve uygulamanız ön plandaysa, cihaz bir güç kaynağına bağlı olsa bile, bunların birkaç şeye bağlı olarak teslim edilmesini beklemeyin.
Gruntcakes

Yanıtlar:


31

Yani iOS 11.1 beta 1'in sürüm notları

iOS 11.1 beta 1 piyasaya sürüldü ve şöyle diyorlar: "Bildirimler Çözüldü Sorunlar • Sessiz push bildirimleri daha sık işleniyor. (33278611)

Bazı testler yaptım ve gerçekten düzeltilmiş gibi görünüyor:

Askıya Alınan Devlet

Uygulamayı askıya alınmış bir modda başlattığımda ve sessiz bir push gönderdiğimde, uygulama arka plana geri getirilir ve didReceiveRemoteNotification:fetchCompletionHandlertemsilci çağrılır.

Ön Plan Durumu

Aynı şekilde, uygulama ön planda olduğunda ve sessiz bir push gönderildiğinde, temsilci beklendiği gibi çağrılır. Bu rastgele oldu değil daha test ettikten sonra bu doğrular böylece önceki iOS 11 versiyonları çalışan.


3
İlk testlerimde bunun düzeltildiğini düşündüm. Bir süre çalıştı. Ancak bazı ağır testlerden sonra, işler bir rol oynamaya başladı. Aniden, uygulama ön planda olsa bile, her sessiz baskı için delege çağırmayı bıraktı. Görünüşe göre, bu yeni "düet" sistemi benim app "enerjiBudget" eksikliği nedeniyle çağrı almak delege engelliyor. Yani, ne yazık ki, hala sabit değil.
Abras

unbelievable :(
Thomas Einwaller

Deneyimlerim yukarıdaki Abras ile aynı. Bir süre
Lee

Daha fazla testten sonra cihazın tekrar bildirim almasını sağlamanın bir yolunu buldum. Güce bağlayın. Cihazı güce bağlar bağlamaz, tüm Uzaktan Bildirimleri tekrar almaya başlar. Bağlantıyı keserseniz, durur. Tüm testlerimde uygulama ön planda olduğu için bu bir anlam ifade etmiyor. Ayrıca, ön planlı uygulamaların Uzaktan Bildirim alması garanti edilir.
Abras

benim için, hücresel bir bağlantıda bile bir güce bağlanmadan bile iyi çalışıyor. Yalnızca cihazı güç tasarrufu moduna ayarladığımda, ön planda olsa bile itme almıyorum. Ama bir şeyi anlarım o
Oca

18

Buraya çarptığım için 2 sentimi buraya eklemek istedim ve Apple'ın bu konuda çoğaltılamayacaklarını söyleyerek birkaç radar kapattığını fark ettim. Bulduğum ilginç bir şey, uygulama hata ayıklayıcıya bağlıyken arka planlanırsa, itmelerin teslim edileceği.

Hata ayıklayıcıyı öldürürsem, telefonumu fişten çıkarır, uygulamayı başlatır ve sessiz itme yükünü gönderirim Uygulamanın uyandırılmadığını görürüm. Konsol günlüğünde, sistemin uygulamamın yükünün teslimini iptal ettiğini görüyorum.

Sorunu yeniden üreten küçük bir örnek uygulama ile bir radar gönderdim. Ayrıca radarda biletimde çalışan kişinin sorunu yeniden oluşturmak için hata ayıklayıcıya bağlı uygulamayı çalıştırmaması gerektiğini de belirtmiştim. Bağlantı şu şekildedir: https://bugreport.apple.com/web/?problemID=34461063

Umarım bu, bu konuda bazı ilerlemelerin yapılmasına neden olacaktır.


2
Rapor için teşekkürler. Btw, Apple hatalarını bağlamak, özel oldukları için burada yardımcı olmayacak ve sadece muhabir ve Apple onları görebiliyor
Jan

Diğer insanların radarlarını takip edebilmemiz için daha fazla insanın openradar.appspot.com'u kullandığını görmek istiyorum
Thomas Einwaller

apple @bill ile ilgili hata raporunuzda güncelleme var
MagicFlow

Apple'dan radarımda herhangi bir güncelleme almadım, ancak iOS 11.1 beta sürümünü yükledik ve sorun çözüldü.
Bill Dunay

Evet, iOS 11.2.6, Herhangi bir çözüm veya güncelleme de aynı sorunla karşı karşıyayız.
Gopik

14

İOS 11'in yeni bir davranışı gibi görünüyor. İOS 11 beta 10, bu sorunla ilgili bazı açıklayıcı günlükler sağlar:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

Görünüşe göre her sessiz basma iOS'a teslim ediliyor, ancak dasd arka plan programı uygulamaya sessiz basmanın sağlanıp sağlamayacağına karar vermek için birkaç politika kullanıyor (örn. Pil seviyesi). Dün gece bir sessiz basmayı başardım, ancak iPhone'um o zaman şarj cihazına bağlandı - muhtemelen BatteryLevelPolicy skoru o tek sessiz basmayı alacak kadar yüksekti.

Apple, bu iOS tarafı davranışı hakkında resmi bilgi vermiyor, sadece sunucu tarafı azaltma hakkında bilgi var:

Sessiz bildirimler, uygulamanızı arka planda uyanık tutmanın bir yolu veya yüksek öncelikli güncellemeler anlamına gelmez. APN'ler sessiz bildirimleri düşük öncelik olarak ele alır ve toplam sayı aşırı hale gelirse iletimlerini tamamen kısıtlayabilir. Gerçek limitler dinamiktir ve koşullara göre değişebilir, ancak saatte birkaç bildirimden fazla göndermemeye çalışın.

Parmaklarımı çapraz tutuyorum bu davranışı değiştirdiler, çünkü bu benim uygulamamı düzeltir :) Öte yandan, bu değişiklik iyidir - iPhone pilinin Android telefonlarından daha uzun ömürlü olmasını sağlayan birçok şeyden biri.


1
Evet, itmeler cihaza gönderilir ancak uygulamaya gönderilmez. Orijinal yazımda bu yazdım. "Sessiz bildirimler, uygulamanızı arka planda uyanık tutmanın bir yolu değildir" bu "bazen" teslim edildiği sürece sorun değildir. En büyük sorun, arka planda olduğunda iOS 11'de sessiz bildirimin hiçbir zaman teslim edilmemesidir. Bu veri itme tüm amacı tamamen yener.
Ocak

Evet, bunu zaten yazdınız, sadece bu yeni itme politikaları hakkında tam bir açıklama yapmak istedim. Apple belgelerinden, push-delivery belirsizliği hakkında zaten uyardıklarını göstermek için alıntı yaptım. Yazdığım gibi: "Dün gece sessiz bir itme almayı başardım" (uygulamada demek istediğim) ve uygulama arka plandaydı. Ama gün içinde - uygulamam hiçbir itme almaz :( Bence Apple, RC versiyonunda bu itme politikalarını gevşetecek. beta sürümleri (örneğin 10.3 anahtarlık kendsil).
kam800

Push alındığında ve uygulama askıya alındığında benzer günlükleri görüyorum. dasd İşlem daha sonra kaydeder default 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017. Sessiz itme o sırada yapılıyor gibi görünüyor.
Ocak

zaten iOS 11 GM ile test yapmaya başladı, hala garip davranışlar görüyor, şöyle günlüğe kaydediliyor com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Thomas Einwaller

1
Ayrıca - bazı saplama bildirimi ile sessiz olmayan push göndererek ve Bildirim Hizmet Uzantısı'nı kullanarak bildirimi doğru içerikle doldurarak uygulamamı çözmeyi başardım.
kam800

9

iOS 11.1 beta sürüm notları şunları içerir: Bildirimler Çözüldü Sorunlar Sessiz push bildirimleri daha sık işlenir. (33278611)


7

iOS 11.1 Beta 2 ayrıca şunları içerir:

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

Sürüm Notları'nda - şimdi test edecek.

GÜNCELLEME - 11.10.2017 - iOS 11.1 Beta 2

Uygulamamızı 2 gün boyunca "gerçek dünya senaryolarında" kullandıktan sonra, iOS'un bu sürümünde gerçek bir gelişme var gibi görünüyor. Bunun düzeltildiğine inanmaya başlıyorum.


1
Farklı senaryoları test ettim: Ön plan ve arka plan durumunda çalışıyordu. Maalesef, uygulama kullanıcı tarafından sonlandırıldıysa çalışmaz. Sonlandırıldıktan sonra, uygulama kullanıcı tarafından tekrar aktif olarak başlatılmadığı sürece cihaz herhangi bir sessiz itme almaz. Aynı şeyi yaşadın mı?
AlexWoe89

şimdi çalışıyor ... yakl. 5 ila 10 dakika sessiz bildirimler beklendiği gibi çalışıyor ... özür dilerim. comment :)
AlexWoe89

1
sessiz itme, kullanıcı uygulamayı sonlandırdığında hiçbir zaman çalışmadı - bkz. developer.apple.com/documentation/uikit/uiapplicationdelegate/… "Ancak, kullanıcı zorla bıraktığında sistem uygulamanızı otomatik olarak başlatmaz."
Thomas Einwaller

1
İOS11.1 beta 3'ün iOS10'daki gibi çalıştığını ve iOS11.1 beta 2'den çok daha iyi çalıştığını görüyorum.
Lee

1
@Olecramoak benim için iOS11.1 beta 4 iOS 10 gibi çalışıyor
AlexWoe89

7

Apple Geliştirici İlişkileri radarıma bir yorum ekledi:

Bu sorunun en son iOS 11.2 beta sürümünde çözüldüğüne inanıyoruz.

Lütfen en son iOS beta sürümüyle test edin. Hâlâ sorun yaşıyorsanız, lütfen hata raporunuzu araştırmamıza yardımcı olabilecek ilgili günlükler veya bilgilerle güncelleyin.

https://developer.apple.com/download/

şu anda iOS 11.2 beta yükleniyor - sessiz itme davranışını test edecek


Bu, iOS 11.1 GM'nin sorunu çözmeyeceği anlamına mı geliyor? :(
Olecramoak

Duymak güzel, iOS11.1'in resmi sürümünü ne zaman bekleyebiliriz?
AlexWoe89

Bizi haberdar edin, şu anda uygulamamı yükleyemiyorum çünkü 11.2 için Xcode mevcut değil. (ve uygulamayı cihazımdan kaldırdım)
Rool Paap

3

İOS 10'a kadar push bildirimleri application:didReceiveRemoteNotification:fetchCompletionHandleralıyordum ve doğru şekilde çağrılıyordum , uygulamamla benzer bir sorun yaşadım.Ancak iOS 11 push bildirimlerine güncellendiğinde çalışmayı durdurdu.

Kodumla ilgili sorun, içerik kullanılabilir: 1 ve mutable-content: 1 push bildirimi yükünde kullanmasına rağmen, Arka Plan Getirme seçeneği açık değildi. Ancak iOS 10'a kadar mükemmel çalışıyor.

Bu iki özelliği de açtığınızdan emin olun.

Arka Plan Getir özelliğini AÇIK konuma getirdikten sonra Şimdi çalışıyor


hayır iOS11 için çalışmaz - uygulamanızı bir kez sonlandırın, ardından uygulamanızı uyandırmayı durdurun. sadece bu konudaki cevapları ve yorumları okuyun
AlexWoe89

2
Sonlandırılmış uygulama için, herhangi bir push bildirimi (sielent veya genel push), uygulama temsilcisindeki yangın delege yöntemini kullanmayacaktır. bu varsayılan davranış. İOS 11.0 için özel bir durum yok.
Sudeep george

3

iOS 11.4.1, Swift 4

Sessiz itmelerle (CloudKit'ten) gelmeyen sorunlar yaşıyordum ve herkesin burada bahsettiği her şeyi denedim. Sonra bir boş ayarı denemeye karar verdi alertBodybenim için CKNotificationInfo()böyle nesneler:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

Bu, push'ların daha yüksek bir önceliğe gönderilmesini sağladı (ancak yine de sessiz pushlardı) ve artık cihaz günlüklerimde push'un göz ardı edildiği hatasını aldım.

Umarım birine yardım eder. :)


CloudKit ile de benim için çalışıyor. AlertBody olmadan, remoteNotifications'ı almak için cihazı takmanız gerekir. Çok garip davranış ...
powertoold

2

Yani bu gerçekten iOS 11'de bir hata ve şimdi iOS 11 beta 3'te düzeltildi. application:didReceiveRemoteNotification:fetchCompletionHandlerHem ön planda hem de arka planda sessiz bir itme alındığında artık doğru olarak çağrılıyor.

GÜNCELLEME

Hayır düzeltilmedi ve iOS beta 3 ve 4'te hala oluyor


1
Aslında öyle değil :( Hala 11 beta 3 iOS oluyor
Jan

1
Apple, hata raporunu da yeniden açtı. Ben size bildiririz
Oca

1
İOS 11 beta 4'te sessiz basmalar almıyorum. Daha da önemlisi, uygulama ön planda değilse, bazen düzenli bildirimler olarak görünürler. Kesinlikle bir şey yukarı!
Ben Dodson

1
Bu yüzden iOS 11 beta 5'i yeni yükledim ve daha iyi görünüyor ve uygulama bir süre için didReceiveRemoteNotification delegesi aracılığıyla ön planda veya arka planda olduğunda sessiz bildirimler dağıtılıyor, sonra ne yaparsam yapalım tekrar çalışmayı durdurdu: aynı davranış?
Ocak

1
eğer test edersen havalı olur, bu da bana başım ağrıyor. Sessiz itmeler, cihazı yeniden başlattıktan sonra rastgele çalışır veya rastgele çalışmaz. Orijinal yazımı örnek bir proje ile güncelledim, böylece hepimiz aynı kullanıyoruz
Jan

2

Geçici çözüm olarak Bir "bildirim" anahtarı ekliyoruz ve değer olarak boş dize içeren bir "başlık" içine ekliyoruz. Bu appDelegate didReceive geri arama uyanmak olduğunu.


1
Bu, Apple'ın hatayı düzeltene kadar, bildirimin uygulamayı uyandırmasına izin vermek için DuetActivitySchedulerDaemon'u almak için bir çözümün yanı sıra benim için işe yaramış gibi görünüyordu.
Joe Benton

Boş bir başlık içeren bir JSON'u iterken, "Uyarı, ses veya rozet olmadan bildirimi yok sayma ..." {{aps ": {" alert ": {" title ":" "}, "content-available": "1"}, "gcm.message_id": "0 ... bb"} Bu JSON yapısı sizin için çalışıyor mu?
Olecramoak

1'i (kullanılabilir içerik değeri) tırnak işaretleri olmadan göndermemelisiniz?
elkorb

Google Firebase Json'u bu şekilde biçimlendirir (“1”) ve her zaman işe yaradı. Sadece dasd saçmalıklı iOS 11 bir sorun yaratıyor. Sizin için çalışan bir Json örneği gönderebilir misiniz?
Olecramoak

Bu yüzden iOS 11.1'de gözlemlediğim şey, cihaz pil ile çalışıyorsa (şarj olmuyorsa) ve düşük enerji modu etkinleştirilmediğinde bile pil seviyesinin% 20'den az olması durumunda sessiz itmelerin iletilmemesidir. Bu kötü. İOS 11'e sessizce basmak hiç de güvenilir değil, neredeyse işe yaramaz.
Olecramoak

1

Bu cevabı yazarken Bill Dunay'ın cevabı ile aynı sorunla karşı karşıyayım .

Benim gereksinimim uygulama ön planda olduğunda ve uygulama arka planda / çalışmadığında hiçbir şey sessiz bildirimler almak oldu. Benim geçici çözümüm buydu. Rozetleri kullanmıyorum, bu yüzden sıfıra ayarlamak benim için bir sorun değil.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

Lütfen "içerik kullanılabilir" kullanmadığımı unutmayın. İOS optimizasyon mantığının bildirim teslimini geciktirme / iptal etme konusunda başlamasına neden olan ayar.


1

Bazı bildirimler için de aynı sorunu alıyorum (sessiz olması gerekmez).

Tüm güncellemeleri ve yanıtları inceledikten sonra yardımcı olabilecek iki güncelleme ekleyebiliyorum:

  • UIApplication.shared.isRegisteredForRemoteNotificationsBir bildirim alırken yönteme erişmenin uygulamanın Xcode'a herhangi bir şey bildirmeden durmasına neden olduğunu buldum . Yönteme erişen bildirimi aldıktan sonra kod çalıştırıp çalıştırmadığınızı kontrol edin. ( isRegisteredForRemoteNotifications kullanıcı arayüzünü semaphore_wait_trap ile kilitliyor ).

    • Ben "title-loc-args" : [3333]3333 tam anlamıyla kabul değil ama bir dize olarak kabul nedeniyle konsolda bir push bildirim ayrıştırma hatası olduğunu keşfettim "title-loc-args" : ["3333"]. Bu, yukarıdaki yönteme eriştikten sonra tüm arabirimimi durdurdu, yalnızca iOS 11'de, iOS 12'de çalışıyor.
  • Ayrıca, aynı kodla, iOS 12.0'da (16A5366a) herhangi bir sorun olmadan çalıştığını öğrendim . Ancak iOS 11'de oluyor.


1

Benim durumumda, sunucu sitesinde iş yapıldıktan sonra ui'yi güncellemek için sessiz bildirimler kullanıldı, bu yüzden uygulamada alakalı olmayan içeriğe sahip olmak eşek için acıydı. Sessiz bildirim için yükümüz başlık ve gövde bile içerdiğinden, şarj / değil Arka Plan Uygulama Yenileme kapalı ve hatta Düşük Güç durumunda çalışma bildirimlerini almak için bu yöntemleri uygularım.

Bu çalışmayı sağlamak için temsilci eklerim ve her zaman doğru yük ile tetiklenen UNUserNotificationCenterDelegateprotokol ve willPresent notification(iOS 10+) yöntemiyle uzantı oluştururum . Uygulama etkinken bildirim göstermemek için rozet veya sesle tamamlamayı arayın. Sonunda böyle bir şey buldum

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

Ve uygulama arka planda ve sessiz bildirim olduğunda bu durumları çalışmaya başlamak için yöntemlerimi çağırmazsınız Ben doğrudan bildirim merkezinden bildirim almak applicationDidBecomeActive:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

Benim durumumda, iPhone ayarlarında "Arka Planda Uygulama Yenileme" özelliği kapatıldı. Bu push bildirimi nedeniyle cihaza teslim edildi ama app değil. Arkaplan Uygulamasını Yenile özelliğini açma, uygulamadaki sessiz itmeyi alır.

Herhangi birinin kontrol etmesi gerektiğinde, bu sorunun asıl cevabı olmayabilir.

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.