| 

.NET C# Java Javascript Exception

2
Ich arbeite an einer Webapp für das IPhone. Um das Look'n'Feel der Webapp möglichst nah an eine native Applikation zu bringen, nutze ich die üblichen Dinge: Splashscreen, Icon für den Homescreen, Fullscreen-Mode, ... und eben auch das Web application caching, das mit HTML 5 eingeführt wurde.

Das merkwürdige: Alles funktioniert prinzipiell, nur das Caching macht gelegentlich Probleme. Dies äußert sich in der Form, dass Bilder nicht gecacht werden - manchmal sogar der Splash Screen nicht. An anderen Tagen funktioniert es einwandfrei, ohne eine einzige Änderung am Code oder der Webserverkonfiguration.

Wenn der Zustand eines "kaputten" Caches einmal erreicht ist, hilft nur noch, die Webapp vom Homescreen zu entfernen, sämtliche Caches von Safari zu leeren, und darauf zu hoffen, dass beim nächsten Laden wieder alles okay ist.

Manchmal geht es dann bei einem solchen jungfräulichen Start von Safari direkt schief, manchmal klappt es auch über Tage und Wochen, und dann verliert das IPhone aus heiterem Himmel die Bilder.

Bilder in der Webapp sind deutlich öfter betroffen als der Splashscreen, ganz selten verliert das IPhone auch das CSS.

Ich habe diese Effekte so wohl mit einem iOS 3.1.2 als auch mit einem 4.2.1.

Die Manifest-Datei liegt im Root der Webseite, und sieht folgendermaßen aus, alle Pfade existieren und stimmen von der Groß-/Kleinschreibung her:

CACHE MANIFEST

#Version 38

CACHE:
Images/Icon.png
Images/Logo.png
Images/Splash-Large.png
Images/Splash.png
Scripts/jquery-1.4.2.min.js
Scripts/jquery-ui-1.8.6.min.js
Scripts/Scripts.js
Styles/Base.css
Default.aspx

NETWORK:

FALLBACK:

Die Versionszeile wird nach jeder Änderung hochgezählt.

Außerdem befindet sich in der Web.config folgender Eintrag:
<system.webServer>
<staticContent>
<mimeMap fileExtension=".cache-manifest" mimeType="text/cache-manifest" />
</staticContent>
</system.webServer>

Der MIME-Type wird also korrekt gesetzt und (anscheinend) auch entsprechend ausgeliefert.

Interessant ist die Ausgabe in der Konsole, wenn ich ein Debugging-Script einklinke:
online: yes, event: checking, status: uncached
online: yes, event: error, status: uncached (prolly a syntax error in manifest)

Irgendwas scheint also mit dem Manifest nicht zu stimmen. Das Merkwürdige ist allerdings, dass ich diese Meldung selbst dann bekomme, wenn die Manifest-Datei bis auf die erste Zeile leer ist.

Was ebenfalls seltsam ist: Verfolge ich das Laden der Webseite im Konsolenfenster von Safari, so werden alle Dateien geladen - nur die Cache-Datei nicht. Könnte es also sein, dass diese (aus welchem Grund auch immer) nicht angefordert wird?

Das Manifest ist ins HTML wie folgt eingebunden:
<!DOCTYPE html>

<html manifest="Manifest.cache-manifest">
...
</html>

Kennt jemand diese Effekte, weiß, woher sie kommen, und was man dagegen tun kann (außer immer wieder mal den Browser zurückzusetzen)?

Oder - alternativ - kann mir jemand eine funktionierende (!) Webseite zeigen (im Sinne von funktionierendem Offline-Modus), wo ich mir die Manifest-Datei mal angucken kann?
15.01.2011
Golo Roden 2,7k 3 9
3 Antworten
1
Checke mal, ob Deine Manifest Datei UTF-8 ist bzw. ob ein BOM vorangestellt ist.
Ich persönlich würde kein UTF-8 einsetzen um Implementierungsfehler auf Browserseite zu umgehen bzw. um nicht zu viel von ihnen zu fordern ;)

The cache manifest syntax und dort "Writing cache manifests" definiert das zwar als ziemlich lasch, aber sicher ist sicher.

Also:
- Konsistent LF oder CRLF verwenden
- Konsistent TAB oder SPACE
- Leerzeilen WIRKLICH leer lassen
- Bei generierten Manifest files (durch ASP oder PHP) darauf achten, dass keine Leerzeile am Anfang steht
- Testweise mal GAR KEINE comments und Leerzeilen reinschreiben
- Absolute Pfade angeben anstatt relativ zur Manifest Datei

Halt alles mal probieren und schauen wo/ob es besser wird.
02.02.2011
DaSpors 4,2k 2 8
Also, folgendes habe ich ausprobiert, und jeweils mit einem Hex-Editor kontrolliert:
[list]
[*] UTF-8 mit BOM
[*] US-ASCII
[*] Durchgängig CLRF
[*] Konsistent Leerzeichen statt Tabs
[*] Leerzeilen sind definitiv leer
[*] Keine Leerzeile zu Beginn
[*] So wohl mit als auch ohne Kommentare und Leerzeilen
[*] Absolute, relative Pfade und absolute URLs
[/list]
Macht alles keinen Unterschied :-(
Golo Roden 02.02.2011
0
Ich denke, dass das Problem hier nicht der Cache selbst ist, sondern dass es sich um ein Memory-Problem (also RAM) handelt. Vielleicht kannst du das darauf eingrenzen, wenn du mal das iPhone neu startest, statt den Browser-Cache zu löschen.
01.02.2011
Ingo Dellwig 39 2
Leider nein :-(.

Das Phone hab ich schon zig mal neu gestartet - bringt manchmal etwas, aber nicht immer. Insofern liegt es wohl nicht am RAM.
Golo Roden 01.02.2011
0
Das hört sich für mich nach einem Fehler in der Implementierung des WebApplicationCache im iPhone Browser an. Hast Du schon debug-logs aufgezeichnet, (z.B. hiermit)?

Wie sieht Deine manifest Datei aus und wird der mimetype dafür vom Webserver richtig gesetzt?
02.02.2011
DaSpors 4,2k 2 8
Manifest - siehe oben, ich hab's in der Ursprungsfrage ergänzt.

Logging: Bis jetzt nicht, muss ich mal ausprobieren.
Golo Roden 02.02.2011
So, auch das mit dem Debugging gemacht, siehe oben.
Golo Roden 02.02.2011

Stelle deine Iphone-Frage jetzt!