2013-06-17 6 views
18

Einige Hintergrund

Ich arbeite auf einem iOS-App aufrufen, wo wir den Zustand der Anwendung zu erhalten möchten.
Bevor diese App herauskommt, ist iOS 7 wahrscheinlich veröffentlicht worden oder wird bald veröffentlicht und die Mehrheit scheint sich von iOS 5 entfernt zu haben. Wir haben uns daher entschlossen, für iOS 6 und höher zu entwickeln.manuell Zustand Erhaltung in iOS 6 und weiter

In iOS 6 gibt es einige wirklich nette Funktionen zur Erhaltung des Zustands. Geben Sie einfach alle Ansichten in der Storyboard eindeutigen IDs und implementieren diese beiden Funktionen in der „AppDelegate“:

- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder; 
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder; 

iOS wird dann „automatisch“ die Erhaltung der Navigation Geschichte des App. Die Methoden:

- (void)encodeRestorableStateWithCoder:(NSCoder*)coder; 
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder; 

kann dann zum Speichern und Abrufen von Daten verwendet werden.
Keine Probleme da funktioniert es ohne Probleme. Die Methoden, die den Status speichern, werden jedoch nur ausgelöst, wenn die App in den Hintergrund tritt.

Nehmen wir an, wir haben einen NavigationController mit vier ViewControllern: A, B, C und D. Der Benutzer navigiert von A nach B, in B wechselt er zu Safari, um etwas zu googeln. Der Anwendungsstatus wird in B gespeichert. Der Benutzer wechselt dann zurück zur App und navigiert zu C und dann zu D. In D findet die App leider eine Ausnahme und geht aus. Wenn der Benutzer die App neu startet, versucht iOS, den gespeicherten Status wiederherzustellen. Dieser Zustand wurde jedoch in B gespeichert. Das heißt, wenn die App startet, beginnt sie nicht von Anfang an, nicht dort, wo der Benutzer sie verlassen hat (D) und nicht einmal in der vorherigen Ansicht (C), sondern in B.

Eine mögliche Lösung

Das obige Szenario könnte vermieden werden, wenn die App seinen Zustand bei jeder neuen Ansicht gespeichert. Allerdings gibt es (soweit ich weiß) keine öffentlichen Methoden, um den Zustandserhaltungsprozess auszulösen. Ich habe den Aufrufstapel während des Debuggens untersucht und herausgefunden, dass IOS die folgende Methode auf dem UIApplication Objekt in IOS ruft 6:

_saveApplicationPreservationState: 

und die folgende Methode in IOS 7:

_saveApplicationPreservationState:viewController:sessionIdentifier:beginHandler:completionHandler: 

gibt auch scheint eine andere Methode zu sein, die eine der oben in Abhängigkeit von der iOS-Version ruft:

_saveApplicationPreservationStateIfSupported 

Durch diese Methode wie folgt aufrufen:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(_saveApplicationPreservationStateIfSupported)]) 
     [[UIApplication sharedApplication] performSelector:@selector(_saveApplicationPreservationStateIfSupported)]; 

Ich kann sehen, dass die erwarteten Methoden aufgerufen werden.

Die eigentliche Frage

Wenn ich mit der obigen Lösung könnte das bekommen meine App aus dem App Store abgelehnt gehen würde? Ich meine technisch ist es keine private Methode, es ist nur nicht ausgesetzt. Durch das Umbrechen des Aufrufs in "answerToSelector" stürzt die App nicht ab, wenn die APIs geändert werden. Der Status wird nicht so oft gespeichert. Aber wenn die App abgelehnt werden könnte, ist das keine Option. Oder gibt es eine andere Möglichkeit, den Statuserhaltungsprozess als den oben beschriebenen manuell aufzurufen? Ich wäre nett, in der Lage zu sein, die integrierte Funktionalität zu verwenden, anstatt eine benutzerdefinierte Lösung zu erstellen, die den Status in NSUserDefaults speichert.

+6

Die Tatsache, dass diese Methoden mit einem führenden Unterstrich benannt sind, sollte für Sie als ** starker ** Hinweis gelten, dass sie nicht Teil einer öffentlichen API sind und daher wahrscheinlich zur App Store-Ablehnung führen. –

+0

+1, das ist eine gute Frage und ich würde gerne die Antwort auch wissen. Ich denke aber, dass John recht hat, über diese Methoden, ziemlich skizzenhaft. – John

+0

Ich bin auch sehr daran interessiert. Meine nächste Vermutung ist, dass wir alle Methoden implementieren sollten, um den Status für App Launch/Quit (den normalen eingebauten Ansatz) beizubehalten, aber auch unsere eigenen Maschinen zum Bewahren/Wiederherstellen des Zustands während der Laufzeit-Zustandsänderungen zu erstellen - hoffentlich wiederverwenden so viel von dem anderen Implementierungscode wie möglich. Ich denke, dass wir die Wiederherstellungs-IDs und ähnliche Enkodierungs-/Dekodierungsmethoden mit NSUserDefaults wiederverwenden können. –

Antwort

1

Event wenn die Frage schon 2 Jahre alt ist, werde ich mein Glück versuchen. Übrigens, wahrscheinlich hast du es schon gelöst.

Sie werden mit Sicherheit abgelehnt werden. Sie scannen den Quellcode nach Methoden, die Sie anrufen. Ich hatte das mehrmals, als ich die UDID-Methoden benutzte. Hoffe es hat geholfen.

+1

Ja, das habe ich gemerkt. Also habe ich stattdessen meine eigene Staatserhaltung aufgebaut. Eigentlich wollte ich meine Frage aktualisieren oder beantworten, aber es ist mir entfallen. Kurz gesagt, ich habe einen Mechanismus, der die Navigationsstacks und den Status für meine Controller in NSUserDefualts speichert. Ich trigge diesen Code immer dann aus, wenn der Benutzer zu einer anderen Ansicht navigiert und die App verlässt. –