19.2 Erkennung ohne Skript
 
Die Erkennung des Flash Players kann auch ohne Skriptsprachen wie JavaScript oder VBScript durchgeführt werden. Das hat folgende Vorteile:
|
Der Benutzer benötigt keine speziellen Webbrowser, da die Erkennung plattformübergreifend in fast allen Situationen zuverlässig funktioniert. |
|
Die Erkennung funktioniert unabhängig von den Sicherheitseinstellungen und der Konfiguration des Webbrowsers. |
|
Es ist kein Technologiemix notwendig, da auf andere Technologien außer Flash verzichtet werden kann. |
Macromedia liefert eine ähnliche Erkennung bereits standardmäßig mit Flash MX 2004 aus. Diese erkennt jedoch nur Flash Player ab Version 4 oder höher.
Es gibt aber auch Nachteile, die nicht verschwiegen werden dürfen. Diese Nachteile treten aber normalerweise nur auf, wenn gar kein Flash Player installiert ist, und selbst dann nur in den wenigsten Fällen!
19.2.1 Arbeitsweise
 
Die skriptlose Erkennung verwendet eine Flash-Datei, den so genannten Sniffer (Schnüffler), um den Flash Player zu überprüfen. In mehr als 98 Prozent aller Fälle wird dieser Sniffer laut Macromedia von einem Webbrowser mit installiertem Flash Player aufgerufen. Nur bei den restlichen knapp zwei Prozent stoßen wir mit dieser Erkennung noch auf Schwierigkeiten: Falls es sich dann um den Internet Explorer unter Windows handelt, installiert dieser – soweit »Install on Demand« nicht deaktiviert ist – den aktuellen Flash Player automatisch und spielt dann den Sniffer ab. Auch der Netscape Navigator bietet eine ähnliche Funktion und installiert im Normalfall das aktuellste Plug-in.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 19.1
Arbeitsweise_der_Flash-Erkennung_ohne_Skript
In den wenigen Fällen, in denen nun kein Player vorhanden ist und dieser nicht installiert wird, ruft der Webbrowser über ein Refresh-Tag eine alternative Seite auf. Wenn es sich um keinen Browser der vierten Generation oder neuer handelt, funktioniert der Refresh (Auffrischen) nicht, und die aktuelle Seite bleibt auf dem Bildschirm stehen. Für diesen Fall, der weit weniger als zwei Prozent aller Anwender betrifft, wird eine entsprechende Information wie »Bitte klicken Sie hier …« am Bildschirm angegeben.
Wie schon gesagt, ist ja in den meisten Fällen bereits ein Flash Player vorhanden, und es muss »nur« noch die Version ermittelt werden. Wenn es sich bei dem Browser um den Internet Explorer unter Windows handelt, hat dieser eine an sich sehr nützliche Besonderheit, denn er erkennt die Version des Flash Players automatisch. Diese Erkennung basiert auf der im HTML-Dokument angegebenen Versionsnummer codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0". Falls Sie die automatische Installation des aktuellsten Flash Players vermeiden möchten, dann verwenden Sie stattdessen codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab".
Das komplette HTML-Dokument sollte ungefähr so aussehen:
<HTML>
<HEAD>
<TITLE>Flashdetection</TITLE>
<meta http-equiv="refresh" content="15;URL=noflash.html">
</HEAD>
<BODY>
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.
com/pub/shockwave/cabs/flash/swflash.
cab"
WIDTH=18 HEIGHT=18>
<PARAM NAME=movie VALUE="flashsniffer.swf">
<EMBED src="flashsniffer.swf" WIDTH=18 HEIGHT=18 TYPE=
"application/x-shockwave-flash" PLUGINSPACE="http://www.macromedia.com/go/flashplayer">
</EMBED>
</OBJECT>
</BODY>
</HTML>
 Hier klicken, um das Bild zu Vergrößern
Abbildung 19.2
Zeitleiste des Sniffers
Unabhängig davon, welcher Flash Player letztendlich installiert ist, startet jetzt der Sniffer seine Arbeit. Der Sniffer verwendet spezielle Eigenschaften der verschiedenen Flash Player und ermittelt so die installierte Version. Im ersten Schritt wird auf Flash 7 getestet, dann auf Flash 6, dann auf Flash 5, dann auf Flash 4 mit Druckfunktion (alle Flash Player seit Dezember 1999), dann auf Flash 4, auf Flash 3 und schließlich auf Flash 2.
Im Anschluss an einen einfachen Preloader wird zuallererst einmal die Versionskennung von Flash, soweit vorhanden, in handliche »Happen« zerlegt. Gerade hier waren viele Detections etwas anfällig, da Macromedia die Länge dieser Versionskennung abhängig vom Betriebssystem änderte. Bis zur Einführung dieser Kennung unter Linux gab es nur die Betriebssysteme Windows und Macintosh mit den Kennungen »win« und »mac«. Linux erhielt die Kennung »unix« und brachte so manche Flashdetection aus dem Tritt:
// Die Erkennung von Flash 5 und höher basiert auf der
Versionsvariablen
// Bestimme das Trennzeichen zwischen Betriebssystem und Version
(ein Leerzeichen)
for (delimiter1=-1; substring(eval("$version"), delimiter1, 1) ne
" "; delimiter1++) {
}
// Bestimme das Trennzeichen zwischen Version und Unterversion (ein Komma)
for (delimiter2=delimiter1+1; substring(eval("$version"), delimiter2, 1) ne ","; delimiter2++) {
}
// Bestimme das Trennzeichen zwischen Unterversion und Release (ein Komma)
for (delimiter3=delimiter2+1; substring(eval("$version"), delimiter3, 1) ne ","; delimiter3++) {
}
// Bestimme das Trennzeichen zwischen Release und Build (ein Komma)
for (delimiter4=delimiter3+1; substring(eval("$version"), delimiter4, 1) ne ","; delimiter4++) {
}
version = int(substring(eval("$version"), delimiter1+1,
delimiter2-delimiter1-1));
release = int(substring(eval("$version"), delimiter3+1,
delimiter4-delimiter3-1));
Flash Player 5 oder 6
Im gleichen Bild überprüfen wir, ob es sich um den Flash Player 5 oder 6 handelt. Die Überprüfung findet mit Hilfe der seit Flash 4 vorhandenen Variablen $version statt. Da sich neuere Flash-Dateien in einem Flash Player der Version 2 recht eigenartig verhalten, müssen noch einige Zeilen geschrieben werden. Die URL wird in einer Variablen vor einem Flash 2-Player »versteckt«, und für Flash 2 muss noch ein play hinten angefügt werden, da sonst der Film nicht weiter abspielt und somit die folgenden Überprüfungen auf ältere Flash Player nicht mehr funktionieren.
if (version == 5 and release<=40) {
url = "flash5.html";
getURL(url);
stop();
} else if (version == 5 and release>40) {
url = "flash5xml.html";
getURL(url);
stop();
} else if (version == 6) {
url = "flash6.html";
getURL(url);
stop();
} else if (version>=7) {
url = "flash7.html";
getURL(url);
stop();
} else {
play();
}
In dem Skript wird über eine Kontrollstruktur überprüft, ob (if) der Flash Player 5, 5 mit erweiterter XML-Unterstützung, 6, 7 oder (für die Zukunft) ein neuerer installiert ist. Falls nicht (else), läuft die Anwendung einfach weiter ab und gelangt im nächsten Schlüsselbild zu einer weiteren Überprüfung.
Flash 4 mit Druckfunktion
Das Prüfen auf Flash 4 mit Druckfunktion funktioniert ähnlich. Hier wird aber nur überprüft, ob die Variable $version überhaupt existiert, da sie mit diesem Flash Player das erste Mal eingeführt wurde:
// Erkennung der Druckfunktion basiert auf der $version Variable
($version ist erst mit einem späteren Flash Player 4 eingeführt worden)
url = "flash4print.html";
if (eval("$version") gt "") {
getURL(url);
stop();
} else {
play();
}
Flash 4 Player
Für den Test auf den normalen Flash 4 Player reicht die Aktion if kombiniert mit einem Ausdruck. Dies verstehen weder Flash 2 noch Flash 3.
// Erkennung von Flash 4 basiert auf Ausdrücken (Ausdrücke sind erst mit Flash 4 eingeführt worden)
url = "flash4.html";
if (url gt "") {
getURL(url);
stop();
} else {
play();
}
Flash 3
Die Überprüfung auf Flash 3 benötigt einen Movieclip, da diese in Flash 2 noch nicht existierten und dementsprechend auch nicht abgespielt werden. In diesem Movieclip werden die folgenden Aktionen abgelegt, die unter anderem auch verhindern, dass weitere Überprüfungen durchgeführt werden, falls Flash 3 vorhanden ist.
// Erkennung von Flash 3 basiert auf Movieclips (Movieclips sind erst mit Flash 3 eingeführt worden)
getURL ("flash3.html");
tellTarget ("/") {
stop ();
}
Flash Player 2
Falls bis hierhin keine Überprüfung erfolgreich war, dann muss es sich um den Flash Player der Version 2 handeln, denn sonst würde die Flash-Anwendung überhaupt gar nicht funktionieren.
// Erkennung von Flash 2
// (Es muss Flash 2 sein, denn sonst würde diese Anwendung nicht ablaufen)
getURL("flash2.html");
stop();
Damit der Sniffer zuverlässig funktioniert, wird er im Flash 4-Format veröffentlicht. Aus diesem Grund sind auch nur Aktionen verwendet worden, die es auch schon in Flash 4 gab (falls Sie für den Sniffer beim Veröffentlichen das 5-er-Format wählen, arbeitet er nicht korrekt).
19.2.2 Testen der Flashdetection
 
Um die Flashdetection testen zu können, benötigen Sie zuallererst die alten Flash Player. Diese bietet Macromedia unter http://www.macromedia.com/support/flash/ts/documents/oldplayers.htm für Testzwecke an. Bei dem Plug-in (alle Browser außer dem Internet Explorer unter Windows) sind die Installation und das Entfernen kein Problem.
Flash Player entfernen
Falls Sie den Flash Player komplett aus Ihrem System verbannen möchten, finden Sie diesen im Plug-in-Ordner des Browsers unter den Dateinamen
|
NPSWF32.dll unter Windows |
|
Shockwave-Flash-NP-PPC oder Shockwave-Flash-NP-68 auf Macintosh-Computern |
Durch das Entfernen der Datei beginnen für Sie traurige Zeiten ohne Flash.
Beim Internet Explorer unter Windows ist das nicht ganz so einfach. Bevor Sie einen älteren Flash Player installieren, sollten Sie den vorhandenen Flash Player entfernen. Dazu finden Sie die zugehörige ActiveX-Steuerung swflash.ocx entweder im Ordner C:\Windows\System\Macromed\Flash (Windows 9x und ME) oder im Ordner C:\WinNT\System32\Macromed\Flash (Windows NT, XP oder Windows 2000). Nachdem Sie die ActiveX-Steuerung gefunden haben, können Sie diese über regsvr32 C:\Windows\System\Macromed\Flash\swflash.ocx /u aus Ihrem System deaktivieren (den genauen Pfad zur Datei nicht vergessen). Um das Entfernen wirklich endgültig abzuschließen, müssen Sie jetzt noch alle Vorkommen von swflash.ocx und swflash.inf von Ihrem Computer löschen und dann einen Neustart durchführen.
Automatische Deinstallation
Glücklicherweise hat Macromedia mittlerweile ein kleines Hilfsprogramm bereitgestellt, welches das Deinstallieren übernimmt. Dieses finden Sie kostenlos unter http://www.macromedia.com/support/flash/ts/documents/remove_player.htm.
Flash Plugin Switcher
Unter http://www.kewbee.de/FlashPluginSwitcher/ erhalten Sie den Flash Plugin Switcher. Dieser erlaubt den komfortablen Wechsel zwischen verschiedenen Flash Playern, ohne dass diese jedes Mal installiert und deinstalliert werden müssen.
19.2.3 Erweitern der Flashdetection
 
Die Flashdetection ohne Skript lässt sich auch mit der JavaScript-Methode erweitern, um die Vorteile beider Technologien optimal miteinander zu verbinden. Aber auch ohne JavaScript kann mit dieser Flashdetection noch mehr als nur die Version des installierten Flash Players herausgefunden werden. Mit einem einfachen Trick finden Sie heraus, ob es sich um den Internet Explorer unter Windows oder einen anderen Browser handelt. Da der Internet Explorer mit dem Object-Tag arbeitet, brauchen Sie an dieser Stelle nur einen anderen Flash-Film anzugeben.
Falls der Benutzer einen Flash Player 4 oder neuer installiert hat, können Sie auch mit einer Flash-Anwendung arbeiten, welche die entsprechende Information von außen über das HTML-Dokument erhält. In einer Flash-Anwendung lassen sich direkt über die URL-Angabe Variablen festlegen, was nicht nur in der URL-Zeile des Browsers, sondern auch innerhalb eines HTML-Dokumentes funktioniert:
<HTML>
<HEAD>
<TITLE>erweiterteDetection</TITLE>
</HEAD>
<BODY>
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
WIDTH=100 % HEIGHT=100 %>
<PARAM NAME=movie VALUE="erweiterteDetection.swf?activex=yes">
<EMBED src="erweiterteDetection.swf?activex=no" WIDTH=100
% HEIGHT=100 % TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
</EMBED>
</OBJECT>
</BODY>
</HTML>
Eine weitere Information, die Sie leider erst mit dem Flash Player 4 vom Dezember 1999 oder höher herausfinden können, ist das Betriebssystem und die genaue Versionsnummer des Flash Players ($version und getVersion). In Flash sieht das in ActionScript dann so aus:
// Die Erkennung von Flash 5 und höher basiert auf der Versionsvariablen
// Bestimme das Trennzeichen zwischen Betriebssystem und Version (ein Leerzeichen)
for (delimiter1=-1; substring(eval("$version"), delimiter1, 1) ne
" "; delimiter1++) {
}
// Bestimme das Trennzeichen zwischen Version und Unterversione (ein Komma)
for (delimiter2=delimiter1+1; substring(eval("$version"), delimiter2, 1) ne ","; delimiter2++) {
}
// Bestimme das Trennzeichen zwischen Unterversion und Release (ein Kommar)
for (delimiter3=delimiter2+1; substring(eval("$version"), delimiter3, 1) ne ","; delimiter3++) {
}
// Bestimme das Trennzeichen zwischen Release und Build (ein Komma)
for (delimiter4=delimiter3+1; substring(eval("$version"),
delimiter4, 1) ne ","; delimiter4++) {
}
os = substring(eval("$version"),0, delimiter1-1);
version = int(substring(eval("$version"), delimiter1+1,
delimiter2-delimiter1-1));
subversion = int(substring(eval("$version"),delimiter2+1,
delimiter3-delimiter2-1));
release = int(substring(eval("$version"), delimiter3+1,
delimiter4-delimiter3-1));
capabilities-Objekt
Mit Flash 6 hat Macromedia das capabilities-Objekt eingeführt (System.capabilities). Dieses erlaubt es ebenfalls, Systemeinstellungen zu ermitteln. In Flash 7 hat Macromedia diesem Objekt weitere Eigenschaften hinzugefügt, die in der folgenden Tabelle zusammengefasst sind:
Tabelle 19.2
Systemeinstellungen
Property
|
Description
|
Flash Player
|
System.capabilities.avHardwareDisable
|
Ermittelt, ob der Zugriff auf eine Kamera oder ein Mikrofon möglich ist.
|
7
|
System.capabilities.hasAccessibility
|
Ermittelt, ob der Flash Player mit einem Programm für den barrierefreien Zugang kommunizieren kann.
|
6
|
System.capabilities.hasAudio
|
Ermittelt, ob das System Ton abspielen kann.
|
6
|
System.capabilities.hasAudioEncoder
|
Ermittelt, ob ein Audiostream enkodiert werden kann (z.B. von einem Mikrofon).
|
6
|
System.capabilities.hasEmbeddedVideo
|
Ermittelt, ob es eingebautes Video gibt.
|
6.0.65
|
System.capabilities.hasMP3
|
Ermittelt, ob MP3 dekodiert werden kann.
|
6
|
System.capabilities.hasPrinting
|
Ermittelt, ob gedruckt werden kann.
|
6.0.65
|
System.capabilities.hasScreenBroadcast
|
Ermittelt, ob Bildschirme im Zusammenspiel mit dem Flash Communication Server MX übertragen werden können.
|
6.0.79
|
System.capabilities.hasScreenPlayback
|
Ermittelt, ob Bildschirme im Zusammenspiel mit dem Flash Communication Server MX abgespielt werden können.
|
6.0.79
|
System.capabilities.hasStreamingAudio
|
Ermittelt, ob der Flash Player Audiostreams abspielen kann.
|
6.0.65
|
System.capabilities.hasStreamingVideo
|
Ermittelt, ob der Flash Player Videostreams abspielen kann.
|
6.0.65
|
System.capabilities.hasVideoEncoder
|
Ermittelt, ob ein Videostream enkodiert werden kann (z.B. von einer Kamera).
|
6
|
System.capabilities.isDebugger
|
Erkennt, ob der Flash Player eine offiziell herausgegebene Version oder eine spezielle Debugger-Version ist.
|
6
|
System.capabilities.language
|
Ermittelt die Sprache des Systems (nach ISO 639-1).
|
6
|
System.capabilities.localFileReadDisable
|
Ermittellt, ob lokale Dateien gelesen werden dürfen.
|
7
|
System.capabilities.manufacturer
|
Ermittelt den Hersteller des Flash Players.
|
6
|
System.capabilities.os
|
Ermittelt das Betriebssystem.
|
6
|
System.capabilities.pixelAspectRatio
|
Ermittelt das Seitenverhältnis der Bildschirmpunkte.
|
6
|
System.capabilities.playerType
|
Ermittelt die Art des Flash Players (Stand-alone, External, Plug-in oder ActiveX).
|
7
|
System.capabilities.screenColor
|
Ermittelt, ob der Bildschirm Farben, Graustufen oder nur Schwarz-Weiß darstellt.
|
6
|
System.capabilities.screenDPI
|
Ermittelt die Auflösung des Bildschirms in DPI.
|
6
|
System.capabilities.screenResolutionX
|
Ermittelt die horizontale Größe des Bildschirms in Pixel.
|
6
|
System.capabilities.screenResolutionY
|
Ermittelt die vertikale Größe des Bildschirms in Pixel.
|
6
|
System.capabilities.serverString
|
Gibt eine URL-enkodierte Zeichenkette zurück, die sämtliche Werte der System.capabilities-Eigenschaft enthält.
|
6
|
System.capabilities.version
|
Ermittelt die Version des Flash Players.
|
6
|
|