Zauważyłem, że na iOS 11 beta 2 ciche powiadomienia nie są dostarczane application:didReceiveRemoteNotification:fetchCompletionHandler
niezależnie od stanu aplikacji (tło / pierwszy plan).
Zaimplementowałem UIApplicationDelegete
metodę application:didReceiveRemoteNotification:fetchCompletionHandler
i wysyłam następujący cichy przycisk
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
ale metoda delegata nie jest wywoływana w systemie iOS 11.
Działa dobrze na innych wersjach iOS, a sekcja dokumentacji Konfigurowanie cichego powiadomienia nie wspomina, że cokolwiek innego należy zrobić.
Czy to błąd w iOS 11, czy przegapiłem coś nowego w iOS 11?
Zwróć uwagę, że nie mówię o UserNotification
frameworku, który nie powinien być potrzebny do wysyłania cichych pchnięć ani nie używam go .
Oto przykładowy projekt, który ilustruje problem (musisz ustawić własny identyfikator pakietu)
Po uruchomieniu przykładowego projektu i wysłaniu powyższego ładunku do aplikacji możesz użyć konsoli macOS, aby sprawdzić, czy wypychanie jest poprawnie dostarczane do urządzenia, ale nie do aplikacji.
AKTUALIZACJA 10.08.2018
Wygląda na to, że zachowanie jest przypadkowe. Czasami po ponownym uruchomieniu urządzenia ładunek jest dostarczany poprawnie, ale po chwili przestaje działać.
Jak widać na poniższym zrzucie ekranu, push oznaczony jako 1 jest dostarczany tylko do urządzenia, a push 2 (po restarcie urządzenia) jest również dostarczany do aplikacji.
AKTUALIZACJA 14.08 - iOS 11 Beta 6
Wciąż to samo zachowanie. Kolejna rzecz, która powinna działać, ale nie działa, jest następująca. Gdy schemat aplikacji jest ustawiony na „Czekaj na uruchomienie pliku wykonywalnego”, ciche naciśnięcie powinno obudzić aplikację i uruchomić ją w tle.
AKTUALIZACJA 21.08 - iOS 11 Beta 7
Nadal to samo zachowanie, a nie aktualizacje od Apple w raporcie o błędzie.
AKTUALIZACJA 29.08 - iOS 11 Beta 8
Wciąż ten sam problem. Kroki do odtworzenia, których teraz używam, są następujące:
- W schemacie projektu Xcode wybierz „Czekaj na uruchomienie pliku wykonywalnego”
- Dodaj punkt przerwania w
didReceiveRemoteNotification: fetchCompletionHandler
- Uruchom aplikację na urządzeniu
- Wyślij powyższe ciche pchnięcie
Oczekiwano : aplikacja jest przenoszona ze stanu zawieszenia do tła i didReceiveRemoteNotification: fetchCompletionHandler
jest wywoływana
Rzeczywiste : nic się nie dzieje
AKTUALIZACJA 06.09 - iOS 11 Beta 10
Nadal mam takie samo wadliwe zachowanie. Bilet od Apple został zaktualizowany następującą odpowiedzią:
Apple Developer Relations 6 września 2017, 22:42 Inżynierowie przekazali następującą opinię dotyczącą tego problemu:
Udało nam się uruchomić przykładową aplikację i przetestować zachowanie. Nie widzieliśmy żadnych problemów, gdy testowaliśmy to zgodnie z opisem.
Nie ma gwarancji, że wypychanie dotrze do aplikacji, gdy działa w tle, a dzienniki tutaj wskazują, że nie uważamy, że aplikacja jest używana wystarczająco, aby ją uruchomić.
Widzimy, jak od czasu do czasu dostarczamy pchnięcia, gdy warunki są dobre.
Uważamy, że działa to poprawnie.
Aktualizacja 11.09.2018
Mój raport o błędzie Apple został zamknięty i oznaczony jako duplikat, 33278611
który pozostaje otwarty
AKTUALIZACJA 13.09 - iOS 11 GM
Dzięki komentarzom kam800 (patrz poniżej) przeprowadziłem więcej testów i doszedłem do następujących spostrzeżeń:
Wygląda na to, że w iOS 11 pojawił się nowy demon, dasd DuetActivitySchedulerDaemon
który całkowicie odrzuca wypychanie danych lub opóźnia ich dostarczanie:
Dostawa odroczona
Dzienniki konsoli
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
Problemy z opóźnioną dostawą
- Gdy dostarczanie danych w trybie push zostanie odroczone i aplikacja zostanie uruchomiona, wypychanie danych jest dostarczane tylko wtedy, gdy zostanie osiągnięta data dostarczenia, która może nastąpić kilka minut w przyszłości. To całkowicie mija się z celem korzystania z wypychania danych w celu przygotowania zawartości nowej aplikacji do następnego uruchomienia. Cytuję tutaj jeszcze raz dokumentację Apple:
„Ciche powiadomienia poprawiają komfort użytkowania, pomagając w utrzymywaniu aktualności aplikacji, nawet gdy nie jest uruchomiona”.
- Gdy dwa wypychania danych są wysyłane do zawieszonej aplikacji, są one odkładane przez iOS 11 zamiast bezpośrednio budzić aplikację. Kiedy nadejdzie czas dostawy, dostarczane jest tylko ostatnie wypychanie danych! Poprzednie wypychania są tracone i nie są dostarczane za pośrednictwem metody delegata, co powoduje utratę danych.
Dostawa anulowana
Dzienniki konsoli
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
Problemy z anulowaną dostawą
W tym przypadku wypychanie danych jest całkowicie utracone i nigdy nie jest dostarczane na iOS 11, podczas gdy zostało poprawnie dostarczone na iOS 10.
AKTUALIZACJA 19.09 - iOS 11 GM
Zauważyłem też, że gdy aplikacja jest na pierwszym planie, a powiadomienie nie jest dostarczane do aplikacji, w konsoli widzę następujące logi:
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
"content-available": 1
, a aplikacja jest na pierwszym planie, wywołanie zwrotne nie zostanie uruchomione.