iOS UILocalNotification-Aktionsschaltfläche stürzt ab und korrumpiert App-Daten

8

Es wurde ein kleines Update für unsere App veröffentlicht. Diese Version hat auch die App-ID von Apple durch eine eindeutige ID in unsere Team-ID geändert.

Laut Apple , sollte die Verwendung der Team ID nur den Schlüsselbund zurücksetzen, wir verwenden den Schlüsselbund nicht, damit er keine Auswirkungen auf unsere App hat.

Aber seit die Veröffentlichung veröffentlicht wurde, haben einige unserer Nutzer in der Produktion mit der Korruption ihrer App-Daten zu kämpfen. Dies geschieht nur, wenn sie auf eine lokale Benachrichtigung mit einer Aktionsschaltfläche aus der Benachrichtigungszentrale oder dem Sperrbildschirm reagieren. Dies kann bei allen unterstützten iOS-Versionen vorkommen.

Benutzer, die dies erfahren, haben ein anderes Symptom: Sie erhalten zwei lokale Benachrichtigungen statt nur einer, aber die App sieht nur eine Benachrichtigung. Außerdem werden diese Benachrichtigungen nach dem Deaktivieren von Benachrichtigungen und Stornierungen mit [[UIApplication sharedApplication] cancelAllLocalNotifications] nicht gelöscht.

Diese doppelte Benachrichtigung wurde geplant, bevor die App aus dem App Store aktualisiert wurde, aber nach der Update-App hat sie die Kontrolle über sie für einige Benutzer verloren. Dieses Problem wird im Detail beschrieben Frage .

Der größte Hinweis könnte in Absturzberichten von Apple liegen -

%Vor%

Es hat einen Stack genau wie in diese Frage , was geschieht, wenn Benutzer auf eine Push-Benachrichtigung reagieren. Ein Absturz beim Laden der App kann die beschädigten App-Daten erklären.

Wie im Stacktrace zu sehen ist, wird dieser Absturz nicht von unserem Code verursacht, wir haben nichts am Code geändert, er hat lange vor der Änderung der App ID funktioniert und es passiert bei ~ 2% unserer Benutzer.

Hier ist der Code, der die Aktionsschaltflächen von Benachrichtigungen behandelt -

%Vor%

Was verursacht diesen Absturz?

(Ich weiß, dass es in -[UIApplication _runWithMainScene:transitionContext:completion:] + 2928 (UIApplication.m:3299) geworfen wird, die Frage ist, was drin ist, was zum Absturz führt.)

    
Kof 28.10.2015, 06:53
quelle

3 Antworten

4

Es ist möglich, dass diese Ausnahme nicht mit der Reaktion auf eine Benachrichtigung über eine Aktionsschaltfläche in Verbindung steht. Diese Stapelüberwachung weist auf ein Problem beim Laden der App hin, hat jedoch mehrere mögliche Ursachen. Alles, was die App beim Laden zum Absturz bringt, verursacht dies.

Dies kann beispielsweise auftreten, wenn die App geladen wird und für ihr Fenster kein Root-View-Controller zugewiesen ist. Kann auch vorkommen, wenn sie mit addSubview anstelle von setRootViewController hinzugefügt wurde, wie in hier .

Sie müssen mit den Benutzern, die diesen Absturz erlebt haben, bestätigen, was sie getan haben, wenn sie tatsächlich nur auf eine lokale Benachrichtigungs-Aktionsschaltfläche geantwortet haben oder der Absturz beim Öffnen der App aufgetreten ist.

    
gala 04.11.2015, 08:11
quelle
0

Der Grund für die Beschädigung von Daten war die Option "Datenschutz" . Es kann von Xcode oder vom iOS-Entwicklerportal unter Bezeichner - & gt; App-IDs.

Es hat drei Zustände: "Vollständiger Schutz", "Geschützt, außer offen" und "Geschützt bis zur ersten Benutzerauthentifizierung". Solange Daten geschützt sind, kann nicht einmal die App auf die Daten zugreifen.

Wenn beispielsweise "Vollständiger Schutz" wie in unserem Fall ausgewählt wurde und ein Hintergrundprozess wie die Aktionsschaltfläche der Benachrichtigung ausgeführt wird, hat Core Data aufgrund eines Berechtigungsfehlers keinen Zugriff auf die Datenbank.

Ich bin mir immer noch nicht sicher, warum es die Daten korrumpiert hat, manchmal wurde der Fehler "Permission defined" nicht angezeigt, aber die SQLite-Datei konnte immer noch nicht gelesen werden. Vielleicht wurde es auch in die Datei geschrieben, aber da die Verschlüsselung eingeschaltet war, wurde die Datei beschädigt.

Die Lösung besteht darin, entweder "Geschützt bis zur ersten Benutzerauthentifizierung" auszuwählen oder den Datenschutz zu deaktivieren.

Verwandte SO Frage: CoreData Fehler / Ausnahmen, wenn App funktioniert im Hintergrundmodus

Apples iOS-Sicherheit PDF

    
Kof 07.11.2015 18:36
quelle
-1

Diese Zeile verursacht den Absturz:

%Vor%

Wenn sich ein Team für eine App ändert, ändert sich auch die eindeutige App-ID für diese App, da sie Teil davon ist. Lokale Benachrichtigungen verwenden die eindeutige App-ID. Es ist also eigentlich ein Bug von Apple, da iOS die eine Benachrichtigung erkennen sollte, die nicht mehr die entsprechende App hat. Und das ist auch Ihr Absturz, seit Sie gestartet werden, aber Sie bekommen nicht das Objekt, mit dem Sie normalerweise arbeiten würden.

Blind raten, da ich Ihren Code nicht kenne. Wenn Sie auf eine lokale Benachrichtigung reagieren, prüfen Sie, ob das Objekt und alle zugehörigen Daten vorhanden sind, bevor Sie fortfahren. Du weißt, etwas wie:

%Vor%

(viel besser als Ausnahmen imho ...)

Wie für die Benachrichtigung, die Ihnen nicht mehr gehört - die Benutzer können sie selbst löschen. Achte nur darauf, dass du nicht stürzt - nichts zu tun ist in Ordnung. Normalerweise löscht ppl sie irgendwann selbst, dann bereinigen sie ihre Benachrichtigungszentrale.

    
Helge Becker 30.10.2015 07:52
quelle