1 Vývoj aplikací ADOBE AIR 1.5 pomocí programu ADOBE FLASH CS4 PROFESSIONAL2 Copyright 2008 Adobe Systems Incorporated. Všechna práva vyhrazena. Vývoj...
Kapitola 12: Práce s nativními nabídkami Další informace o nativních nabídkách online Základní koncepce nabídky AIR Vytváření nativních nabídek Kontextové nabídky
Příkazy nabídky a stisknutí kláves pro kopírování a vkládání Kapitola 17: Práce s bytovými poli Čtení a zapisování do objektu ByteArray Příklad ByteArray: Čtení souboru .zip
Kapitola 1: Instalace prostředí Adobe AIR Adobe® AIR™ umožňuje spouštění aplikací AIR na pracovní ploše. Modul runtime můžete nainstalovat následujícími způsoby:
• Samostatnou instalací modulu runtime (aniž byste instalovali i některou aplikaci AIR) • První instalací aplikace AIR (budete rovněž vyzváni k instalaci modulu runtime) • Instalací některého vývojového prostředí AIR, jako je například AIR SDK, Adobe® Flex™ Builder™ 3 nebo Adobe Flex™ 3 SDK (které zahrnuje vývojářské nástroje příkazového řádku AIR) Modul runtime může být nainstalován v každém počítači pouze jednou. Podrobné systémové požadavky pro instalaci a spuštění prostředí AIR naleznete zde: Adobe AIR: Systémové požadavky (http://www.adobe.com/products/air/systemreqs/).
Instalace prostředí Adobe AIR Stáhněte a nainstalujte verzi prostředí AIR pro operační systémy Windows®, Mac OS X a Linux pomocí následujících pokynů. Aby mohl uživatel aktualizovat modul runtime, musí mít k počítači oprávnění správce. Instalace modulu runtime v počítači s operačním systémem Windows 1 Stáhněte si instalační soubor modulu runtime. 2 Poklepejte na instalační soubor modulu runtime. 3 Instalaci dokončete podle výzev v instalačním okně.
Instalace modulu runtime v počítači Macintosh 1 Stáhněte si instalační soubor modulu runtime. 2 Poklepejte na instalační soubor modulu runtime. 3 Instalaci dokončete podle výzev v instalačním okně. 4 Pokud se v instalačním programu zobrazí okno Authenticate (Ověřit), zadejte jméno uživatele operačního systému
Mac OS a heslo. Instalace modulu runtime v počítači s operačním systémem Linux 1 Stáhněte si instalační soubor modulu runtime. 2 Nastavte oprávnění souboru tak, aby bylo možné spustit instalační program:
Oprávnění souboru lze nastavit z příkazového řádku pomocí příkazu chmod +x installer.bin. Některé verze systému Linux umožňují nastavovat oprávnění souborů v dialogovém okně vlastností, které lze otevřít z kontextové nabídky. 3 Instalační program spustíte z příkazového řádku nebo poklepáním na instalační soubor modulu runtime. 4 Instalaci dokončete podle výzev v instalačním okně.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 2 Instalace prostředí Adobe AIR
Prostředí AIR je instalováno jako balíčky rpm nebo dpkg s názvem adobeairv.n a adobecerts. Instalace vyžaduje spuštěný server X. Prostředí AIR zaregistruje typ MIME: application/vnd.adobe.air-application-installerpackage+zip.
Odebrání prostředí Adobe AIR Nainstalovaný modul runtime prostředí AIR můžete odebrat následujícími postupy. Odebrání modulu runtime z počítače s operačním systémem Windows 1 V nabídce Start operačního systému Windows vyberte položku Nastavení > Ovládací panely. 2 Vyberte ovládací panel Přidat nebo odebrat programy. 3 Chcete-li modul runtime odebrat, vyberte položku Adobe AIR. 4 Klepněte na tlačítko Změnit nebo odebrat.
Odebrání modulu runtime z počítače Macintosh • Poklepejte na položku Adobe AIR Uninstaller, která se nachází ve složce /Applications/Utilities. Odebrání modulu runtime z počítače s operačním systémem Linux Proveďte jeden z následujících úkonů:
• Z nabídky aplikací vyberte příkaz „Adobe AIR Uninstaller“. • Spusťte binární instalační program prostředí AIR s volbou -uninstall. • Odeberte pomocí správce balíčků balíčky prostředí AIR (adobeairv.n a adobecerts).
Instalace a spuštění ukázkových aplikací AIR K dispozici je několik ukázkových aplikací, které slouží k předvádění funkcí prostředí AIR. Pro přístup a instalaci můžete použít následující pokyny: 1 Stáhněte si a spusťte ukázkové aplikace AIR. K dispozici jsou kompilované aplikace i zdrojový kód. 2 Chcete-li stáhnout a spustit ukázkovou aplikaci, klepněte na tlačítko ukázkové aplikace Instalovat. Zobrazí se výzva
k instalaci a spuštění aplikace. 3 Pokud se rozhodnete stáhnout ukázkové aplikace a spouštět je později, vyberte odkazy na stažení. Aplikace AIR
můžete spouštět kdykoli následujícím postupem:
• V operačním systému Windows poklepejte na ikonu aplikace na ploše nebo ji vyberte v nabídce Start. • V operačním systému Mac OS poklepejte na ikonu aplikace, která je ve výchozím nastavení nainstalována ve složce Applications (Aplikace) ve vašem uživatelském adresáři (například Macintosh HD/Users/JoeUser/Applications/).
• V operačním systému Linux poklepejte na ikonu aplikace na ploše nebo ji vyberte z nabídky aplikací. Aplikace AIR jsou instalovány do vlastní složky do adresáře /opt. Poznámka: Vyhledejte aktualizace těchto pokynů v poznámkách k vydání prostředí AIR na adrese http://www.adobe.com/go/learn_air_relnotes_cz.
3
Kapitola 2: Nastavení programu Flash CS3 pro prostředí Adobe AIR Aktualizace Adobe® AIR™ pro program Adobe® Flash® CS3 Professional rozšiřuje vývojové prostředí programu Flash o části, které slouží k vytváření aplikací AIR pomocí programu Flash. Umožňuje v programu Flash vytvářet, testovat a ladit soubory aplikací AIR. Program Adobe® Flash® CS4 Professional má zabudovanou podporu pro vytváření aplikací AIR. Další informace viz část Publikování pro prostředí Adobe AIR v dokumentu Používání programu Flash. Aktualizace Adobe AIR pro program Flash CS3 podporuje prostředí AIR 1.0 a 1.1 a aplikaci Flash Player 9.x. Chceteli vyvíjet aplikace s prostředím AIR 1.5 a aplikací Flash Player 10, je vyžadován program Flash CS4.
Požadavky na systém pro aktualizaci Adobe AIR pro program Flash CS3 Abyste mohli program Flash CS3 používat k vývoji a spouštění aplikací AIR, musí být nainstalován následující software:
• Flash CS3 Professional Pokud program Flash CS3 Professional nemáte, můžete ho zakoupit na webu společnosti Adobe na adrese: http://www.adobe.com/products/flash/.
• Adobe AIR Informace o instalaci prostředí Adobe AIR naleznete v části „Instalace prostředí Adobe AIR“ na stránce 1.
• Aktualizace Adobe AIR pro program Flash CS3 Pokud jste již dříve nainstalovali nějakou verzi aktualizace Adobe AIR pro program Flash CS3, postupujte podle pokynů v tématu Odinstalování aktualizace Adobe AIR pro program Flash CS3 a nejdříve odeberte tuto aktualizaci. Pokud jste aktualizaci Adobe AIR pro program Flash CS3 zatím neinstalovali, přejděte do části „Instalace aktualizace Adobe AIR pro program Flash CS3“ na stránce 3.
Instalace aktualizace Adobe AIR pro program Flash CS3 Před instalací aktualizace Adobe AIR pro program Flash CS3 ukončete program Flash a všechny otevřené prohlížeče.
• Stáhněte aktualizaci Adobe AIR pro program Flash CS3. • Až aktualizaci stáhnete, nainstalujte ji poklepáním na soubor aktualizace.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 4 Nastavení programu Flash CS3 pro prostředí Adobe AIR
Odebrání aktualizace Adobe AIR pro program Flash CS3 Pokud jste aktualizaci Adobe AIR pro program Flash CS3 nainstalovali již dříve, postupujte podle těchto pokynů a před instalací nové aktualizace Adobe AIR pro program Flash CS3 ji odeberte. 1 Odstraňte následující složku:
(Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\AIK (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/AIK 2 Přejděte do následujícího umístění:
(Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\<jazyk>\First Run\Commands\ (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/First Run/Commands a odstraňte následující soubory nebo složky:
• Složku AIR • AIR - Application and Installer Settings.jsfl • AIR - Create AIR File.jsfl 3 Odstraňte následující soubor:
(Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\<jazyk>\Configuration\Players\AdobeAIR1_0.xml (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/Configuration/Players/ AdobeAIR1_0.xml 5 Přejděte do následujícího umístění:
(Systém Windows) [jednotka]:\Document and Settings\<jméno_uživatele>\Local Settings\Data aplikací\Adobe\Flash CS3\<jazyk>\Configuration\Commands\ (Počítače Mac) [jednotka]:/Users/<jméno_uživatele>/Library/Application Support/Adobe/Flash CS3/<jazyk>/Configuration/Commands/ a odstraňte následující soubory nebo složky:
• Složku AIR • AIR - Application and Installer Settings.jsfl • AIR - Create AIR File.jsfl Poznámka: Pokud uvedená umístění v systému Windows nevidíte, zaškrtněte ve volbách složky přepínací tlačítko Zobrazovat skryté soubory a složky.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 5 Nastavení programu Flash CS3 pro prostředí Adobe AIR
Doplňky prostředí AIR pro program Flash CS3 Po nainstalování aktualizace Adobe AIR dojde v programu Flash k následujícím změnám:
• Nová položka pro prostředí Adobe AIR 1.0 v nabídce Verze na kartě Flash v dialogovém okně Nastavení publikování (Soubor > Nastavení publikování)
• Aktualizovaná úvodní obrazovka obsahující položku pro vytvoření souboru Flash (Adobe AIR) (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\en\FirstRun\StartPage (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\en\FirstRun\StartPage\resources Poznámka: Pokud se na počítačích Macintosh neobjeví na úvodní obrazovce položka pro soubor Flash (Adobe AIR), odstraňte následující složku a restartujte program Flash: [jednotka]:/Users/<jméno_uživatele>/Libraries/Application Support/Adobe/Flash CS3/<jazyk>/Configuration/StartPage
• Nový soubor playerglobal.swc obsahující všechna rozhraní API jazyka ActionScript 3.0 a rozhraní API prostředí Adobe AIR ve složce ActionScript 3.0/Classes (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\en\Configuration\ActionScript 3.0 Classes (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/Configuration/ActionScript 3.0/Classes/
• Nové soubory jsfl (AIR - Application and Installer Settings.jsfl, AIR - Publish AIR File.jsfl) (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\en\FirstRun\Commands (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/First Run/Commands/
• Sada Adobe AIR Software Development Kit (AIK) (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\AIK
Kapitola 3: Úvod do aplikace Adobe AIR Aplikace Adobe® AIR™ je běhový modul nezávislý na operačním systému, pomocí něhož lze využít existující schopnosti vyvíjení webu (Adobe® Flash® CS3.0 Professional, Adobe ® Flash®CS4 Professional, Adobe® Flex™, HTML, JavaScript®, Ajax) k vytváření a rozmisťování aplikací RIA (Rich Internet Applications). Další informace o začátcích a používání prostředí Adobe AIR naleznete na stránkách Adobe AIR Developer Connection (http://www.adobe.com/devnet/air/). Aplikace AIR umožňuje práci ve známém prostředí, takže je možné využívat nástroje a postupy, které jsou pro vývojáře nejpohodlnější. Tím, že podporuje technologii Flash, Flex, HTML, JavaScript a Ajax, umožňuje vytvoření co nejlepší aplikace vyhovující vašim potřebám. Při vývoji aplikací je například možné využít některou z následujících technologií nebo jejich kombinaci:
• Flash / Flex / ActionScript • HTML / JavaScript / CSS / Ajax • PDF lze použít s jakoukoliv aplikací V důsledku toho aplikace AIR mohou být:
• založené na technologii Flash nebo Flex: aplikace, jejichž základní obsah je ve formátu Flash/Flex (SWF); • založené na technologii Flash nebo Flex s formátem HTML nebo PDF: aplikace, jejichž základní obsah je ve formátu Flash/Flex (SWF) a zahrnuje obsah ve formátu HTML (HTML, JS, CSS) nebo PDF;
• založené na HTML: aplikace, jejichž základní obsah je ve formátu HTML, JS, CSS; • založené na HTML s formátem Flash/Flex (SWF) nebo PDF: aplikace, jejichž základní obsah je ve formátu HTML a zahrnuje obsah ve formátu Flash/Flex (SWF) nebo PDF. Uživatelé interaktivně pracují s aplikacemi AIR stejným způsobem jako s nativními počítačovými aplikacemi. Běhový modul se jednou nainstaluje v počítači uživatele a aplikace AIR se pak instalují a spouští stejně jako kterákoliv jiná počítačová aplikace. Běhový modul poskytuje jednotnou platformu nezávislou na operačním systému a pevný rámec pro zavádění aplikací, takže eliminuje testování napříč prohlížeči, neboť zajišťuje jednotnou funkčnost a stejné interakce mezi různými počítači. Místo toho, aby se aplikace vyvíjela pro určitý operační systém, zaměří se běhový modul, což přináší následující výhody:
• Aplikace vyvinuté pro aplikaci AIR lze spouštět v různých operačních systémech, aniž by to pro vývojáře znamenalo další práci. Běhový modul zajišťuje jednotnou prezentaci dat a předvídatelné interakce napříč všemi operačními systémy, které aplikace AIR podporuje.
• Aplikace lze vytvářet rychleji, neboť je možné využít existující webové technologie a návrhové vzory a zavést tak webové aplikace do počítače bez toho, aby bylo potřeba znát tradiční počítačové vývojové technologie nebo složitý nativní kód.
• Vyvíjení aplikací je jednodušší než při použití jazyků nižší úrovně, například C a C++. Není potřeba spravovat složitá rozhraní API nižší úrovně specifická pro jednotlivé operační systémy. Při vyvíjení aplikací pro aplikaci AIR lze využít pestrou škálu technologií a rozhraní API:
• Rozhraní API specifická pro aplikaci AIR, jež poskytuje běhový modul a technologie AIR • Rozhraní API jazyka ActionScript používaná v souborech SWF a v technologii Flex (jakož i v dalších knihovnách a technologiích založených na jazyce ActionScript)
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 7 Úvod do aplikace Adobe AIR
• HTML, CSS a JavaScript • Většina technologií Ajax Aplikace AIR výrazně mění způsob vytváření, zavádění a používání aplikací. Zajišťuje mnohem větší kreativní kontrolu a zavádění aplikací založených na technologiích Flash, Flex, HTML a Ajax do počítače, aniž by bylo potřeba znát tradiční počítačové vývojové technologie.
Co je nového v prostředí AIR 1.1 Prostředí Adobe AIR 1.1 uvedlo následující nové možnosti:
• Instalační a další běhová dialogová okna byla přeložena do těchto jazyků: • Brazilská portugalština • Čínština (tradiční i zjednodušená) • Francouzština • Němčina • Italština • Japonština • Korejština • Ruština • Francouzština • Španělština • Podpora vytváření internacionalizovaných aplikací, včetně klávesových vstupů pro dvoubajtové jazyky. Viz část „Lokalizace aplikací AIR“ na stránce 330.
• Podpora pro lokalizaci atributů názvu a popisu v souboru deskriptoru aplikace. • Podpora pro lokalizaci chybových zpráv (jako jsou SQLError.detailID a SQLError.detailArguments) v databázi SQLite.
• Podpora vlastnosti Capabilities.languages; tato vlastnost slouží k získání pole preferovaných jazyků uživatelského rozhraní podle toho, jaké jsou nastaveny operačním systémem.
• Popisy tlačítek a výchozí nabídky jazyka HTML, jako jsou kontextové nabídky a panel nabídek počítačů Macintosh, byly lokalizovány do všech podporovaných jazyků.
• Podpora pro migraci certifikátu z aplikace s vlastním podpisem do aplikace, která se odkazuje na certifikační autoritu (CA).
• Podpora systému Microsoft Windows XP Tablet PC Edition a podpora 64bitových vydání systémů Windows Vista® Home Premium, Business, Ultimata nebo Enterprise.
• Bylo přidáno rozhraní API metody File.spaceAvailable k získání volného dostupného místa na pevném disku. • Byla přidána vlastnost NativeWindow.supportsTransparency k určení toho, zda aktuální operační systém dokáže okno kreslit jako průhledné. Další informace o tomto vydání prostředí AIR 1.1 naleznete v poznámkách k vydání – Adobe AIR 1.1 Release Notes (http://www.adobe.com/go/learn_air_relnotes_cz).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 8 Úvod do aplikace Adobe AIR
Co je nového v prostředí AIR 1.5 Prostředí Adobe AIR 1.5 zavádí následující nové funkce:
• Podpora následujících funkcí aplikace Flash Player 10. • Vlastní filtry a efekty • Vylepšené kreslicí rozhraní API • Generování dynamického zvuku • Datový typ Vector • Vylepšená rozhraní API pro posílání a stahování souborů • Protokol RTMFP (Real Time Media Flow Protocol) • 3D efekty • Podpora pokročilého textu • Správa barev • Textový modul • Dynamické streamování • Zvukový kodek Speex Další informace a podrobnosti o těchto funkcích naleznete na adrese http://www.adobe.com/products/flashplayer/features/.
• Instalační program a běhová dialogová okna prostředí AIR 1.5 podporují další jazyky: češtinu, holandštinu, švédštinu, turečtinu a polštinu.
• Šifrování databází. V prostředí AIR 1.5 lze soubory databází šifrovat. Lze šifrovat veškerý obsah databází (včetně metadat), takže data nelze přečíst mimo prostředí AIR, které je zašifrovalo. Díky této funkci mohou vývojáři soubory databází šifrovat, odšifrovat a znovu šifrovat. Viz část „Ukládání šifrovaných dat“ na stránce 208.
• Byla aktualizována verze knihovny WebKit, kterou používá prostředí Adobe AIR; nyní obsahuje podporu pro překladač jazyka JavaScript – SquirrelFish.
• Nová rozhraní API pro ověřování podpisu XML lze využívat k lepšímu ověřování integrity a identity autora podpisu dat nebo informací. Viz Ověřování podpisu XML. Další informace o tomto vydání prostředí AIR 1.5 naleznete v poznámkách k vydání – Adobe AIR 1.5 Release Notes (http://www.adobe.com/go/learn_air_relnotes_cz).
9
Kapitola 4: Vyhledávání zdrojů prostředí AIR Další informace o vývoji aplikací prostředí Adobe® AIR™ naleznete v následujících zdrojích: Zdroj
Na stránkách Adobe AIR Developer Connection na adrese http://www.adobe.com/devnet/air/ naleznete články, ukázky a prezentace odborníků ze společnosti Adobe a z komunity. Z těchto stránek si rovněž můžete stáhnout prostředí Adobe AIR a související software. Na stránkách http://www.adobe.com/devnet/air/flash/ naleznete oddíl určený konkrétně pro vývojáře aplikace Flash. Navštivte web podpory společnosti Adobe na adrese http://www.adobe.com/support/, kde najdete informace o odstraňování problémů pro váš produkt a dozvíte se o možnostech bezplatné i placené technické podpory. Pomocí odkazu Školení získáte přístup ke knihám nakladatelství Adobe Press, různým výukovým zdrojům, programům certifikací pro software Adobe a dalším informacím.
10
Kapitola 5: Vytvoření první aplikace AIR pomocí programu Flash CS3 nebo CS4 Toto téma nabízí rychlou a praktickou demonstraci toho, jakým způsobem pracuje prostředí Adobe ® AIR™. Postupujte podle pokynů a pomocí programu Adobe® Flash® CS3 Professional vytvořte a zabalte jednoduchou aplikaci „Hello World“. Pokud jste to ještě neudělali, stáhněte a nainstalujte aktualizaci Adobe AIR pro program Flash CS3. Další informace o instalaci prostředí Adobe AIR pro program Flash CS3 naleznete v části „Nastavení programu Flash CS3 pro prostředí Adobe AIR“ na stránce 3. Pokud používáte program Adobe ®Flash® CS4 Professional, je podpora prostředí Adobe AIR již zabudována a abyste mohli začít, nemusíte nic instalovat.
Vytvoření aplikace „Hello World“ v programu Flash Vytvoření aplikace Adobe AIR v programu Flash se velice podobá vytvoření jakéhokoli jiného souboru FLA. Rozdíl je v tom, že začínáte vytvořením souboru Flash (Adobe AIR) z úvodní obrazovky a postup uzavřete vytvořením nastavení aplikace a instalátoru a instalací své aplikace AIR. Následující postup vás provede procesem vytvoření jednoduché aplikace „Hello World“ pomocí programu Flash CS3 nebo Flash CS4. Vytvoření aplikace „Hello World“ 1 Spusťte program Flash. 2 Klepněte na úvodní obrazovce na příkaz Soubor Flash (Adobe AIR), abyste vytvořili prázdný soubor FLA s
nastavením publikování prostředí Adobe AIR. 3 Na přehledové dialogové okno Vývoj pro prostředí Adobe AIR pomocí programu Flash CS3 reagujte klepnutím na
tlačítko OK. Poprvé je na toto dialogové okno třeba několik sekund čekat. (Toto dialogové okno se v programu Flash CS4 nezobrazuje.) 4 Vyberte v panelu Nástroje textový nástroj a vytvořte ve středu vymezené plochy pole statického textu (výchozí
volba). Pole musí být dostatečně široké, aby obsáhlo 15–20 znaků. 5 Zadejte do tohoto textového pole text „Hello World“. 6 Uložte soubor a pojmenujte ho (například „helloAIR“).
Testování aplikace 1 Chcete-li aplikaci otestovat v prostředí Adobe AIR, stiskněte klávesy Ctrl+Enter nebo vyberte příkaz Ovládání >
Testovat film. 2 Abyste mohli použít funkci Ladit film, musíte nejdříve do aplikace přidat kód jazyka ActionScript. Toho rychle
dosáhnete, když přidáte příkaz trace, jako je například tento: trace("Running AIR application using Debug Movie");
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 11 Vytvoření první aplikace AIR pomocí programu Flash CS3 nebo CS4
3 Chcete-li aplikaci spustit s funkcí Ladit film, stiskněte klávesy Ctrl+Shift+Enter nebo vyberte příkaz Ovládání >
Ladit film. 4 Chcete-li otevřít dialogové okno AIR – Nastavení aplikace a instalátoru, vyberte položku nabídky Příkazy > AIR –
Nastavení aplikace a instalátoru. Toto dialogové okno lze v programu Flash CS4 otevřít výběrem příkazu Soubor > Nastavení AIR.
5 Podpis balíčku Adobe AIR pomocí digitálního certifikátu s vlastním podpisem: a Klepněte na tlačítko Nastavit..., aby výzva Digitální podpis otevřela dialogové okno digitálního podpisu. b Klepnutím na tlačítko Vytvořit... otevřete dialogové okno Vytvořit digitální certifikát s vlastním podpisem. c Vyplňte položky Jméno vydavatele, Útvar organizace, Název organizace, E-mail, Země, Heslo a Potvrzení hesla. d Určete typ certifikátu. Volba typu certifikátu označuje úroveň zabezpečení: 1024-RSA používá 1024bitový klíč
(méně zabezpečený), 2048-RSA 2048bitový (více zabezpečený). e Uložte informaci do souboru certifikátu – vyplňte položku Uložit jako nebo přejděte do umístění složky po
klepnutí na tlačítko Procházet. (Například C:/Temp/mujcert.pfx.) Po dokončení klepněte na tlačítko OK. f
Program Flash vás vrátí do dialogového okna Digitální podpis. V textovém poli Certifikát se objeví cesta a název souboru certifikátu s vlastním podpisem, který jste vytvořili. Pokud k tomu nedojde, zadejte cestu a název souboru nebo je najděte a vyberte po klepnutí na tlačítko Procházet.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 12 Vytvoření první aplikace AIR pomocí programu Flash CS3 nebo CS4
g Zadejte do pole Heslo dialogového okna Digitální podpis stejné heslo, jako bylo heslo přiřazené v kroku c, a
klepněte na tlačítko OK. Další informace o podepisování aplikací Adobe AIR naleznete v části „Podepisování aplikace“ na stránce 21. 6 Chcete-li vytvořit soubor aplikace a instalátoru, klepněte na tlačítko Publikovat soubor AIR. Abyste vytvořili soubory
SWF a soubory .xml aplikace před vytvořením souboru AIR, musíte spustit příkaz Testovat film nebo Ladit film. 7 Chcete-li aplikaci nainstalovat, poklepejte na soubor AIR (aplikace.air), který je umístěný ve stejné složce, do které
jste svou aplikaci uložili. 8 V dialogovém okně Instalace aplikace klepněte na tlačítko Instalovat. 9 Zkontrolujte nastavení instalačních předvoleb a umístění a ujistěte se, zda je zaškrtnuto zaškrtávací políčko Spustit
aplikaci po dokončení instalace. Pak klepněte na tlačítko Pokračovat. 10 Až se objeví zpráva o dokončení instalace, klepněte na tlačítko Dokončit.
Aplikace „Hello World“ vypadá jako v této ukázce:
Převod souboru FLA na aplikaci Adobe AIR Můžete také převést existující soubor FLA na aplikaci AIR. Další informace naleznete v části „Nastavení publikování prostředí Adobe AIR“ na stránce 13. Pokud používáte program Flash CS4, viz část Publikování pro prostředí Adobe AIR v dokumentu Používání programu Flash.
13
Kapitola 6: Aktualizace Adobe AIR pro program Flash CS3 Professional Aktualizace Adobe® AIR™ pro program Adobe® Flash® CS3 Professional rozšiřuje vývojové prostředí s cílem umožnit vám vytváření, ladění a balení aplikací Adobe AIR pomocí programu Flash. Proces vytvoření aplikace Adobe AIR spočívá ve vytvoření souboru Adobe AIR ve formátu FLA, nastavení příslušných nastavení publikování, vývoji aplikace a vytvoření souborů aplikace a instalátoru, které vám umožní její nasazení. Pokud používáte program Adobe® Flash® CS4 Professional, najdete další informace o vytváření aplikací AIR v části Publikování pro prostředí Adobe AIR dokumentu Používání programu Flash. Informace o rozhraních API jazyka ActionScript® prostředí Adobe AIR naleznete v dokumentu Referenční příručka jazyka ActionScript 3.0 a jeho komponent. Seznam rozhraní API jazyka ActionScript prostředí Adobe AIR naleznete v části „Adobe AIR – specifické funkce“ na stránce 53. Poznámka: Chcete-li používat třídy v balíčku air.net, přetáhněte nejdříve z panelu Komponenty do panelu Knihovna komponentu ServiceMonitorShim a pak přidejte následující příkaz import do kódu jazyka ActionScript 3.0: import air.net.*;
Vytvoření souboru Adobe AIR Dokumenty ve formátu souborů Flash (Adobe AIR) můžete vytvořit pomocí úvodní obrazovky programu Flash. Také můžete vytvořit soubor Flash (ActionScript™ 3.0) a tento soubor převést na soubor Adobe AIR pomocí dialogového okna Nastavení publikování. Soubor Adobe AIR ale nelze vytvořit pomocí dialogového okna Nový dokument (Soubor > Nový). Informace o převodu souboru FLA na soubor Adobe AIR naleznete v části „Nastavení publikování prostředí Adobe AIR“ na stránce 13. 1 Spusťte program Flash, nebo v případě, že jste program Flash již spustili, zavřete všechny otevřené dokumenty a
vraťte se na úvodní obrazovku. Poznámka: Pokud jste úvodní obrazovku programu Flash zakázali, můžete ji znovu zobrazit. Vyberte příkaz Úpravy > Předvolby a v kategorii Všeobecné vyberte z rozbalovací nabídky Při spuštění možnost Úvodní obrazovka. 2 Klepněte na úvodní obrazovce na položku Soubor Flash (Adobe AIR).
Objeví se výstražná zpráva, která vás informuje o způsobu přístupu k nastavení aplikací Adobe AIR a dokumentaci nápovědy. Vyberete-li možnost Příště nezobrazovat, můžete tuto výstrahu v budoucnu přeskočit. Neexistuje ale způsob, jak tuto výstrahu znovu zobrazit.
Nastavení publikování prostředí Adobe AIR Nastavení publikování programu Flash slouží k prozkoumání nebo změně nastavení souboru AIR nebo převodu dokumentu ve formátu souboru Flash (ActionScript 3.0) na dokument ve formátu souboru Flash (Adobe AIR).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 14 Aktualizace Adobe AIR pro program Flash CS3 Professional
Zobrazení nastavení publikování prostředí Adobe AIR 1 Otevřete z úvodní obrazovky programu Flash dokument ve formátu souboru Flash (Adobe AIR). 2 Vyberte příkaz Soubor > Nastavení publikování a zobrazte nastavení publikování prostředí Adobe AIR klepnutím
na záložku Flash. Když otevřete dokument Adobe AIR, je v nabídce Verze automaticky vybrána verze Adobe AIR 1.0. Verze jazyka ActionScript™ je automaticky nastavena na verzi ActionScript 3.0. Nastavení Lokální zabezpečení přehrávání je ztlumeno, protože nemá pro soubor SWF prostředí AIR žádný význam. Pokud jste otevřeli soubor FLA programu Flash, můžete tento soubor převést na soubor Flash prostředí AIR tím, že změníte nastavení publikování. Převod souboru FLA programu Flash na soubor Flash prostředí AIR pomocí dialogového okna Nastavení publikování 1 Proveďte jeden z následujících úkonů:
• Otevřete existující soubor FLA. • Otevřete nový soubor FLA pomocí úvodní obrazovky nebo výběrem příkazu Soubor > Nový. 2 Vyberte příkaz Soubor > Nastavení publikování. 3 Na záložce Flash vyberte z rozbalovací nabídky Verze možnost Adobe AIR 1.0.
Položka verze jazyka ActionScript je zakázána, protože jedinou volbou pro soubor AIR je verze ActionScript 3.0. Ostatní výchozí volby jsou pro soubor FLA i soubor Adobe AIR shodné. 4 Klepněte na tlačítko Publikovat a pak zavřete dialogové okno Nastavení publikování klepnutím na tlačítko OK.
Když je vybrán nástroj pro výběr, inspektor vlastností nyní udává, že cílová verze přehrávače je Adobe AIR 1. Poznámka: Zvolíte-li profil Adobe AIR 1.0, přidá program Flash do proměnné prostředí Classpath umístění souboru playerglobal.swc prostředí AIR automaticky. Soubor playerglobal.swc prostředí AIR umožňuje, abyste mohli používat rozhraní API jazyka ActionScript prostředí AIR. Pokud ale přepnete z profilu Adobe AIR 1 na profil Adobe® Flash® Player 9, nepřejde program Flash zpět na výchozí profil ani nezmění nastavení proměnné Classpath tak, aby používal soubor playerglobal.swc i pro profil Flash Player 9. Pokud změníte nastavení publikování z profilu Adobe AIR 1 na Flash Player 9, musíte změnit profil publikování na Výchozí. Další informace o dialogovém okně Nastavení publikování naleznete v tématu Používání programu Flash na adrese www.adobe.com/go/learn_fl_using_cz. Převod souboru FLA programu Flash na soubor Flash prostředí AIR pomocí nabídky Příkazy 1 Otevřete soubor FLA programu Flash. 2 Pokud otevíráte nový soubor Flash (ActionScript 3.0), soubor uložte. Pokud soubor neuložíte, objeví se při
provedení následujícího kroku varování. 3 Vyberte příkaz Příkazy > AIR – Nastavení aplikace a instalátoru.
Objeví se výstražná zpráva s dotazem, zda chcete soubor převést na nastavení publikování prostředí Adobe AIR. 4 Chcete-li soubor FLA převést na nastavení publikování prostředí Adobe AIR, klepněte na tlačítko OK. Objeví se
dialogové okno AIR – Nastavení aplikace a instalátoru. Informace o dialogovém okně AIR – Nastavení aplikace a instalátoru naleznete v části „Vytváření souborů aplikace AIR a instalátoru“ na stránce 15. Na převedeném souboru FLA prostředí AIR můžete používat příkazy Testovat film, Ladit film a Vytvořit soubor AIR.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 15 Aktualizace Adobe AIR pro program Flash CS3 Professional
Náhled aplikace Adobe AIR Můžete si zobrazit náhled soubor SWF programu Flash pro prostředí AIR, který bude vypadat stejně, jako by byl zobrazen v okně aplikace AIR. Zobrazení náhledu je užitečné v situaci, kdy chcete zobrazit viditelné aspekty vzhledu aplikace a přitom nechcete aplikaci balit a instalovat. 1 Ujistěte se, zda jste nastavili nastavení publikování pro aplikaci Adobe AIR. Další informace naleznete v části
„Nastavení publikování prostředí Adobe AIR“ na stránce 13. 2 Vyberte příkaz Ovládání > Testovat film nebo stiskněte klávesy Ctrl+Enter.
Pokud jste nenastavili nastavení aplikace pomocí dialogového okna AIR – Nastavení aplikace a instalátoru, vytvoří program Flash do stejné složky, do které zapíše soubor SFW, výchozí soubor deskriptoru aplikace (název_souboru_swf-app.xml). Pokud jste nastavili nastavení aplikace pomocí dialogového okna AIR – Nastavení aplikace a instalátoru, používá soubor deskriptoru aplikace tato nastavení.
Ladění aplikace Adobe AIR Až na možnost vzdáleného ladění můžete soubor SWF Adobe AIR ladit stejným způsobem jako soubor SWF jazyka ActionScript 3.0 přehrávače Flash Player 9. 1 Zkontrolujte, zda jste nastavili nastavení publikování prostředí Adobe AIR. 2 Přidejte do panelu Akce kód jazyka ActionScript (Okno > Akce). Za účelem testování stačí na panelu Akce do
prvního snímku časové osy jednoduše přidat příkaz trace(), podobný následujícímu: trace("My application is running");
3 Vyberte příkaz Ladění > Ladit film nebo stiskněte klávesy Ctrl+Shift+Enter.
Program Flash spustí debugger jazyka ActionScript a exportuje soubor SWF i s informací o ladění. Pokud jste nenastavili nastavení aplikace pomocí dialogového okna AIR – Nastavení aplikace a instalátoru, vytvoří program Flash do stejné složky, do které zapíše soubor SFW, výchozí soubor deskriptoru aplikace (název_souboru_swf-app.xml). Pokud jste nastavili nastavení aplikace pomocí dialogového okna AIR – Nastavení aplikace a instalátoru, používá soubor deskriptoru aplikace tato nastavení. Chcete-li ladit aplikaci a vyberete příkaz Ladění > Ladit film nebo stisknete klávesy Ctrl+Shift+Enter, zobrazí program Flash výstrahu v případě, že aplikace neobsahuje žádný kód jazyka ActionScript.
Vytváření souborů aplikace AIR a instalátoru Po dokončení aplikace vytvořte soubory aplikace AIR a instalátoru, které budou sloužit k jejímu nasazení. Prostředí Adobe AIR přidává do nabídky Příkazy programu Flash dvě nové položky nabídky: AIR – Nastavení aplikace a instalátoru a AIR – Vytvořit soubor AIR. Po vytvoření nastavení aplikace a instalátoru AIR můžete pomocí položky AIR – Vytvořit soubor AIR soubor AIR (.air) znovu vytvořit s existujícím nastavením. Vytvoření souborů aplikace a instalátoru Adobe AIR 1 Otevřete v programu Flash stránku nebo sadu stránek, které tvoří aplikaci Adobe AIR. 2 Než otevřete dialogové okno AIR – Nastavení aplikace a instalátoru, uložte soubor FLA prostředí Adobe AIR. 3 Vyberte příkaz Příkazy > AIR – Nastavení aplikace a instalátoru.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 16 Aktualizace Adobe AIR pro program Flash CS3 Professional
4 Dokončete dialogové okno AIR – Nastavení aplikace a instalátoru a pak klepněte na tlačítko Publikovat soubor AIR.
Když klepnete na tlačítko Publikovat souboru AIR, vytvoří se balíček s následujícími soubory: souborem FLA, souborem SWF, souborem deskriptoru aplikace, soubory ikon aplikace a soubory uvedenými v textovém poli Zahrnuté soubory. Pokud jste ještě nevytvořili digitální certifikát, zobrazí program Flash po klepnutí na tlačítko Publikovat soubor AIR dialogové okno Digitální podpis. Dialogové okno AIR – Nastavení aplikace a instalátoru je rozděleno do dvou částí: Nastavení aplikace a Nastavení instalátoru. Další informace o těchto nastaveních naleznete v následujících částech.
Nastavení aplikace Část pro nastavení aplikace dialogového okna AIR – Nastavení aplikace a instalátoru obsahuje následující volby: Název souboru Název hlavního souboru aplikace. Výchozí název je název souboru SWF. Název Název, který instalátor použije k vytvoření názvu souboru a složky aplikace. Název musí obsahovat pouze znaky, které jsou pro názvy souborů a složek platné. Výchozí název je název souboru SWF. Verze Volitelné. Určuje číslo verze aplikace. Tato hodnota je ve výchozím nastavení prázdná. Identifikátor Identifikuje aplikaci pomocí jedinečného identifikátoru. V případě potřeby můžete výchozí identifikátor změnit. Nepoužívejte v identifikátoru mezery nebo speciální znaky. Platné znaky jsou pouze 0–9, a–z, A–Z, . (tečka) a - (spojovník) a délka může být 1 až 212 znaků. Výchozí hodnota je com.adobe.example.application_name. Popis Volitelné. Umožňuje zadat popis aplikace, který se bude zobrazovat při instalaci aplikace uživatelem. Tato
hodnota je ve výchozím nastavení prázdná. Copyright Volitelné. Umožňuje zadat oznámení o copyrightu, který se bude zobrazovat při instalaci aplikace
uživatelem. Styl okna Určuje, jaký styl okna (nebo vzhledu) se použije pro uživatelské rozhraní, když uživatel spustí aplikaci na svém počítači. Můžete vybrat volbu Systémový vzhled, která odkazuje na vizuální styl používaný operačním systémem. Můžete také vybrat volby Vlastní vzhled (neprůhledný) nebo Vlastní vzhled (průhledný). Chcete-li aplikaci zobrazit bez systémového vzhled, vyberte možnost Žádné. Volba Systémový vzhled používá standardní ovládací prvky oken operačního systému. Volba Vlastní vzhled (neprůhledný) odstraní standardní systémový vzhled a umožní vám vytvořit pro aplikaci vlastní vzhled. (Vlastní vzhled vytváříte přímo v souboru FLA.) Volba Vlastní vzhled (průhledné) je podobná jako volba neprůhledný vlastní vzhled, obsahuje ale navíc možnost přidat do okrajů stránky průhlednost. Tato možnost slouží k vytváření oken aplikací, které nemají čtvercový nebo obdélníkový tvar. Ikona Volitelné. Slouží k určení ikony aplikace. Tato ikona se zobrazí poté, co aplikaci nainstalujete a spustíte v prostředí Adobe AIR. Aby bylo možné ikonu zobrazovat v různých zobrazeních, můžete pro ni určit čtyři různé velikosti (128, 48, 32 a 16 obrazových bodů). Ikona se například může objevit v prohlížeči souborů v zobrazení miniatury, podrobností nebo v dlaždicovém zobrazení. Může se také objevit jako ikona na ploše, v titulu okna aplikace AIR i na dalších místech.
Pokud nejsou určeny žádné jiné soubory ikon, použije se pro obraz ikony výchozí ukázková ikona aplikace AIR. Chcete-li určit ikonu, klepněte v dialogovém okně AIR – Nastavení aplikace a instalátoru na tlačítko Vybrat obrázky ikon. V zobrazeném dialogovém okně Obrazy ikon klepněte pro každou velikost ikony na určitou složku a vyberte, který soubor ikony chcete použít. Soubory musí být ve formátu PNG (Portable Network Graphics). Následující ukázka zobrazuje dialogové okno Obrazy ikon s výchozími ikonami aplikace Adobe AIR.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 17 Aktualizace Adobe AIR pro program Flash CS3 Professional
Určení různých velikostí obrazů ikon aplikace
Pokud určíte nějaký obraz, musí mít přesnou velikost (128 x 128, 48 x 48, 32 x 32 nebo 16 x 16). Pokud pro určitou velikost ikony nedodáte obraz, vytvoří prostředí Adobe AIR chybějící obraz ikony změnou velikosti jednoho z dodaných obrazů.
Rozšířené nastavení Tlačítko Nastavení v dialogovém okně AIR – Nastavení aplikace a instalátoru slouží k určení rozšířených nastavení pro soubor deskriptoru aplikace. Po klepnutí na tlačítko Nastavení se objeví dialogové okno Rozšířené nastavení. Dialogové okno Rozšířené nastavení slouží k určení všech přiřazených typů souborů, se kterými by měla aplikace pracovat. Pokud například chcete, aby sloužila jako hlavní aplikace pro práci se soubory HTML, měli byste tuto volbu určit v textovém poli Přiřazené typy souborů. Můžete také určit nastavení následujících aspektů aplikace:
• velikost a umístění počátečního okna; • složku, do které se aplikace nainstaluje; • složku nabídky programu, do které se aplikace umístí. Toto dialogové okno obsahuje následující volby: Přiřazené typy souborů Slouží k určení všech přiřazených typů souborů zpracovávaných aplikací AIR. Chcete-li do
textového pole přidat nový typ souborů, klepněte na tlačítko (+). Když klepnete na tlačítko pro přidání, zobrazí se dialogové okno Nastavení typu souboru. Klepnutím na tlačítko (-) odeberete položku, které je vybrána v textovém poli. Klepnete-li na tlačítko tužky, zobrazí se dialogové okno Nastavení typu souboru, které slouží k úpravě položky, kterou jste vybrali v textovém poli. Tlačítko tužky a tlačítko (-) jsou ve výchozím nastavení ztlumená. Pokud v textovém poli vyberete položku, tlačítka (-) a tužka se povolí, takže položku můžete odebrat nebo upravit. Výchozí hodnota textového pole je Žádné. Další informace o nastavení typů souborů pro přiřazené typy souborů naleznete v části „Nastavení typu souboru“ na stránce 18.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 18 Aktualizace Adobe AIR pro program Flash CS3 Professional
Počáteční nastavení okna Slouží k určení nastavení velikosti a umístění počátečního okna aplikace.
• Šířka: Určuje počáteční šířku okna v obrazových bodech. Tato hodnota je ve výchozím nastavení prázdná. • Výška: Určuje počáteční výšku okna v obrazových bodech. Tato hodnota je ve výchozím nastavení prázdná. • X: Určuje počáteční vodorovnou polohu okna v obrazových bodech. Tato hodnota je ve výchozím nastavení prázdná.
• Y: Určuje počáteční svislou polohu okna v obrazových bodech. Tato hodnota je ve výchozím nastavení prázdná. • Maximální šířka a Maximální výška: Slouží k určení maximální velikosti okna v obrazových bodech. Tyto hodnoty jsou ve výchozím nastavení prázdné.
• Minimální šířka a Minimální výška: Slouží k určení minimální velikosti okna v obrazových bodech. Tyto hodnoty jsou ve výchozím nastavení prázdné.
• Maximalizovatelné: Umožňuje určit, zda uživatel může maximalizovat okno. Tato volba je vybrána ve výchozím nastavení (nebo má hodnotu true).
• Minimalizovatelné: Umožňuje určit, zda uživatel může minimalizovat okno. Tato volba je vybrána ve výchozím nastavení (nebo má hodnotu true).
• Nastavitelná velikost: Umožňuje určit, zda uživatel může změnit velikost okna. Pokud není tato volba vybrána, jsou ztlumené možnosti pro maximální a minimální výšku i šířku. Tato volba je vybrána ve výchozím nastavení (nebo má hodnotu true).
• Viditelné: Slouží k určení toho, zda je okno aplikace od počátku viditelné. Volba je vybrána ve výchozím nastavení (nebo má hodnotu true). Další nastavení Slouží k určení následujících dodatečných informací, které se týkají instalace:
• Složka pro instalaci: Určuje složku, do které se aplikace nainstaluje. • Složka nabídky programu: Určuje název složky nabídky programu aplikace. • Vlastní uživatelské rozhraní aktualizací: Slouží k určení toho, co se stane v případě, kdy uživatel otevře soubor AIR pro dříve nainstalovanou aplikaci. Ve výchozím nastavení zobrazí prostředí AIR dialogové okno, které uživateli umožní nainstalovanou verzi aktualizovat verzí v souboru AIR. Tuto volbu vyberte tehdy, pokud nechcete uživatelům umožnit rozhodování o této záležitosti a chcete, aby úplnou kontrolu nad svými aktualizacemi měla aplikace. Vyberete-li tuto volbu, potlačíte výchozí chování a umožníte aplikaci ovládat své vlastní aktualizace. Informace o programatické aktualizaci aplikace AIR naleznete v části „Aktualizace aplikací AIR“ na stránce 316.
Nastavení typu souboru Pokud v dialogovém okně Rozšířené nastavení klepnete na tlačítko (+) nebo na tlačítko tužky, abyste přidali nebo upravili typy souborů přiřazené aplikaci, zobrazí program Flash dialogové okno Nastavení typu souboru. Jediná dvě pole v tomto dialogovém okně, která jsou povinná, jsou pole Název a Přípona. Pokud klepnete na tlačítko OK a některé z těchto polí je prázdné, zobrazí program Flash chybové dialogové okno. U přiřazených typů souborů můžete určit následující nastavení: Název Název typu souborů (například Hypertextový značkovací jazyk – HTML, Textový soubor nebo Příklad). Přípona Přípona názvu souborů (například html, text nebo xmpl); přípona může obsahovat až 39 základních alfanumerických znaků (A–Z, a–z, 0–9) a nesmí obsahovat počáteční tečku. Popis Volitelné. Popis typu souborů (Například Soubor videa Adobe). Typ obsahu Volitelné. Určuje typ MIME pro tento soubor.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 19 Aktualizace Adobe AIR pro program Flash CS3 Professional
Nastavení ikony typu souboru Volitelné. Slouží k určení ikony, která je přiřazena k danému typu souborů. Aby bylo
možné ikonu zobrazovat v různých zobrazeních, můžete pro ikonu určit čtyři různé velikosti (128 x 128, 48 x 48, 32 x 32 a 16 x 16 obrazových bodů). Ikona se například může objevit v prohlížeči souborů v zobrazení miniatury, podrobností nebo v dlaždicovém zobrazení. Pokud určíte nějaký obraz, musí mít vámi specifikovanou velikost. Pokud pro určitou velikost obraz neurčíte, použije prostředí AIR obraz, který se tomuto obrazu nejvíce blíží svoji velikostí, a tento obraz přizpůsobí konkrétnímu výskytu změnou jeho velikosti. Ikonu určíte tak, že klepnete na složku pro velikost ikony a vyberete soubor ikony, který chcete použít, nebo že zadáte do textového pole u příkazového řádku cestu a název souboru pro soubor ikony. Soubor ikony musí být ve formátu PNG. Po vytvoření nového typu souborů se tento typ souborů zobrazuje v dialogovém okně Rozšířené nastavení v poli seznamu Typ souboru.
Nastavení souboru deskriptoru aplikace Určená nastavení aplikace jsou uložena do souboru název_aplikace-app.xml. Můžete ale v programu Flash nastavit, že chcete použít vlastní soubor deskriptoru aplikace. Použít vlastní soubor deskriptoru aplikace Tato volba slouží k vyhledání vlastního souboru deskriptoru aplikace.
Pokud vyberete volbu Použít vlastní soubor deskriptoru aplikace, část pro nastavení aplikace dialogového okno se ztlumí. Chcete-li určit umístění vlastního souboru deskriptoru aplikace, zadejte toto umístění do textového pole pod volbou Použít vlastní soubor deskriptoru aplikace nebo klepněte na ikonu složky a přejděte do tohoto umístění. Další informace o souboru deskriptoru aplikace naleznete v části „Vytvoření vlastního souboru deskriptoru aplikace“ na stránce 20.
Nastavení instalátoru Druhá část dialogového okna AIR – Nastavení aplikace a instalátoru obsahuje nastavení, která se týkají instalace aplikace. Digitální podpis Všechny aplikace Adobe AIR je třeba podepsat, aby je bylo možno nainstalovat do jiného systému. Informace o přiřazení digitálního podpisu aplikaci Adobe AIR programu Flash naleznete v části „Podepisování aplikace“ na stránce 21. Cíl Určuje, kam bude soubor AIR uložen. Výchozí umístění je adresář, do kterého jste uložili soubor FLA. Chcete-li vybrat jiné umístění, klepněte na ikonu složky. Výchozí název balíčku je název aplikace s příponou názvu souboru .air. Zahrnuté soubory/složky Určuje, které další soubory nebo složky budou do aplikace zahrnuty. Chcete-li přidat
soubory, klepněte na tlačítko (+), chcete-li přidat složky, klepněte na tlačítko složky. Chcete-li soubor nebo složku odstranit ze seznamu, vyberte tento soubor nebo složku a klepněte na tlačítko (-). Ve výchozím nastavení jsou soubor deskriptoru aplikace a hlavní soubor SWF do seznamu balíčku přidány automaticky. Seznam balíčku tyto soubory zobrazuje dokonce i tehdy, pokud jste soubor FLA Adobe AIR ještě nepublikovali. Seznam balíčku zobrazuje soubory a složky nestrukturovaně. Nejsou uváděny soubory ve složkách a plné názvy cest k souborům jsou sice zobrazeny, ale v případě potřeby jsou zkráceny. Součástí tohoto seznamu nejsou soubory ikon. Když program Flash vytváří ze souborů balíček, zkopíruje soubory ikon do dočasné složky, která je vztažená k umístění souboru SWF. Po vytvoření balíčku program Flash tuto složku odstraní.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 20 Aktualizace Adobe AIR pro program Flash CS3 Professional
Chyby při vytváření souborů aplikace a instalátoru K chybě vytvoření souborů aplikace nebo instalátoru dojde v následujících případech:
• Řetězec identifikátoru aplikace má nesprávnou délku nebo obsahuje neplatné znaky. Řetězec identifikátoru aplikace může mít 1 až 212 znaků a může obsahovat následující znaky: 0–9, a–z, A–Z, . (tečku), - (spojovník).
• Soubory v seznamu instalátoru neexistují. • Velikost vlastních souborů ikon je nesprávná. • Cílová složka AIR nemá oprávnění pro zápis. • Aplikaci jste nepodepsali nebo jste neurčili, že se jedná o aplikaci Adobe AIRI, která bude podepsána později.
Vytvoření vlastního souboru deskriptoru aplikace Soubor deskriptoru aplikace je soubor XML, který můžete upravit pomocí textového editoru. Chcete-li vytvořit vlastní soubor deskriptoru aplikace, určete požadované hodnoty úpravou těchto hodnot. Výchozí hodnoty jsou zobrazeny zde:
• id = com.adobe.example.název_swf • fileName = název_swf • name = název_swf • version = 1.0 • description = blank • copyright = blank • initialWindow • title = name • content = název_swf.swf • systemChrome = standard, type = normal • transparent = false • visible = true • icon • image128x128 = icons/AIRApp_128.png • image48x48 = icons/AIRApp_48.png • image32x32 = icons/AIRApp_32.png • image16x16 = icons/AIRApp_16.png • customUpdateUI = false • allowBrowserInvocation = false Další informace o souboru deskriptoru aplikace naleznete v části „Nastavení vlastností aplikace AIR“ na stránce 43.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 21 Aktualizace Adobe AIR pro program Flash CS3 Professional
Podepisování aplikace Všechny aplikace Adobe AIR je třeba podepsat, aby je bylo možno nainstalovat do jiného systému. Program Flash nicméně poskytuje možnost vytvořit nepodepsané soubory instalátoru Adobe AIR, takže lze aplikaci podepsat později. Tyto nepodepsané soubory instalátoru Adobe se označují jako balíček AIRI. Tato možnost zajišťuje případy, kdy je certifikát v jiném počítači nebo je podepisování zpracováváno od vývoje aplikace odděleně. Podpis aplikace Adobe AIR pomocí předem zakoupeného digitálního certifikátu od kořenového certifikačního úřadu 1 Klepněte v dialogovém okně AIR – Nastavení aplikace a instalátoru v části Digitální podpis na tlačítko Nastavit. Otevře se dialogové okno Digitální podpis. Toto dialogové okno obsahuje dvě přepínací tlačítka, která slouží buď k podpisu aplikace Adobe AIR pomocí digitálního certifikátu nebo k přípravě balíčku AIRI. Pokud svou aplikaci AIR podepisujete, můžete buď použít digitální certifikát udělený kořenovým certifikačním úřadem nebo vytvořit certifikát s vlastním podpisem (selfsigned certificate). Certifikát s vlastním podpisem lze jednoduše vytvořit, není ale tak důvěryhodný jako certifikát, který byl udělen kořenovým certifikačním úřadem.
Dialogové okno Digitální podpis sloužící k podpisu aplikace AIR
2 Vyberte soubor certifikátu z rozbalovací nabídky nebo přejděte k souboru certifikátu po klepnutí na tlačítko
Procházet. 3 Vyberte certifikát. 4 Zadejte heslo. 5 Klepněte na tlačítko OK.
Další informace o podepisování aplikace AIR naleznete v části „Digitální podepisování souboru AIR“ na stránce 310. Vytvoření digitálního certifikátu s vlastním podpisem 1 Klepněte na tlačítko Vytvořit. Otevře se dialogové okno Digitální certifikát s vlastním podpisem. 2 Vyplňte položky Jméno vydavatele, Útvar organizace, Název organizace, Země, Heslo a Potvrzení hesla. 3 Určete typ certifikátu.
Volba Typ označuje úroveň zabezpečení, kterou certifikát využívá: 1024-RSA používá 1024bitový klíč (méně zabezpečený), 2048-RSA 2048bitový (více zabezpečený).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 22 Aktualizace Adobe AIR pro program Flash CS3 Professional
4 Uložte informaci do souboru certifikátu – vyplňte položku Uložit jako nebo přejděte do umístění složky po klepnutí
na tlačítko Procházet. 5 Klepněte na tlačítko OK. 6 Zadejte v dialogovém okně Digitální podpis heslo, které jste přiřadili v druhém kroku tohoto postupu, a klepněte
na tlačítko OK. Po nastavení digitálního certifikátu se tlačítko Nastavit změní na tlačítko Změnit. Aby si program Flash zapamatoval heslo, které jste pro tuto relaci použili, klepněte na možnost Pamatovat si heslo pro tuto relaci. Pokud je při klepnutí na tlačítko OK odznačena volba Časové razítko, objeví se dialogové okno s varováním, že po vypršení platnosti digitálního certifikátu bude instalace neúspěšná. Pokud v reakci na toto varování klepnete na tlačítko Ano, je používání časového razítka zakázáno. Pokud klepnete na tlačítko Ne, vybere se volba Časové razítko automaticky a používání časového razítka je povoleno. Další informace o vytvoření digitálního certifikátu s vlastním podpisem naleznete v části „Digitální podepisování souboru AIR“ na stránce 310. Můžete také vytvořit aplikaci AIRI (AIR Intermediate), která digitální podpis neobsahuje. Uživatelé ale tuto aplikaci nemohou do počítače nainstalovat do té doby, než přidáte digitální podpis. Příprava balíčku AIRI s pozdějším přidáním podpisu ❖ Vyberte v dialogovém okně Digitální podpis přepínací tlačítko Připravit balíček AIRI, který bude podepsán později a klepněte na tlačítko OK. Stav digitálního podpisu se změní, aby informoval o tom, že jste si vybrali přípravu balíčku AIRI, který bude podepsán později, a tlačítko Nastavit se změní na tlačítko Změnit.
23
Kapitola 7: Zabezpečení aplikace AIR Toto téma popisuje problematiku zabezpečení, které byste měli zvážit při vývoji aplikací AIR.
Základy zabezpečení aplikace AIR Aplikace AIR se spouští se stejnými uživatelskými oprávněními, jako nativní aplikace. Obecně tato oprávnění umožňují široký přístup k možnostem operačního systému, například ke čtení a zápisu souborů, spouštění aplikací, vykreslování na obrazovce a komunikaci se sítí. Omezení operačního systému, která platí pro nativní aplikace, například uživatelsky specifická oprávněná, platí shodně pro aplikace AIR. I když model zabezpečení aplikace Adobe® AIR™ je vývojem modelu zabezpečení aplikace Adobe® Flash® Player, dohoda o zabezpečení je odlišná od způsobu použitého pro obsah v prohlížeči. Tato dohoda nabízí vývojářům bezpečné prostředky pro širší funkce, pro větší svobodu, která by byla pro aplikace na základě prohlížeče nepříslušná. Aplikace AIR jsou zapsány buď se zkompilovaným bajtovým kódem (obsah SWF) nebo interpretovaným skriptem (JavaScript, HTML), takže chod programu zajišťuje správu paměti. To minimalizuje možnost, že aplikace AIR budou ovlivněny zranitelností související se správou paměti, například přetečením vyrovnávací paměti, nebo narušením paměti. Existují některé nejběžnější zranitelnosti, které ovlivňují počítačové aplikace napsané v nativním kódu.
Instalace a aktualizace Aplikace AIR jsou distribuovány prostřednictvím souborů instalačního programu, který používá příponu air. Když je aplikace Adobe AIR nainstalována a soubory instalačního programu jsou otevřeny, chod programu spravuje celý proces instalace. Poznámka: Vývojáři mohou specifikovat verzi, název aplikace a zdroj vydavatele, ale počáteční pracovní postup instalace aplikace samotný modifikovat nelze. Toto omezení je výhodné pro uživatele, protože všechny aplikace AIR sdílejí bezpečný, přímý a konzistentní postup instalace, řízený chodem programu. Pokud je uzpůsobení aplikace nutné, může být provedeno při prvním spuštění aplikace.
Umístění instalace modulu runtime Aplikace AIR nejprve vyžaduje nainstalování modulu runtime do počítače uživatele, stejně jako soubory SWF nejprve vyžadují nainstalování zásuvného modulu přehrávače Flash Player. Modul runtime je nainstalován do následujícího umístění v počítači uživatele:
• Mac OS: /Library/Frameworks/ • Windows: C:\Program • Linux: /opt/Adobe
Files\Common Files\Adobe AIR
AIR/
V systému Mac OS musí mít uživatel pro instalaci aktualizované verze aplikace odpovídající systémová práva k instalaci adresáře aplikace. V systémech Windows a Linux musí mít uživatel oprávnění správce.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 24 Zabezpečení aplikace AIR
Modul runtime může být nainstalován dvěma způsoby: pomocí funkce plynulé instalace (instalace přímo z webového prohlížeče) nebo prostřednictvím manuální instalace. Další informace naleznete v kapitole „Distribuce, Instalace a Spuštění aplikací AIR“ na stránce 301.
Plynulá instalace (modulu runtime a aplikace) Plynulá instalace poskytuje vývojáři možnost plynule instalovat aplikaci pro uživatele, kteří ještě nemají nainstalovanou aplikaci Adobe AIR. Metoda plynulé instalace umožňuje vývojáři vytvořit soubor SWF, který představuje aplikaci pro instalování. Když uživatel klepne na soubor SWF pro instalování aplikace, soubor SWF se pokusí detekovat modul runtime. Pokud modul runtime nelze detekovat, je nainstalován a aktivuje se ihned po spuštění procesu instalace aplikace vývojáře.
Ruční instalace Alternativně může uživatel ručně stáhnout a nainstalovat modul runtime před otevřením souboru AIR. Vývojář může poté distribuovat soubor AIR pomocí jiných prostředků (například prostřednictvím emailu, nebo odkazu HTML na webové stránky). Když je soubor AIR otevřen, modul runtime začne zpracovávat instalaci aplikace. Další informace o tomto procesu naleznete v kapitole „Distribuce, Instalace a Spuštění aplikací AIR“ na stránce 301
Průběh instalace aplikace Model zabezpečení aplikace AIR umožňuje uživateli rozhodnout se, zda aplikaci AIR nainstaluje. Instalace aplikace AIR poskytuje několik zlepšení ve srovnání s technologiemi instalace nativních aplikací, což pro uživatele činí celý rozhodovací proces důvěryhodnější:
• Modul runtime poskytuje pohodlný instalační proces pro všechny operační systémy, i s aplikací AIR nainstalovanou prostřednictvím odkazu na webový prohlížeč. Většina postupů instalací nativních aplikací závisí na prohlížeči nebo jiné aplikaci, které musí poskytnout informace o zabezpečení, pokud jsou vůbec poskytnuty.
• Postup instalace aplikace AIR identifikuje zdroj aplikace a informace o tom, která oprávnění jsou pro aplikaci dostupná (pokud uživatel umožní aplikaci pokračovat).
• Modul runtime řídí proces instalace aplikace AIR. Aplikace AIR nemůže manipulovat s procesem instalace, který modul runtime používají. Obecně uživatelé nemohou nainstalovat žádné aplikace, které pocházejí ze zdroje, kterému nedůvěřují, nebo který nelze ověřit. Břemeno dokladování zabezpečení pro nativní aplikace je stejné pro aplikace AIR, jako pro ostatní instalovatelné aplikace.
Cílové místo aplikace Instalační adresář může být nastaven pomocí jedné z následujících možností: 1 Uživatel uzpůsobuje cílové umístění během instalace. Aplikace se nainstaluje tam, kam uživatel specifikuje. 2 Pokud uživatel nezmění cílové umístění instalace, instalace aplikace do výchozí cesty bude taková, jak je stanoveno
chodem programu:
• Mac OS: ~/Applications/ • Windows XP a dřívější: C:\Program • Windows Vista: ~/Apps/ • Linux: /opt/
Files\
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 25 Zabezpečení aplikace AIR
Pokud vývojář specifikuje nastavení installFolder v propisovacím souboru aplikace, aplikace se nainstaluje do podřízené cesty tohoto adresáře.
Systém souborů AIR Proces instalace aplikací AIR kopíruje všechny soubory, které vývojář zahrne do instalačního souboru aplikace AIR do místního počítače uživatele. Instalovaná aplikace je tvořena následujícími součástmi:
• Windows: adresář obsahující všechny soubory zahrnuté do instalačního souboru aplikace AIR. Modul runtime rovněž vytvoří během instalace soubor EXE pro aplikaci AIR.
• Linux: Adresář obsahující všechny soubory zahrnuté do instalačního souboru prostředí AIR. Modul runtime rovněž vytvoří během instalace soubor .bin pro prostředí AIR.
• Mac OS: soubor app obsahující veškerý obsah instalačního souboru AIR. Zkontrolovat jej lze pomocí možnosti „Zobrazit obsah balíku“ ve Vyhledávači. Modul runtime vytvoří tento soubor app jako součást instalace aplikace AIR. Aplikace AIR je spuštěna takto:
• Windows: spuštění souboru .exe v instalační složce, nebo zástupce, který odpovídá tomuto souboru (například zástupce v nabídce Start nebo na pracovní ploše).
• Linux: Spuštění souboru .bin v instalační složce, výběr aplikace z nabídky aplikací nebo spuštění pomocí aliasu nebo ze zástupce na ploše.
• Mac OS: spuštění souboru .app nebo aliasu, který na něj ukazuje. Systém souborů aplikace rovněž zahrnuje podadresáře související s funkcí aplikace. Například, informace zapsané do šifrovaného lokálního umístění je uložena do podadresáře uloženého v adresáři pojmenovanému podle identifikátoru aplikace.
Uložení dat aplikace AIR Aplikace AIR má oprávnění pro zápis do kteréhokoliv umístění na pevném disku uživatele; nicméně vývojářům se doporučuje používat cestu app-storage:/ pro lokální uložení související s aplikací. Soubory zapsané do adresáře app-storage:/ aplikací jsou uloženy ve standardním umístění, v závislosti na operačním systému uživatele:
• V systému Mac OS: Adresář pro uložení dat aplikace je //Local
Store/, kde je
složka předvolená uživatelem, obvykle /Users/<user>/Library/Preferences
• V systému Windows: Adresář pro uložení dat aplikace je
\\Local Store\ , kde je speciální složka CSIDL_APPDATA, obvykle C:\Documents and Settings\<user>\Application Data
• V systému Linux: //Local
Store/, kde je složka /home/<user>/.appdata
Adresář uložení dat aplikace je přístupný prostřednictvím vlastnosti air.File.applicationStorageDirectory. K obsahu můžete přistupovat pomocí metody resolvePath() třídy File. Podrobnosti viz také „Práce se systémem souborů“ na stránce 104.
Aktualizace aplikace Adobe AIR Když uživatel nainstaluje aplikaci AIR, která vyžaduje aktualizovanou verzi modulu runtime, ten automaticky instaluje požadovanou aktualizaci. K aktualizaci modulu runtime potřebuje mít uživatel v počítači administrátorská práva.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 26 Zabezpečení aplikace AIR
Aktualizace aplikací AIR Vývoj a nasazení softwarových aplikací jsou jednou z největších bezpečnostních výzev, kterým čelí aplikace s nativním kódem. Rozhraní API aplikace AIR poskytuje mechanismus pro zlepšení: metoda Updater.update() může být vyvolána po spuštění ke kontrole vzdáleného umístění souboru AIR. Pokud je aktualizace správná, soubor AIR je stažen, nainstalován a aplikace se restartuje. Vývojáři mohou tuto třídu používat nejenom pro poskytnutí nové funkce, ale také pro reakci na potenciální bezpečnostní zranitelnosti. Poznámka: Vývojáři mohou specifikovat verzi aplikace nastavením vlastnosti version souboru popisovače aplikace. AIR řetězec žádným způsobem neinterpretuje. Tak verze „3.0“ není považována za aktuálnější, než verze „2.0“. Na vývojáři je udržení smysluplné stanovení verze. Další podrobné informace viz „Definování vlastností v souboru deskriptoru aplikace“ na stránce 44.
Odinstalování aplikace AIR Uživatel může odinstalovat aplikaci AIR:
• V systému Windows: pomocí ovládacího panelu Přidat/Odebrat programy se aplikace odstraní. • V systému Mac OS: odstranění souboru app z místa instalace. Odebráním aplikace AIR se odstraní všechny soubory v adresáři aplikace. Neodstraní se však soubory, které mohla aplikace zapsat mimo adresář aplikace. Odebráním aplikace AIR nevrací změny, které aplikace AIR provedla v souborech mimo adresář aplikace.
Odinstalování aplikace Adobe AIR Aplikace Adobe AIR může být odinstalována:
• V systému Windows: spuštěním funkce Přidat/Odebrat programy v Ovládacích panelech, vybráním položky Adobe AIR a zvolením tlačítka „Odebrat“.
• V systému Mac OS: spuštěním odinstalačního programu aplikace Adobe AIR v adresáři aplikace.
Nastavení registru Windows pro správce V systému Windows mohou správci nakonfigurovat počítač tak, aby zabránil (nebo umožnil) instalaci aplikace AIR a aktualizací modulu runtime. Tato nastavení jsou obsažena v registru Windows v následujícím klíči: HKLM\Software\Policies\Adobe\AIR. Zahrnují následující: Nastavení registru
Popis
AppInstallDisabled
Specifikuje, že instalace a odinstalace aplikace AIR jsou povoleny. Nastavte na hodnotu 0 = „povoleno“, nebo na hodnotu 1 = „zakázáno“.
UntrustedAppInstallDisabled
Specifikuje, že instalace nedůvěryhodných aplikací AIR (aplikace, které nezahrnují důvěryhodný certifikát) je povolena (viz „Digitální podepisování souboru AIR“ na stránce 310). Nastavte na hodnotu 0 = „povoleno“, nebo na hodnotu 1 = „zakázáno“.
UpdateDisabled
Specifikuje, že aktualizace modulu runtime je povolena, buď jako úkol na pozadí nebo jako součást explicitní instalace. Nastavte na hodnotu 0 = „povoleno“, nebo na hodnotu 1 = „zakázáno“.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 27 Zabezpečení aplikace AIR
Karantény zabezpečení Aplikace AIR poskytuje komplexní architekturu zabezpečení, která definuje oprávněné podle každého souboru v aplikaci AIR, interně i externě. Oprávnění jsou poskytnuta souborům podle jejich původu a jsou přiřazena do logických skupin zabezpečení, nazývaných karantény zabezpečení.
O karanténě zabezpečení aplikace AIR Model karantén zabezpečení modulu runtime je tvořen modelem zabezpečení aplikace Flash Player s doplněním karantény zabezpečení aplikace. Soubory, které nejsou v karanténě zabezpečení aplikace, mají bezpečnostní omezení podobná těm, která jsou specifikovaná v modelu zabezpečení aplikace Flash Player. Modul runtime používá karantény zabezpečení k definování rozsahu dat, ke kterým může kód přistupovat a operace, které může vykonávat. Pro uchování lokálního zabezpečení jsou soubory v každé karanténě zabezpečení izolovány od souborů jiných karantén zabezpečení. Například soubor SWF načtený do aplikace AIR z externí internetové adresy URL, je uložen do vzdálené karantény zabezpečení a nemá výchozí oprávnění pro skriptování souborů, které jsou uloženy v adresáři aplikace, které jsou přiřazeny do karantény zabezpečení aplikace. Následující tabulka popisuje každý typ karantény zabezpečení: Karanténa zabezpečení
Popis
application
Soubor je umístěn v aplikačním adresáři a pracuje s úplnou sadou oprávnění AIR.
remote
Soubor pochází z internetové adresy URL a pracuje podle doménových pravidel karantény zabezpečení, analogických k pravidlům, která platí pro vzdálené soubory aplikace Flash Player. (Jedná se o samostatné karantény zabezpečení pro každou síťovou doménu, například http://www.example.com a https://foo.example.org.)
local-trusted
Soubor je lokální a uživatel jej označil jako důvěryhodný, pomocí Správce nastavení nebo důvěryhodného konfiguračního souboru aplikace Flash Player. Soubor může číst lokální datové zdroje a komunikovat s Internetem, ale nemá úplnou sadu oprávnění AIR.
local-with-networking
Soubor je lokální soubor SWF publikovaný s označením sítě, ale nebyl pro uživatele explicitně důvěryhodný. Tento soubor může komunikovat s Internetem, ale nemůže číst z lokálních datových zdrojů. Tato karanténa zabezpečení je dostupná pouze pro obsah SWF.
local-with-filesystem
Soubor je lokální skriptovací soubor, který nebyl publikovaný s označením sítě, ale nebyl pro uživatele explicitně důvěryhodný. Patří sem soubory JavaScript, které nebyly důvěryhodné. Soubor může číst z lokálních datových zdrojů, ale nemůže komunikovat s Internetem.
Toto téma se zaměřuje primárně na karanténu zabezpečení aplikace a její vztah s ostatními karanténami zabezpečení v aplikaci AIR. Vývojáři, kteří používají obsah přiřazený k ostatním karanténám zabezpečení by si měli dále prostudovat dokumentaci modelu zabezpečení aplikace Flash Player. Viz kapitola „Zabezpečení aplikace Flash Player“ v dokumentu Programování v jazyce ActionScript 3.0 (http://www.adobe.com/go/flashcs4_prog_as3_security_cz) a dokumentech Flash Player 9 Security (Zabezpečení aplikace Flash Player 9) (http://www.adobe.com/go/fp9_0_security) nebo Flash Player 10 Security (Zabezpečení aplikace Flash Player 10) (http://www.adobe.com/go/fp10_0_security_cz).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 28 Zabezpečení aplikace AIR
Karanténa zabezpečení aplikace Když je aplikace nainstalovaná, všechny soubory obsažené v instalačním programu jsou nainstalovány v počítači uživatele do adresáře aplikace. Vývojáři mohou odkazovat na tento adresář v kódu prostřednictvím schématu URL app:/ (viz „Používání schémat URL AIR v adresách URL“ na stránce 296). Všechny soubory stromové struktury adresářů aplikace jsou přiřazeny do karantény zabezpečení aplikace, když je aplikace spuštěna. Obsah v karanténě zabezpečení aplikace má všechna oprávnění dostupná pro aplikaci AIR, včetně interakce s lokálním souborovým systémem. Mnoho aplikací AIR používá pro spuštění aplikace pouze tyto lokálně nainstalované soubory. Nicméně aplikace AIR nejsou omezeny pouze na soubory v adresáři aplikace - mohou načítat jakýkoliv typ soubor z libovolného zdroje. Patří sem lokální soubory pro počítač uživatele a také soubory z dostupných externích zdrojů, například místní sítě nebo Internetu. Typ souboru nemá žádný dopad na omezení zabezpečení; načtené soubory HTML mají stejná bezpečnostní oprávnění, jako načtené soubory SWF ze stejného zdroje. Obsah v karanténě zabezpečení aplikace má přístup k rozhraní API aplikace AIR, jehož obsah se v jiných karanténách nesmí používat. Například vlastnost air.NativeApplication.nativeApplication.applicationDescriptor, která vrací obsah souboru popisovače aplikace, je omezena na obsah karantény zabezpečení aplikace. Další příklad omezeného rozhraní API představuje třída FileStream, která obsahuje metody pro čtení a zápis místního systému souborů. Rozhraní API jazyka ActionScript, které je jediné dostupné pro obsah v karanténě zabezpečení aplikace, je indikováno logem AIR v Referenční příručka jazyka Flex 3.0 pro aplikaci Adobe AIR. Použití těchto rozhraní API v jiných karanténách zabezpečení způsobí, že modul runtime odešle výjimku SecurityError. Pro obsah HTML (v objektu HTMLLoader), jsou všechna rozhraní API jazyka JavaScript AIR (ta, která jsou dostupná prostřednictvím vlastnosti window.runtime nebo objektu air při použití souboru AIRAliases.js) dostupná pro obsah v karanténě zabezpečení aplikace. Obsah HTML v jiné karanténě zabezpečení nemá přístup k vlastnosti window.runtime,takže obsah nemůže přistupovat k rozhraní APU aplikace AIR.
Omezení pro JavaScript a HTML Pro obsah HTML v karanténě zabezpečení aplikace existují omezení, pro použití rozhraní API, která mohou dynamicky transformovat řetězce do spustitelného kódu poté, co byl kód načten. Tak tomu je proto, aby aplikaci bylo zabráněno v náhodném vložení (a spuštění) kódu z neaplikačních zdrojů (například jako potenciálně nezabezpečené síťové domény). Příkladem je použití funkce eval(). Podrobnosti viz také „Omezení kódu pro obsah v různých karanténách zabezpečení“ na stránce 31.
Omezení ve značkách img v obsahu textového pole jazyka ActionScript Na ochranu před možnými phishingovými útoky jsou značky img v obsahu HTML v objektech TextField jazyka ActionScript ignorovány v obsahu SWF v karanténě zabezpečení aplikace.
Omezení pro asfunction Obsah v karanténě zabezpečení aplikace nemůže použít protokol asfunction v obsahu HTML v textovém poli ActionScript 2.0.
Žádný přístup k trvalé mezidoménové vyrovnávací paměti Obsah SWF v karanténě zabezpečení aplikace nemůže používat mezidoménovou vyrovnávací paměť, funkce byla přidána do 3. aktualizace aplikace Flash Player 9. Tato funkce umožňuje aplikaci Flash Player trvale ukládat do vyrovnávací paměti obsah součástí platformy Adobe a používat jej v načteném obsahu SWF na vyžádání (eliminuje se tak potřeba několikerého načtení obsahu).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 29 Zabezpečení aplikace AIR
Oprávnění obsahu v neaplikačních karanténách zabezpečení Soubory načtené ze sítě nebo internetového umístění jsou přiřazeny do remote (vzdálené) karantény zabezpečení. Soubory načtené z vnějšku adresáře aplikace jsou přiřazeny buď karanténě zabezpečení local-with-filesystem (lokální-se-systémem souborů), local-with-networking (lokální-se-sítí) nebo local-trusted (lokálnídůvěryhodný); to závisí na tom, jak byl soubor vytvořen a zda uživatel explicitně důvěřoval souboru prostřednictvím Správce globálního nastavení aplikace Flash Player. Podrobnosti viz http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager.html.
Omezení pro JavaScript a HTML Na rozdíl od obsahu v karanténě zabezpečení aplikace, obsah jazyka JavaScript v neaplikační karanténě zabezpečení může kdykoliv volat funkci eval() pro vykonání dynamicky generovaného kódu. Existují však omezení jazyka JavaScript v neaplikační karanténě zabezpečení. Patří sem:
• Kód JavaScript v neaplikační karanténě zabezpečení nemá přístup do objektu window.runtime a takový kód nemůže rozhraní API aplikace AIR vykonat.
• Standardně obsah v neaplikační karanténě zabezpečení nemůže použít volání XMLHttpRequest pro načtení dat z jiné domény, kromě domény volající daný požadavek. Kód aplikace však může zaručit toto oprávnění neaplikačnímu obsahu a to nastavením atributu allowCrossdomainXHR v obsaženém snímku nebo snímku iframe. Další informace viz „Skriptování mezi obsahem v různých doménách“ na stránce 35.
• Existují omezení volání metody window.open() jazyka JavaScript. Podrobnosti viz také „Omezení pro volání metody JavaScript window.open()“ na stránce 34. Podrobnosti viz také „Omezení kódu pro obsah v různých karanténách zabezpečení“ na stránce 31.
Omezení pro načítání CSS, snímku, snímku iframe a prvků img Obsah HTML ve vzdálených (síťových) karanténách zabezpečení může načítat pouze obsah CSS, frame, iframe a img ze vzdálených domén (ze síťových adres URL). Obsah HTML v karanténách zabezpečení lokální-se-systémem souborů, lokální-se-sítí nebo lokální-důvěryhodný mohou pouze načítat obsah CSS, frame, iframe a img z místních karantén zabezpečení (nikoliv z aplikačních nebo síťových adres URL).
Zabezpečení HTML Modul runtime si vynucuje pravidla a poskytuje mechanismy pro překonávání možných zranitelností zabezpečení v kódu HTML a JavaScript. Stejná pravidla jsou vynucena bez ohledu na to, zda je aplikace primárně napsána v jazyce JavaScript nebo zda načítáte obsah HTML a JavaScript v aplikaci založené na SWF. Obsah v karanténě zabezpečení aplikace a v neaplikační karanténě zabezpečení (viz „Karantény zabezpečení“ na stránce 27) mají odlišná oprávnění. Při načítání obsahu do iframe nebo frame, modul runtime poskytuje zabezpečený mechanismu můstku karantén zabezpečení, který umožňuje obsahu v frame nebo iframe komunikovat zabezpečeným způsobem s obsahem v karanténě zabezpečení aplikace. Toto téma popisuje architekturu zabezpečení AIR HTML a jak používat snímky iframes, snímky a můstek karantény zabezpečení pro nastavení aplikace. Další informace viz také „Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením“ na stránce 228.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 30 Zabezpečení aplikace AIR
Přehled konfigurování aplikací HTML Snímky a snímky iFrames poskytují pohodlnou strukturu pro organizování obsahu HTML v aplikaci AIR. Snímky poskytují prostředky pro zajištění trvalosti data a pro bezpečnou práci se vzdáleným obsahem. Protože HTML v aplikaci AIR udržujte normální, stránkovou organizaci, prostředí HTML se zcela aktualizuje v případě, že horní snímek obsahu HTML se „naviguje” na jinou stránku. Můžete použít snímky a snímky iframes k údržbě trvalosti dat v AIR, stejně jako by tomu bylo pro webové aplikace spuštěné v prohlížeči. Definujte hlavní objekty aplikace v horním snímku, které přetrvají, dokud neumožníte snímku přejít na novou stránku. Použijte závislé snímky nebo snímky iFrames k načtení a zobrazení přechodových součástí aplikace. (Existuje mnoho způsobů údržby trvalosti dat, které lze použít navíc ke snímkům, nebo místo nich. Patří sem soubory cookies, místní sdílené objekty, místní úložiště souborů, šifrované úložiště souborů a úložiště místní databáze.) Protože si kód jazyka HTML v prostředí AIR uchovává své normální nejasné rozdělení mezi spustitelným kódem a daty, umisťuje prostředí AIR horní snímek prostředí HTML do karantény zabezpečení aplikace. Po události stránky load omezí prostředí AIR všechny operace, například eval(), které mohou převádět řetězec textu na spustitelný objekt. Toto omezení je vynuceno i v případě, že aplikace nenačte vzdálený obsah. Chcete-li umožnit, aby obsah HTML mohl tyto omezené operace spouštět, je třeba použít snímky nebo snímky iframes k umístění obsahu do neaplikační karantény. (Když používáte některé rámce aplikací jazyka JavaScript, které jsou založeny na funkci eval(), bude patrně nutné obsah spustit v podřízeném snímku v karanténě.) Úplný seznam omezení jazyka JavaScript v karanténě zabezpečení aplikace, viz také „Omezení kódu pro obsah v různých karanténách zabezpečení“ na stránce 31. Protože si HTML v aplikaci AIR uchovává schopnost načítat vzdálený, patrně nezabezpečený obsah, aplikace AIR si vynucuje zásady, které zabraňují obsahu v jedné doméně, aby spolupracoval s obsahem v jiné doméně. Aby byla možná spolupráce mezi obsahem aplikace a obsahem v jiné doméně, nastavte můstek, který bude sloužit jako rozhraní mezi řídicím a závislým snímkem.
Nastavení vztahu mezi řídicí a závislou karanténou zabezpečení Aplikace AIR přidá atributy sandboxRoot a documentRoot do prvků frame a iframe v HTML. Tyto atributy umožní jednat s obsahem aplikace, jako by pocházel z jiné domény. Atribut
Popis
sandboxRoot
Adresa URL, kterou použijete pro stanovené karantény zabezpečení a domény, do které umístíte obsah snímku. Je třeba použít schéma URL file:, http: nebo https:.
documentRoot
Adresa URL, ze které se nahrává obsah snímku. Je třeba použít schéma URL file:, app: nebo app-storage:.
Následující příklad mapuje obsah nainstalovaný v podadresáři karantény zabezpečení aplikace, který se spustí ve vzdálené karanténě zabezpečení a v doméně www.example.com: <iframe src="ui.html" sandboxRoot="http://www.example.com/local/" documentRoot="app:/sandbox/">
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 31 Zabezpečení aplikace AIR
Nastavení můstku mezi řídicími a závislými snímky v různých karanténách zabezpečení nebo doménách Aplikace AIR přidává vlastnosti childSandboxBridge a parentSandboxBridge do objektu window kteréhokoliv závislého snímku. Tyto vlastnosti umožňují definovat mosty, které slouží jako rozhraní mezi řídicím a závislým snímkem. Každý snímek se pohybuje jedním směrem: childSandboxBridge - vlastnost childSandboxBridge umožňuje závislému snímku zpřístupnit rozhraní obsahu v řídicím snímku. Chcete-li zpřístupnit rozhraní, nastavte vlastnost childSandbox na funkci nebo objekt v závislém snímku. Můžete pak přistupovat k objektu nebo funkci z obsahu v řídicím snímku. Následující příklad ukazuje, jakým způsobem může skript spuštěný v závislém snímku zpřístupnit objekt obsahující funkci a vlastnost pro řídicí objekt: var interface = {}; interface.calculatePrice = function(){ return .45 + 1.20; } interface.storeID = "abc" window.childSandboxBridge = interface;
Pokud je závislý obsah ve snímku iframe přiřazen id pro "child", můžete zpřístupnit rozhraní z řídicího obsahu načtením vlastnosti childSandboxBridge snímku: var childInterface = document.getElementById("child").childSandboxBridge; air.trace(childInterface.calculatePrice()); //traces "1.65" air.trace(childInterface.storeID)); //traces "abc" parentSandboxBridge - vlastnost parentSandboxBridge umožňuje řídicímu snímku zpřístupnit rozhraní obsahu v závislém snímku. Chcete-li zpřístupnit rozhraní, nastavte vlastnost parentSandbox závislého snímku na funkci nebo objekt v řídicím snímku. Můžete pak přistupovat k objektu nebo funkci z obsahu v závislém snímku. Následující příklad ukazuje, jak skript spuštěný v řídicím snímku může zpřístupnit objekt obsahující funkci uložení pro závislý objekt: var interface = {}; interface.save = function(text){ var saveFile = air.File("app-storage:/save.txt"); //write text to file } document.getElementById("child").parentSandboxBridge = interface;
Pomocí tohoto rozhraní může obsah v závislém snímku uložit text do souboru pojmenovaného save.txt. Nicméně nebude mít žádný jiný přístup do systému souborů. Obecně by měl obsah aplikace zpřístupnit ostatním karanténám zabezpečení nejužší možné rozhraní. Podřízený obsah by mohl vyvolat funkci save následujícím způsobem: var textToSave = "A string."; window.parentSandboxBridge.save(textToSave);
Pokud se podřízený obsah pokusí nastavit vlastnost objektu parentSandboxBridge, modul runtime odešle výjimku SecurityError. Pokud se řídicí obsah pokusí nastavit vlastnost objektu childSandboxBridge, modul runtime odešle výjimku SecurityError.
Omezení kódu pro obsah v různých karanténách zabezpečení Jak bylo popsáno v úvodu tohoto tématu, „Zabezpečení HTML“ na stránce 29, modul runtime si vynucuje pravidla a poskytuje mechanismy pro překonání možných bezpečnostních zranitelností v HTML a jazyce JavaScript. Toto téma popisuje uvedená omezení. Pokud se kód pokusí zavolat tato omezená rozhraní API, modul runtime odešle chybu s hlášením „Narušení bezpečnosti modulu runtime aplikace Adobe AIR pro kód JavaScript v karanténě zabezpečení aplikace.“
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 32 Zabezpečení aplikace AIR
Další informace viz také „Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením“ na stránce 228.
Omezení pro používání funkce eval() jazyka JavaScript a podobných technik Pro obsah HTML v karanténě zabezpečení aplikace existují omezení pro použití rozhraní API, které může dynamicky transformovat řetězce do spustitelného kódu poté, co je kód načten (po odeslání události onload prvku body a dokončení spouštění funkce manipulačního programu onload). Tak tomu je proto, aby aplikaci bylo zabráněno v náhodném vložení (a spuštění) kódu z neaplikačních zdrojů (například jako potenciálně nezabezpečené síťové domény). Pokud například aplikace použijte data řetězce ze vzdáleného zdroje pro zápis vlastnosti innerHTML prvku DOM, řetězec by mohl zahrnovat spustitelný kód (JavaScript), který může provádět nezabezpečené operace. Nicméně, zatímco se načítá obsah, nehrozí žádné riziko vložení vzdálených řetězců do DOM. Jedním omezením je použití funkce eval() jazyka JavaScript. Jakmile je kód v karanténě zabezpečení aplikace načten a po zpracování události onload manipulačním programem, můžete funkci eval() použít pouze omezenými způsoby. Následující pravidla platí pro použití funkce eval()poté, co byl kód načten z karantény zabezpečení aplikace.
• Literály objektů jsou povoleny, jako v následujícím příkladu: { prop1: val1, prop2: val2 }
• Literál objektu setter/getter je zakázán, jako v následujícím příkladu: { get prop1() { ... }, set prop1(v) { ... } }
• Literály polí jsou povoleny, jako v následujícím příkladu: [ val1, val2, val3 ]
• Výrazy zahrnující čtení vlastností jsou zakázány, jako v následujícím příkladu: a.b.c
• Vyvolání funkce je zakázáno. • Definice funkcí jsou zakázány. • Nastavení kterékoliv vlastnosti je zakázáno. • Literály funkcí jsou zakázány. Nicméně, když se načítá kód, před událostí onload a během vykonávání události onload manipulačním programem, tato omezení neplatí pro obsah v karanténě zabezpečení aplikace. Například po načtení kódu vede následující kód k tomu, že modul runtime odešle výjimku: eval("alert(44)"); eval("myFunction(44)"); eval("NativeApplication.applicationID");
Dynamicky generovaný kód, například takový, který vznikne při zavolání funkce eval(), bude znamenat bezpečnostní riziko v případě, že mu bude umožněn přístup do karantény zabezpečení aplikace. Například aplikace může náhodně vykonat řetězec načtený ze síťové domény a tento řetězec může obsahovat škodlivý kód. Například toto může být kód, který odstraní nebo změní soubory v počítači uživatele. Nebo se může jednat o kód, který nahlásí obsah místního souboru nedůvěryhodné síťové doméně.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 33 Zabezpečení aplikace AIR
Způsoby generování dynamického kódu jsou následující:
• Zavolání funkce eval(). • Použití vlastností innerHTML nebo funkcí DOM pro vložení značek skriptu, které načtou skript mimo adresář aplikace.
• Použití vlastností innerHTML nebo funkcí DOM pro vložení značek skriptu, které mají vřazený kód (spíše než načtení skriptu prostřednictvím atributu src).
• Nastavení atributu src pro značky script pro načtení souboru jazyka JavaScript, který je mimo adresář aplikace. • Použití schémata URL javascript (jako v href="javascript:alert('Test')"). • Použití funkcí setInterval() nebo setTimout(), kde první parametr (definující funkci pro asynchronní spuštění) je řetězec (bude se hodnotit), spíše než název funkce (jako v setTimeout('x = 4', 1000)).
• Volání document.write() nebo document.writeln(). Kód v karanténě zabezpečení aplikace může používat tyto metody pouze v případě, že se načítá obsah. Tato omezení nezabraňují použití eval() s literály objektu JSON. Umožňuje pracovat obsahu aplikace s knihovnou JSON JavaScript. Jste však omezeni v používání přetíženého kódu JSON (s manipulačními programy událostí). Vzhledem k dalším strukturám Ajax a knihovnám kódu JavaScript je nutné si ověřit, zda struktura nebo knihovna pracuje s těmito omezeními a dynamicky generovaným kódem. Pokud tomu tak není, zahrňte kterýkoliv obsah používající strukturu nebo knihovnu do neaplikační karantény zabezpečení. Podrobnosti viz také „Oprávnění obsahu v neaplikačních karanténách zabezpečení“ na stránce 29 a „Skriptování mezi aplikačním a neaplikačním obsahem“ na stránce 39. Společnost Adobe uchovává seznam struktury Ajax známé svou podpornou karantény zabezpečení aplikace na adrese http://www.adobe.com/products/air/develop/ajax/features/. Na rozdíl od obsahu v karanténě zabezpečení aplikace, obsah jazyka JavaScript v neaplikační karanténě zabezpečení může kdykoliv volat funkci eval() pro vykonání dynamicky generovaného kódu.
Omezení přístupu k rozhraní API aplikace AIR (pro neaplikační karantény zabezpečení) Kód JavaScript v neaplikační karanténě zabezpečení nemá přístup do objektu window.runtime a takový kód nemůže rozhraní API aplikace AIR vykonat. Pokud obsah v neaplikační karanténě zabezpečení zavolá následující kód, aplikace odešle výjimku TypeError. try { window.runtime.flash.system.NativeApplication.nativeApplication.exit(); } catch (e) { alert(e); }
Typ výjimky je TypeError (nedefinovaná hodnota), protože obsah v neaplikační karanténě zabezpečení nerozpozná objekt window.runtime, takže je vidět jako nedefinovaná hodnota. Funkci modulu runtime můžete zpřístupnit obsah v neaplikační karanténě zabezpečení pomocí mostu skriptu. Podrobnosti viz také „Skriptování mezi aplikačním a neaplikačním obsahem“ na stránce 39.
Omezení při používání volání XMLHttpRequest Obsah HTML v karanténě zabezpečení aplikace nemůže používat synchronní metody XMLHttpRequest pro načtení data z vnější strany karantény zabezpečení aplikace, když se načítá obsah HTML a během události onLoad.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 34 Zabezpečení aplikace AIR
Standardně obsah HTML v neaplikační karanténě zabezpečení nesmí používat objekt JavaScript XMLHttpRequest k načtení dat z domén jiných, než jsou domény volající požadavek. Značka frame nebo iframe může zahrnovat atribut allowcrosscomainxhr. Nastavení tohoto atributu na nenulovou hodnotu umožní obsahu v snímku nebo snímku iframe použít objekt Javascript XMLHttpRequest k načtení dat z domén jiných, než jsou domény kódu volajícího požadavek: <iframe id="UI" src="http://example.com/ui.html" sandboxRoot="http://example.com/" allowcrossDomainxhr="true" documentRoot="app:/">
Další informace viz „Skriptování mezi obsahem v různých doménách“ na stránce 35.
Omezení pro načítání prvků CSS, frame, iframe a img (pro obsah v neaplikačních karanténách zabezpečení) Obsah HTML ve vzdálených (síťových) karanténách zabezpečení může načítat pouze obsah CSS, frame, iframe a img ze vzdálených karantén zabezpečení(ze síťových adres URL). Obsah HTML v karanténách zabezpečení lokální-se-systémem souborů, lokální-se-sítí nebo lokální-důvěryhodný mohou pouze načítat obsah CSS, img, iframe a img z místních karantén zabezpečení (nikoliv z aplikačních nebo vzdálených karantén zabezpečení).
Omezení pro volání metody JavaScript window.open() Pokud okno vytvořené voláním metody JavaScript window.open() zobrazí obsah z neaplikační karantény zabezpečení, název okna začíná názvem hlavního (spouštěcího) okna, poté následující znak dvojtečky. Nemůžete používat kód k přesunutí této části názvu okna mimo obrazovku. Obsah v neaplikačních karanténách zabezpečení může zavolat úspěšně metodu JavaScript window.open() pouze v případě odezvy na událost aktivovanou myší nebo klávesnicí uživatele. To zabraňuje neaplikačnímu obsahu ve vytváření oken, které mohou být použity pro škodlivé operace (například phishingové útoky). Manipulační program událostí pro událost myši nebo klávesnice nemůže nastavit metodu window.open() tak, aby se vykonala po prodlevě (například zavoláním funkce setTimeout()). Obsah ve vzdálené (síťové) karanténě zabezpečení může použít metodu window.open() pouze k otevření obsahu ve vzdálených síťových karanténách zabezpečení. Nemůže používat metodu window.open() k otevření obsahu z aplikační nebo lokální karantény zabezpečení. Obsah v karanténě zabezpečení typu lokální-se-systémem souborů, lokální-se-sítí, nebo lokální-důvěryhodné (viz „Karantény zabezpečení“ na stránce 27 ), může použít metodu window.open() pouze k otevření obsahu v lokální karanténě zabezpečení. Nemůže používat metodu window.open() k otevření obsahu z aplikační nebo vzdálené karantény zabezpečení.
Chyby při volání omezeného kódu Jestliže voláte kód, který má kvůli těmto omezením vyplývajícím ze zabezpečení zakázáno používat karanténu, odešle běhový modul chybu jazyka JavaScript: „Narušení bezpečnosti běhu aplikace Adobe AIR pro kód JavaScript v karanténě zabezpečení aplikace“. Další informace viz také „Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením“ na stránce 228.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 35 Zabezpečení aplikace AIR
Ochrana karantény zabezpečení při načítání obsahu HTML z řetězce Metoda loadString() třídy HTMLLoader slouží k vytvoření obsahu HTML za běhu. Data, která využíváte jako obsah HTML, ale mohou být poškozena, pokud jsou načítána z nezabezpečeného internetového zdroje. Z tohoto důvodu není ve výchozím nastavení kód jazyka HTML vytvořený pomocí metody loadString() umisťovaný do karantény zabezpečení aplikace a nemá přístup k rozhraním API prostředí AIR. Pokud ale chcete kód jazyka HTML vytvořený pomocí metody loadString() umístit do karantény zabezpečení, můžete nastavit vlastnost placeLoadStringContentInApplicationSandbox objektu HTMLLoder na hodnotu true. Další informace naleznete v části „Načtení obsahu HTML z řetězce“ na stránce 226.
Skriptování mezi obsahem v různých doménách Aplikace AIR mají speciální oprávnění, když jsou nainstalovány. Je důležité, že stejná oprávnění nesmí uniknout k jinému obsahu, včetně vzdálených souborů a místních souborů, které nejsou součástí aplikace.
O mostu karantény zabezpečení aplikace AIR Normálně obsah z jiných domén nemůže volat skripty v jiných doménách. K ochraně aplikací AIR před náhodnými úniky informací o oprávnění nebo řízení jsou pro obsah použita následující omezení v karanténě zabezpečení application (obsah nainstalovaný s aplikací):
• Kód v karanténě zabezpečení aplikace nemůže povolit jiné karantény zabezpečení zavoláním metody Security.allowDomain(). Volání této metody z karantény zabezpečení aplikace vyvolá chybu.
• Importování neaplikačního obsahu do karantény zabezpečení aplikace nastavením vlastnosti LoaderContext.securityDomain nebo LoaderContext.applicationDomain je zamezeno.
Existují stále případy, kde hlavní aplikace AIR vyžaduje, aby obsah ze vzdálené domény měl řízený přístup ke skriptům v hlavní aplikaci AIR, nebo naopak. K dosažení tohoto stavu modul runtime poskytuje mechanismu mostu karantény zabezpečení, který slouží jako brána mezi dvěma karanténami zabezpečení. Most karantény zabezpečení může poskytnout výslovnou interakci mezi vzdálenými a aplikačními karanténami zabezpečení. Most karantény zabezpečení zpřístupňuje dva objekty, ke kterým může přistupovat jak načtený, tak i načítající skript:
• Objekt parentSandboxBridge umožňuje načítajícímu obsahu zpřístupnit vlastnosti a funkce pro skripty v načteném obsahu.
• Objekt childSandboxBridge umožňuje načtenému obsahu zpřístupnit vlastnosti a funkce pro skripty v načítajícím obsahu. Objekty zpřístupněné prostřednictvím mostu karantény zabezpečení jsou předány ve formě hodnoty, nikoliv pomocí reference. Všechna data jsou serializována. To znamená, že objekty zpřístupněné jednou stranou mostu nemohou být nastaveny druhou stranou a že zpřístupněné objekty jsou všechny bez typu. Můžete také zpřístupnit pouze jednoduché objekty a funkce; nemůžete zpřístupnit komplexní objekty. Pokud se podřízený obsah pokusí nastavit vlastnost objektu parentSandboxBridge, modul runtime odešle výjimku SecurityError. Podobně, pokud se řídicí obsah pokusí nastavit vlastnost objektu childSandboxBridge, modul runtime odešle výjimku SecurityError.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 36 Zabezpečení aplikace AIR
Příklad mostu karantény zabezpečení (SWF) Předpokládejme, že aplikace obchodu s hudbou AIR chcete povolit vzdáleným souborům SWF vysílat cenu alb, ale nechte, aby vzdálené soubory SWF zjistily, zda je cena také cenou prodejní. To se provede tak, že třída StoreAPI poskytne metodu pro získání ceny, ale zablokuje cenu prodejní. Instance této třídy StoreAPI je pak přiřazena vlastnosti parentSandboxBridge objektu LoaderInfo pro objekt Loader, který načítá vzdálený soubor SWF. Následující kód je pro obchod s hudbou AIR: <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="Music Store" creationComplete="initApp()"> <mx:Script> import flash.display.Loader; import flash.net.URLRequest; private var child:Loader; private var isSale:Boolean = false; private function initApp():void { var request:URLRequest = new URLRequest("http://[www.yourdomain.com]/PriceQuoter.swf") child = new Loader(); child.contentLoaderInfo.parentSandboxBridge = new StoreAPI(this); child.load(request); container.addChild(child); } public function getRegularAlbumPrice():String { return "$11.99"; } public function getSaleAlbumPrice():String { return "$9.99"; } public function getAlbumPrice():String { if(isSale) { return getSaleAlbumPrice(); } else { return getRegularAlbumPrice(); } } <mx:UIComponent id="container" />
Objekt StoreAPI zavolá hlavní aplikaci, aby načetl standardní cenu alba, ale vrátí „Nedostupné“, pokud je zavolána metoda getSaleAlbumPrice(). Následující kód definuje třídu StoreAPI:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 37 Zabezpečení aplikace AIR
public class StoreAPI { private static var musicStore:Object; public function StoreAPI(musicStore:Object) { this.musicStore = musicStore; } public function getRegularAlbumPrice():String { return musicStore.getRegularAlbumPrice(); } public function getSaleAlbumPrice():String { return "Not available"; } public function getAlbumPrice():String { return musicStore.getRegularAlbumPrice(); } }
Následující kód představuje příklad souboru PriceQuoter SWF, který hlásí cenu obchodu, ale nehlásí prodejní cenu: package { import flash.display.Sprite; import flash.system.Security; import flash.text.*; public class PriceQuoter extends Sprite { private var storeRequester:Object; public function PriceQuoter() { trace("Initializing child SWF"); trace("Child sandbox: " + Security.sandboxType); storeRequester = loaderInfo.parentSandboxBridge; var tf:TextField = new TextField(); tf.autoSize = TextFieldAutoSize.LEFT; addChild(tf); tf.appendText("Store price of album is: " + storeRequester.getAlbumPrice()); tf.appendText("\n"); tf.appendText("Sale price of album is: " + storeRequester.getSaleAlbumPrice()); } } }
Příklad mostu karantény zabezpečení (HTML) V obsahu HTML jsou vlastnosti parentSandboxBridge a childSandboxBridge přidány k objektu v okně JavaScript podřízeného dokumentu. Příklad nastavení funkcí mostu v obsahu HTML viz také „Vytvoření rozhraní mostu karantény“ na stránce 242.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 38 Zabezpečení aplikace AIR
Omezení vystavení API Při vystavení (zpřístupnění) mostů karantény zabezpečení je důležité vystavovat pouze rozhraní API horní úrovně, což omezuje míru, ve které mohou být tato rozhraní zneužita. Mějte na paměti, že obsah volající vaši implementaci mostu může být narušen (například prostřednictvím proniknutí kódu). Například vystavením metody readFile(path:String) (která načítá obsah libovolného souboru) prostřednictvím mostu je velmi snadno zneužitelné. Bylo by vhodnější vystavit rozhraní API readApplicationSetting(), které nevyužívá cestu a načte specifický soubor. Sémantičtější přístup omezuje možnosti poškození, které může aplikace způsobit poté, co je její část narušena.
Viz také „Vytváření křížových skriptů pro obsah v různých karanténách zabezpečení“ na stránce 240 „Karanténa zabezpečení aplikace“ na stránce 28 „Oprávnění obsahu v neaplikačních karanténách zabezpečení“ na stránce 29
Zápis na disk Aplikace spuštěná ve webovém prohlížeči má pouze omezenou interakci s místním systémem souborů uživatele. Webový prohlížeč implementuje zásady zabezpečení pro zajištění, aby počítač uživatele nemohl být narušen v důsledku načítání webového obsahu. Například soubory SWF spouštění aplikací Flash Player v prohlížeči nemohou přímo spolupracovat se soubory, které jsou již v počítači uživatele umístěny. Sdílené objekty a soubory cookie mohou být zapsány do počítače uživatele pro účely uchování uživatelských předvoleb a dalších dat, ale to je limit interakce se systémem souborů. Protože aplikace AIR jsou nativně nainstalovány, mají odlišné dohody o zabezpečení; jedna z nich zahrnuje možnost čtení a zápisu v lokálním systému souborů. Tato svoboda je však vykoupena nutně vysokou odpovědností vývojářů. Náhodné nezabezpečení aplikace ohrožuje nejenom funkčnost aplikace, ale také integritu počítače uživatele. Z tohoto důvodu by si vývojáři měli prostudovat kapitolu „Nejlepší postupy zabezpečení pro vývojáře“ na stránce 40. Vývojáři aplikace AIR mohou přistupovat k souborům a zapisovat je do lokálního souborového systému pomocí několika konvencí schémat URL: schéma URL
Popis
app:/
Alias adresáře aplikace. Soubory zpřístupněné z této cesty jsou přiřazeny karanténě zabezpečení aplikace a mají úplné oprávnění zaručené modulem runtime.
app-storage:/
Alias lokálního adresáře pro ukládání dat, standardizovaný modulem runtime. Soubory zpřístupněné z této cesty jsou přiřazeny neaplikační karanténě zabezpečení.
file:///
Alias zastupující kořen pevného disku uživatele. Soubor zpřístupněný z této cesty je přiřazen karanténě zabezpečení aplikace, pokud soubor existuje v adresáři aplikace, jinak je přiřazen neaplikační karanténě zabezpečení.
Poznámka: Aplikace AIR nemohou modifikovat obsah pomocí schématu URL app: Také adresář aplikace může být pouze ke čtení v důsledku administrátorských nastavení.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 39 Zabezpečení aplikace AIR
Pokud existují omezení pro správce počítače uživatele, aplikace AIR mají oprávnění k zápisu v libovolném umístění pevného disku uživatele. Vývojářům se doporučuje používat cestu app-storage:/ pro místní ukládání dat, souvisejících s aplikací. Soubory zapsané do app-storage:/ z aplikace jsou uloženy do standardního umístění:
• Mac OS: adresář pro uložení dat aplikace je //Local
Store/, kde je složka předvoleb uživatele. To je typicky adresář /Users/<user>/Library/Preferences
• Windows: adresář pro uložení dat aplikace je \\Local
Store\, kde je speciální
složka CSIDL_APPDATA uživatele. To je typicky adresář C:\Documents and Settings\<userName>\Application Data
• V systému Linux: //Local
Store/, kde je složka /home/<user>/.appdata
Pokud je aplikace navržena tak, aby spolupracovala se stávajícími soubory v souborovém systému uživatele, nezapomeňte si prostudovat kapitolu „Nejlepší postupy zabezpečení pro vývojáře“ na stránce 40.
Bezpečná práce s nedůvěryhodným obsahem Obsah nepřiřazený karanténě zabezpečení aplikace může poskytnout další funkci skriptování pro vaši aplikaci, ale pouze pokud splňuje kritéria zabezpečení modulu runtime. Toto téma vysvětluje dohodu zabezpečení aplikace AIR s neaplikačním obsahem.
Security.allowDomain() Aplikace AIR omezuje přístup ke skriptování pro neaplikační obsah přísněji, než nakolik zásuvný modul prohlížeče aplikace Flash Player omezuje přístup ke skriptování pro nedůvěryhodný obsah. Když je například v aplikaci Flash Player soubor SWF přidělený k local-trusted (lokální-důvěryhodné) karanténě zabezpečení, volá metodu System.allowDomain() a skriptovací přístup je zajištěn všem souborům SWF načteným ze specifikované domény. Analogický přístup není z obsahu applicationv aplikacích AIR povolen, protože by zaručil nepřiměřený přístup do neaplikačního souboru v systému souborů uživatele. Vzdálené soubory nemohou přímo přistupovat ke karanténě zabezpečení aplikace, bez ohledu na volání metody Security.allowDomain().
Skriptování mezi aplikačním a neaplikačním obsahem Aplikace AIR, které skriptují mezi aplikačním a neaplikačním obsahem, mají komplexnější uspořádání zabezpečení. Soubory, které nejsou v karanténě zabezpečení aplikace, mají povoleno přistupovat pouze k vlastnostem a metodám souborů v karanténě zabezpečení aplikace prostřednictvím použití mostu karantény zabezpečení. Most karantény zabezpečení plní funkci brány mezi aplikačním obsahem a neaplikačním obsahem, poskytuje tak explicitní interakci mezi dvěma soubory. Při správném použití most karantény zabezpečení poskytuje dodatečnou vrstvu zabezpečení, omezující neaplikační obsah v přístupu k referencím objektu, které jsou součástí aplikačního obsahu. Výhoda mostů karantény zabezpečení je nejlépe ilustrována na příkladu. Předpokládejme, že aplikace obchodu s hudbou AIR chce poskytnout rozhraní API pro zadavatele reklamy, který chce vytvořit vlastní soubory SWF, se kterým bude moci aplikace obchodu poté komunikovat. Obchod chce poskytnout zadavatelům reklamy metody pro vyhledávání interpretů a disků CD z obchodu, ale také chce z bezpečnostních důvodů izolovat některé metody a vlastnosti od souboru SWF třetí strany.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 40 Zabezpečení aplikace AIR
Most karantény zabezpečení může tuto funkci poskytnout. Standardně obsah načtený externě do aplikace AIR za chodu programu nemusí přistupovat k jakýmkoliv metodám nebo vlastnostem v hlavní aplikaci. S uživatelskou implementací mostu karantény zabezpečení může vývojář poskytnout služby vzdálenému obsahu bez toho, že by tyto metody nebo vlastnosti vystavil. Považujte most karantény zabezpečení za cestu mezi důvěryhodným a nedůvěryhodným obsahem s poskytnutím komunikace mezi načítajícím a načítaným obsahem bez vystavení referencí objektu. Další informace o bezpečném způsobu použití mostů aplikace viz také „Skriptování mezi obsahem v různých doménách“ na stránce 35.
Ochrana před dynamickým generováním nebezpečného obsahu SWF Metoda Loader.loadBytes() poskytuje cestu pro aplikaci, aby mohla generovat obsah SWF z bajtového pole. Nicméně útoky vsouváním kódu do dat načtených ze vzdálených zdrojů mohou těžce poškodit načítaný obsah. To je obzvláště pravdivé při načítání dat do karantény zabezpečení aplikace, kde generovaný obsah SWF může přistupovat k úplné sadě rozhraní API aplikace AIR. Existuje legitimní použití metody loadBytes() bez generování spustitelného kódu SWF. Metodu loadBytes() můžete například použít pro generování obrazových dat k řízení časování zobrazení obrázku. Existuje také legitimní využití, které se spoléhá na spustitelný kód, například dynamické vytváření obsahu SWF pro přehrávání zvuku. V aplikaci AIR metoda loadBytes() standardně neumožňuje načítání obsahu SWF; umožňuje pouze načítat obsah obrazu. V aplikaci AIR má vlastnost loaderContext metody loadBytes() přiřazenou vlastnost allowLoadBytesCodeExecution, kterou můžete nastavit na hodnotu true a explicitně tak povolit aplikaci používat loadBytes() k načtení spustitelného obsahu SWF. Následujíc kód zobrazuje, jak používat tuto vlastnost: var loader:Loader = new Loader(); var loaderContext:LoaderContext = new LoaderContext(); loaderContext.allowLoadBytesCodeExecution = true; loader.loadBytes(bytes, loaderContext);
Pokud zavoláte loadBytes() k načtení obsahu SWF a vlastnost allowLoadBytesCodeExecution objektu LoaderContext je nastavena na hodnotu false (výchozí), objekt Loader odešle výjimku SecurityError. Poznámka: V budoucích verzích aplikace Adobe AIR se toto rozhraní API může změnit. Když k tomu dojde, budete muset znovu zkompilovat obsah, který využívá vlastnost allowLoadBytesCodeExecution třídy LoaderContext.
Nejlepší postupy zabezpečení pro vývojáře Ačkoliv jsou aplikace AIR vytvořeny s pomocí webových technologií, je důležité, aby si vývojáři uvědomili, že nepracují uvnitř karantény zabezpečení prohlížeče. To znamená, že je možné vytvořit aplikace AIR, které mohou lokální systém poškodit buď záměrně, nebo neúmyslně. Aplikace AIR se pokusí minimalizovat rizika, ale vždy existují způsoby, jak mohou být zavedeny zranitelnosti. Toto téma pokrývá důležité potenciální nejistoty.
Rizika importování souborů do karantény zabezpečení aplikace Soubory vyskytující se v adresáři aplikace jsou přiřazeny do karantény zabezpečení a mají úplná oprávnění modulu runtime. Aplikace, které zapisují do místního systému souborů, by měly zapisovat do adresáře app-storage:/. Tento adresář se vyskytuje nezávisle na souborech aplikace v počítači uživatele, proto soubory nejsou přiřazeny karanténě zabezpečení aplikace a představují snížené bezpečnostní riziko. Vývojářům se doporučuje zvážit následující:
• Zahrnout soubor do souboru aplikace AIR (v nainstalované aplikaci) pouze v případě, že to je nutné.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 41 Zabezpečení aplikace AIR
• Zahrnout skriptovací soubor do souboru aplikace AIR (v nainstalované aplikaci) pouze v případě, že jeho chování je zcela srozumitelné a důvěryhodné.
• Nezapisujte ani nemodifikujte obsah v adresáři aplikace. Modul runtime zabraňuje aplikacím v zápisu nebo modifikování souborů a adresářů pomocí schématu URL app:/ a to odesláním výjimky SecurityError.
• Nepoužívejte data ze síťového zdroje jako parametry metod rozhraní API aplikace AIR, které mohou vést ke spuštění kódu. Patří sem použití metody Loader.loadBytes() a funkce eval() jazyka JavaScript.
Riziko používání externího zdroje pro stanovení cest Aplikace AIR může být narušena v případě, že se používají externí data nebo obsah. Z tohoto důvodu buďte obzvláště opatrní při používání dat ze sítě nebo systému souborů. Břímě důvěryhodnosti je zcela na vývojáři a síťových spojeních, která vytvoří, ale načtení cizích dat je přirozeným rizikem, proto by nemělo být používáno pro zadávání vstupů pro citlivé operace. Vývojářům se nedoporučuje provádět následující operace:
• Používání dat ze síťového zdroje pro stanovení názvu souboru • Používání dat ze síťového zdroje pro vytvoření adresy URL, kterou aplikace používá k odesílání soukromých informací
Riziko používání, ukládání nebo přenášení nezabezpečených pověření Uložení uživatelských pověření v lokálním systému souborů přirozeně zavádí rizika, která tato pověření mohou narušit. Doporučuje se, aby vývojáři zvážili následující:
• Pokud musí být pověření uložena lokálně, doporučuje se pověření při zápisu do lokálního systému souborů zašifrovat. Modul runtime poskytuje zašifrované úložiště jedinečné pro každou nainstalovanou aplikaci a to prostřednictvím třídy EncryptedLocalStore. Podrobnosti viz „Ukládání šifrovaných dat“ na stránce 208.
• Nepřenášejte nezašifrovaná uživatelská pověření do síťového zdroje, pokud není tento zdroj důvěryhodný. • Nikdy nespecifikujte výchozí heslo při vytváření pověření - nechte uživatele vytvořit vlastní. Uživatelé, kteří ponechají výchozí nastavení nezměněné, vystavují svá pověření útočníkovi, který již zná výchozí heslo.
Riziko útoku pomocí downgradované verze aplikace Během instalování aplikace modul runtime kontroluje a zjišťuje, aby daná verze aplikace nebyla aktuálně nainstalovaná. Pokud tato aplikace již nainstalovaná je, modul runtime porovná řetězec verze proti verzi, která je již nainstalovaná. Pokud je tato verze odlišná, uživatel si může vybrat aktualizaci instalace. Modul runtime nezaručuje, že nově nainstalovaná verze je novější, než verze starší, pouze že je odlišná. Útočník může uživateli distribuovat starší verzi a obejít tak slabé zabezpečení. Z tohoto důvodu se vývojářům doporučuje provést kontrolu verze, když je aplikace spuštěna. Je vhodné, aby aplikace zkontrolovala síť s ohledem na požadované aktualizace. Tímto způsobem, i když útočník zajistí, aby uživatel spustil starší verzi, tato stará verze rozpozná, že je nutné ji aktualizovat. Rovněž použitím jasného schématu stanovení verzí pro vaši aplikaci znesnadníte zmatení uživatele a jeho navedení k nainstalování downgradované verze. Podrobnosti o poskytování verzí aplikace viz také „Definování vlastností v souboru deskriptoru aplikace“ na stránce 44.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 42 Zabezpečení aplikace AIR
Podepisování kódu Všechny instalační programy aplikace AIR musí mít podepsaný kód. Podepisování kódu je kryptografický proces potvrzení, že specifikovaný původ softwaru je správný. Aplikace AIR mohou být podepsány buď odkazem na certifikát od externí certifikační autority (CA) nebo vytvořením vlastního certifikátu. Důrazně se doporučuje používat komerční certifikát od dobře známé autority CA a poskytnout tak uživatelům jistotu, že instalují vaši aplikaci, nikoliv padělek. Nicméně automaticky podepsané certifikáty lze vytvořit pomocí adt z SDK nebo pomocí vývojového prostředí Flash, Flex Builder či jiné aplikace, který používá adt pro generování certifikátu. Automaticky podepsané certifikáty neposkytují žádnou jistotu, že instalovaná aplikace je originální. Další informace o digitálním podepsání aplikací AIR naleznete v kapitolách „Digitální podepisování souboru AIR“ na stránce 310 a „Vytváření aplikace AIR pomocí nástrojů příkazového řádku“ na stránce 341.
43
Kapitola 8: Nastavení vlastností aplikace AIR Vedle všech těchto souborů a jiných datových zdrojů, které vytvářejí aplikaci AIR, vyžaduje každá aplikace AIR soubor deskriptoru aplikace. Soubor deskriptoru aplikace je soubor XML, který definuje základní vlastnosti aplikace. Při vyvíjení aplikací AIR pomocí aktualizace Adobe® AIR™ pro aplikace Adobe® Flash® CS3 Professional nebo Adobe® Flash® CS4 Professional je soubor deskriptoru aplikace automaticky vygenerován při vytvoření projektu AIR. Změnu nastavení deskriptoru aplikace můžete provést v panelu v nabídce Příkazy > AIR - Nastavení aplikace a instalátoru. Soubor deskriptoru aplikace můžete také upravit ručně.
Struktura souboru deskriptoru aplikace Soubor deskriptoru aplikace obsahuje vlastnosti, které ovlivňují celou aplikaci, například její název, verzi, autorská práva, atd. Pro soubor deskriptoru aplikace lze použít libovolný název souboru. Když vytvoříte soubor AIR v aplikaci Flash CS3 nebo Flash CS4 pomocí výchozího nastavení, je soubor deskriptoru aplikace přejmenován na application.xml a umístěn do zvláštního adresáře v balíčku AIR. Zde je příklad souboru deskriptoru aplikace: com.example.HelloWorld2.0Hello WorldExample Co. AIR Hello World <description> This is a example.C'est un exemple.Esto es un ejemplo.Copyright (c) 2006 Example Co.Hello World HelloWorld-debug.swf <systemChrome>none truetrue <minimizable>true <maximizable>false false <width>640 480 <minSize>320 240 <maxSize>1280 960 Example Co/Hello World <programMenuFolder>Example Co
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 44 Nastavení vlastností aplikace AIR
icons/smallIcon.pngicons/mediumIcon.pngicons/bigIcon.pngicons/biggestIcon.png <customUpdateUI>true falseadobe.VideoFile <extension>avf <description>Adobe Video File application/vnd.adobe.video-fileicons/avfIcon_16.pngicons/avfIcon_32.pngicons/avfIcon_48.pngicons/avfIcon_128.png
Definování vlastností v souboru deskriptoru aplikace Elementy XML a atributy v deskriptoru aplikace slouží k definici následujících typů vlastností pro aplikaci AIR:
• Vyžadované verze runtime aplikace AIR • Identity aplikace • Instalačních složek a složek nabídky programu • Počátečních vlastností obsahu a oken • Souborů ikon aplikace • Zda aplikace poskytuje vlastní aktualizované uživatelské rozhraní • Zda lze aplikaci vyvolat obsahem SWF spuštěným v prohlížeči uživatele • Asociace typů souborů
Určení vyžadované verze aplikace AIR Vyžadovanou verzi runtime aplikace AIR určují atributy kořenového elementu souboru deskriptoru aplikace (application):
xmlns Jmenný prostor AIR, který musíte definovat jako výchozí jmenný prostor XML. Jmenný prostor se změní s každou hlavní verzí AIR (ale nikoliv s malými záplatami). Verzi runtime vyžadovanou aplikací určuje poslední segment jmenného prostoru, například „1.5“. Pokud aplikace používá jakékoli nové funkce aplikace AIR 1.5, nezapomeňte nastavit jmenný prostor na verzi AIR 1.5 ("http://ns.adobe.com/air/application/1.5").
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 45 Nastavení vlastností aplikace AIR
U aplikací založených na formátu SWF nastavuje maximální verzi formátu SWF, kterou lze načíst jako počáteční obsah aplikace, verze runtime aplikace AIR určená v deskriptoru aplikace. Aplikace, které mají nastaveny verze AIR 1.0 nebo AIR 1.1, mohou jako počáteční obsah využívat pouze formát SWF9 (Flash Player 9), a to dokonce i tehdy, když jsou spuštěny pomocí runtime aplikace AIR 1.5. Aplikace, které mají nastaveny verzi AIR 1.5, mohou jako počáteční obsah využívat soubory ve formátu SWF9 nebo SWF10 (Flash Player 10). Verze formátu SWF určuje, která verze rozhraní API aplikací AIR nebo Flash Player je dostupná. Pokud je jako počáteční obsah aplikace AIR 1.5 použitý soubor ve formátu SWF9, bude mít tato aplikace přístup pouze k rozhraním API verzí AIR 1.1 a Flash Player 9. Kromě toho nebudou změny provedené na stávajících rozhraních API v aplikacích AIR 1.5 a Flash Player 10 účinné. (Výjimkou z tohoto pravidla jsou důležité změny rozhraní API související se zabezpečením; tyto změny lze ve stávajících nebo budoucích opravách runtime používat i se zpětnou platností.) U aplikací založených na jazyku HTML určuje verzi aplikací AIR a Flash Player, které jsou pro aplikaci dostupné, pouze verze runtime určená v deskriptoru aplikace. Chování jazyků HTML a JavaScript a stylů CSS je vždy určeno verzí knihovny Webkit, která je v nainstalovaném runtime aplikace AIR použita, a ne deskriptorem aplikace. Když aplikace AIR načítá obsah ve formátu SWF, závisí verze rozhraní API aplikací AIR a Flash Player na způsobu načítání obsahu. Následující tabulka ukazuje způsob, jakým je verze rozhraní API určena na základě metody načítání: Způsob načítání obsahu
Způsob určení verze rozhraní API
Počáteční obsah, aplikace založená na formátu SWF
Verze formátu SWF načítaného souboru
Počáteční obsah, aplikace založená na formátu HTML
Jmenný prostor deskriptoru aplikace
Soubor SWF načítaný obsahem SWF
Verze načítajícího obsahu
Knihovna SWF načtená obsahem HTML pomocí tagu <script>
Jmenný prostor deskriptoru aplikace
Soubor SWF načtený obsahem HTML pomocí rozhraní API aplikací AIR nebo Flash Player (například flash.display.Loader)
Jmenný prostor deskriptoru aplikace
Soubor SWF načtený obsahem HTML pomocí tagů
Manipulace se soubory upuštěnými v neaplikačních karanténách HTML Neaplikační obsah nemá přístup k objektům File, které jsou výsledkem tažení souborů do aplikace AIR. Ani není možné předat jeden z těchto objektů File do obsahu aplikace prostřednictvím mostu karantény. (Vlastnosti objektu musíte použít během serializace.) Avšak stále můžete upustit soubory ve vaší aplikaci posloucháním událostí nativeDragDrop AIR na objektu HTMLLoader. Obvykle jestliže uživatel upustí soubor do rámce, který hostí neaplikační obsah, událost upuštění se nerozšíří z potomka na rodiče. Avšak protože posluchače odeslané objektem HTMLLoader (který je kontejnerem pro veškerý obsah HTML v aplikaci AIR) nejsou součástí toku události HTML, můžete i tak přijmout událost upuštění v obsahu aplikace. Chcete-li obdržet událost pro upuštění souboru, nadřazený dokument přidá posluchač události do objektu HTMLLoader pomocí odkazu poskytnutého vlastností window.htmlLoader:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 144 Přetažení
window.htmlLoader.addEventListener("nativeDragDrop",function(event){ var filelist = event.clipboard.getData(air.ClipboardFormats.FILE_LIST_FORMAT); air.trace(filelist[0].url); });
V následujícím příkladu je použitý nadřazený dokument, který načítá podřízenou stránku do vzdálené karantény (http://localhost/). Rodič poslouchá událost nativeDragDrop na objektu HTMLLoader a vypracovává URL soubor. Drag-and-drop in a remote sandbox <script language="javascript" type="text/javascript" src="AIRAliases.js"> <script language="javascript"> window.htmlLoader.addEventListener("nativeDragDrop",function(event){ var filelist = event.clipboard.getData(air.ClipboardFormats.FILE_LIST_FORMAT); air.trace(filelist[0].url); }); <iframe src="child.html" sandboxRoot="http://localhost/" documentRoot="app:/" frameBorder="0" width="100%" height="100%">
Podřízený dokument musí poskytnout platný cíl upuštění zabráněním metodě preventDefault() objektu Event v manipulačních programech událostí dragenter a dragover HTML, jinak nikdy nedojde k události upuštění. Drag and drop target <script language="javascript" type="text/javascript"> function preventDefault(event){ event.preventDefault(); }
Drop Files Here
Další informace viz „Programování v jazycích HTML a JavaScript“ na stránce 226.
145
Kapitola 16: Kopírování a vkládání Chcete-li kopírovat informace do a ze systémové schránky, použijte třídy v API schránce. Formáty dat je možno přenášet do i z aplikace Adobe® AIR™, včetně:
• Bitmapy • Soubory • Text • Text ve formátu HTML • data ve formátu Rich Text Format • řetězce URL • Serializované objekty • Objektové odkazy (platné pouze v rámci vznikající aplikace) Přehrávač Flash Player 10 přidal funkci kopírování a vkládání, která byla zavedena v prostředí AIR 1.0. Tato kapitola pojednává o funkci kopírování a vkládání, která je specifická pouze pro prostředí Adobe AIR. Podrobné informace o této sdílené funkci naleznete v části Kopírování a vkládání (v dokumentu Programování v jazyce ActionScript 3.0).
Doplňující online informace o kopírování a vkládání Další informace o kopírování a vkládání můžete získat z následujících zdrojů: Rychlé úvody (Adobe AIR Developer Connection) • Podpora přetahování a kopírování a vkládání Referenční příručka jazyka • Clipboard
• ClipboardFormats • ClipboardTransferMode Více informací • Kopírování a vkládání (v dokumentu Programování v jazyce ActionScript 3.0)
• Adobe AIR Developer Connection for Flash (hledání „kopírování a vkládání v AIR“)
Kopírování a vkládání v HTML Prostředí HTML poskytuje svou vlastní sadu událostí a výchozího chování pro funkce kopírování a vkládání. Pouze kód běžící v karanténě aplikace má přístup k systémové schránce přímo prostřednictvím objektu AIR Clipboard.generalClipboard. Kód JavaScript v neaplikační karanténě má přístup ke schránce prostřednictvím objektu události odeslané jako odpověď na jednu z událostí kopírování nebo vložení odeslaných nějakým elementem v dokumentu HTML.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 146 Kopírování a vkládání
K událostem kopírování a vložení patří: copy, cut a paste. Objekt odeslaný pro tyto události poskytuje přístup ke schránce prostřednictvím vlastnosti clipboardData.
Výchozí chování Při výchozím nastavení kopíruje aplikace AIR vybrané položky v odpovědi na příkaz kopírování, vygenerovaný buď klávesovou zkratkou nebo kontextovou nabídkou. Uvnitř upravitelných oblastí aplikace AIR v odpovědi na příkaz vyjmutí vyjme text nebo v odpovědi na příkaz vložení vloží text na pozici kurzoru nebo výběru. Chcete-li se vyhnout výchozímu chování, může váš posluchač událostí vyvolat metodu preventDefault() odeslaného objektu události.
Použití vlastnosti clipboardData nebo objektu události Vlastnost clipboardData objektu události odeslaného jako výsledek jedné z událostí kopírování nebo vložení umožňuje provádět čtení a zápis dat ze/do schránky. Chcete-li něco zapsat do schránky při zpracovávání události kopírování nebo vyjmutí, použijte metodu setData() objektu clipboardData, přičemž předáte data ke zkopírování a typ MIME: function customCopy(event){ event.clipboardData.setData("text/plain", "A copied string."); }
Chcete-li použít vkládaná data, můžete použít metodu getData() objektu clipboardData, přičemž předáte typ MIME daného formátu dat. Dostupné formáty jsou oznamovány vlastností types. function customPaste(event){ var pastedData = event.clipboardData("text/plain"); }
K metodě getData() a vlastnosti types je přístup pouze v objektu události odeslaném událostí paste. Následující příklad ukazuje, jak potlačit výchozí chování kopírování a vkládání na stránce HTML. Zpracování události copy převede kopírovaný text do kurzívy a zkopíruje jej do schránky jako text HTML. Zpracování události cut
zkopíruje vybraná data do schránky a odstraní je z dokumentu. Zpracování události paste vloží obsah schránky jako HTML a nastaví styl vloženého textu na tučný.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 147 Kopírování a vkládání
Copy and Paste <script language="javascript" type="text/javascript"> function onCopy(event){ var selection = window.getSelection(); event.clipboardData.setData("text/html","" + selection + ""); event.preventDefault(); } function onCut(event){ var selection = window.getSelection(); event.clipboardData.setData("text/html","" + selection + ""); var range = selection.getRangeAt(0); range.extractContents(); event.preventDefault(); } function onPaste(event){ var insertion = document.createElement("b"); insertion.innerHTML = event.clipboardData.getData("text/html"); var selection = window.getSelection(); var range = selection.getRangeAt(0); range.insertNode(insertion); event.preventDefault(); }
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
Příkazy nabídky a stisknutí kláves pro kopírování a vkládání Funkce kopírování a vkládání se obvykle spouští prostřednictvím příkazů nabídky a klávesových zkratek. V systému OS X operační systém automaticky vytvoří nabídku pro úpravy s příkazy kopírování a vkládání, ale k těmto příkazům je třeba přidat posluchače, které budou zachytávat vaše vlastní funkce kopírování a vkládání. V systému Windows můžete přidat nativní nabídku pro úpravy ke každému oknu, které používá standardní systémové prvky. (Pomocí jazyka Flex a ActionScript můžete vytvořit i jiné než nativní nabídky nebo v obsahu HTML můžete použít DHTML, ale to již překračuje rozsah této diskuse.) Chcete-li spustit příkazy kopírování a vložení v odpovědi na klávesové zkratky, můžete buď přiřadit ekvivalenty kláves příslušným příkazovým položkám v nativní nabídce aplikace nebo okna, nebo můžete poslouchat přímo stisknutí daných kláves.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 148 Kopírování a vkládání
Zahájení operace kopírování nebo vložení pomocí příkazu nabídky Chcete-li spustit operaci kopírování nebo vložení pomocí příkazu nabídky, musíte přidat posluchače pro událost select na položkách nabídky, které vyvolávají vaše funkce zpracování. Jakmile je vyvolána vaše funkce zpracování, můžete najít objekt, který má být kopírován nebo vložen, pomocí vlastnosti focus vymezené plochy. Poté můžete vyvolat příslušnou metodu aktivního objektu (nebo obecnou zpětně volanou metodu, není-li aktivní žádný objekt) pro provedení logické operace kopírování, vyjmutí nebo vložení. Například následující zpracování události copy zkontroluje, zda je aktivní objekt správného typu, v tomto případě třída s názvem Scrap, a následně vyvolá metodu doCopy() daného objektu. function copyCommand(event:Event):void{ if(NativeApplication.nativeApplication.activeWindow.stage.focus is Scrap){ Scrap(NativeApplication.nativeApplication.activeWindow.stage.focus).doCopy(); } else { NativeApplication.nativeApplication.copy(); } }
Jestliže metoda copyCommand() v příkladu nerozpozná třídu aktivního objektu, vyvolá metodu copy() třídy NativeApplication. Metoda copy() třídy NativeApplication vyšle do aktivního objektu interní příkaz kopírování. Pokud je objekt vestavěnou třídou, která kopírování a vkládání implementuje interně, pak objekt příkaz provede. V současné době jsou jedinými takovými vestavěnými třídami třídy Textfield a HTMLLoader. Jiné interaktivní objekty odešlou událost copy. Podobné příkazy jsou dostupné pro vyjmutí, vložení, výběr všech položek. Pouze pro třídu TextArea je dostupné vymazání a příkazy zpět a znovu. V obsahu HTML může být výchozí chování kopírování a vkládání spuštěno pomocí příkazů pro úpravy NativeApplication. V následujícím příkladu je vytvořena nabídka pro úpravy pro upravitelný dokument HTML: V předchozím příkladu byla nahrazena nabídka aplikace v systému Mac OS X, můžete však také využít výchozí nabídku Úpravy tak, že vyhledáte stávající položky a přidáte k nim posluchače událostí. Jestliže vyvoláte příkaz kopírovat nebo vložit pomocí kontextové nabídky, můžete použít vlastnost contextMenuOwner objektu ContextMenuEvent odeslaného při otevření nabídky nebo při výběru položky pro určení, který objekt je pravým cílem příkazu kopírovat nebo vložit.
Vyhledání výchozích položek nabídky v systému Mac OS X Chcete-li vyhledat výchozí položky nabídky úprav a položky specifických příkazů kopírovat, vyjmout a vložit v nabídce aplikace v systému Mac OS X, můžete prohledat hierarchii nabídky pomocí vlastnosti label objektů NativeMenuItem. Například následující funkce přebere název a vyhledá položku s odpovídajícím popisem v nabídce: private function findItemByName(menu:NativeMenu, name:String, recurse:Boolean = false):NativeMenuItem{ var searchItem:NativeMenuItem = null; for each (var item:NativeMenuItem in menu.items){ if(item.label == name){ searchItem = item; break; } if((item.submenu != null) && recurse){ searchItem = findItemByName(item.submenu, name); } } return searchItem; }
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 149 Kopírování a vkládání
Můžete nastavit parametr recurse na hodnotu true, a zahrnout tak do hledání i dílčí nabídky, nebo na hodnotu false pro zahrnutí pouze předané nabídky.
Spuštění příkazu kopírovat nebo vložit stisknutím klávesy Jestliže vaše aplikace používá nativní okno nebo nabídky aplikace pro kopírování a vkládání, můžete přidáním ekvivalentů kláves k položkám nabídky implementovat klávesové zkratky. Jestliže vaše aplikace používá nativní okno nebo nabídky aplikace pro kopírování a vkládání, můžete přidáním ekvivalentů kláves k položkám nabídky implementovat klávesové zkratky. Jinak můžete poslouchat stisknutí příslušných kláves sami, jak ukazuje následující příklad: private function init():void{ stage.addEventListener(KeyboardEvent.KEY_DOWN, keyListener); } private function keyListener(event:KeyboardEvent):void{ if(event.ctrlKey){ event.preventDefault(); switch(String.fromCharCode(event.charCode)){ case "c": NativeApplication.nativeApplication.copy(); break; case "x": NativeApplication.nativeApplication.cut(); break; case "v": NativeApplication.nativeApplication.paste(); break; case "a": NativeApplication.nativeApplication.selectAll(); break; case "z": NativeApplication.nativeApplication.undo(); break; case "y": NativeApplication.nativeApplication.redo(); break; } } }
V obsahu HTML jsou klávesové zkratky pro příkazy kopírování a vkládání implementovány standardně. Není možné zachytit všechna stisknutí kláves běžně používaných pro kopírování a vkládání pomocí posluchače události kláves. Potřebujete-li potlačit výchozí chování, lepší strategie je poslouchat samotné události copy a paste.
150
Kapitola 17: Práce s bytovými poli Třída ByteArray umožňuje čtení a zapisování do binárního streamu dat, což je v podstatě pole bytů. Pomocí této třídy lze získat přístup k datům na nejzákladnější úrovni. Vzhledem k tomu, že počítačová data jsou složena z bytů neboli skupin po 8 bitech, schopnost číst data v bytech znamená, že lze přistupovat k datům, pro něž neexistují třídy a metody přístupu. Pomocí třídy ByteArray lze analyzovat jakýkoliv stream dat, od bitmapy až po stream dat přenášených po síti, na úrovni bytu. Pomocí metody writeObject() je možné zapsat objekt v serializovaném formátu AMF (Action Message Format) do třídy ByteArray, zatímco pomocí metody readObject() lze načíst serializovaný objekt ze třídy ByteArray do proměnné původního datového typu. Serializovat lze libovolný objekt kromě objektů zobrazení, což jsou objekty, které lze umístit na seznam zobrazení. Serializované objekty je rovněž možné přiřadit zpět k instancím vlastní třídy, pokud je vlastní třída k dispozici pro běhový modul. Po převedení objektu na AMF jej lze efektivně přenášet přes síťové připojení nebo uložit do souboru. Zde popsaná vzorová aplikace Adobe® AIR™ přečte soubor .zip jako příklad zpracování streamu dat, přičemž vyjme seznam souborů obsažených v souboru .zip a zapíše je na plochu.
Čtení a zapisování do objektu ByteArray Třída ByteArray je součástí balíčku flash.utils. Chcete-li v aplikaci ActionScript 3.0 vytvořit objekt ByteArray, importujte třídu ByteArray a vyvolejte konstruktor, jak je znázorněno v následujícím příkladu. import flash.utils.ByteArray; var stream:ByteArray = new ByteArray();
Metody třídy ByteArray Každý smysluplný datový stream je uspořádán do formátu, který lze analyzovat za účelem nalezení požadovaných informací. Například záznam v jednoduchém souboru zaměstnance by pravděpodobně obsahoval číslo ID, jméno, adresu, telefonní číslo atd. Zvukový soubor MP3 obsahuje tag ID3, který určuje název, autora, album, datum vydání a žánr stahovaného souboru. Podle tohoto formátu lze zjistit pořadí, v němž je možné očekávat data v datovém streamu. To umožňuje inteligentní čtení datového streamu. Třída ByteArray zahrnuje několik metod usnadňujících čtení a zapisování do datového streamu. K těmto metodám patří například readBytes() a writeBytes(), readInt() a writeInt(), readFloat() a writeFloat(), readObject() a writeObject() nebo readUTFBytes() a writeUTFBytes(). Pomocí těchto metod lze načítat data z datového streamu do proměnných určitých datových typů a zapisovat z určitých datových typů přímo do binárního datového streamu. Následující kód například načte jednoduché pole řetězců a čísel s plovoucí čárkou a zapíše každý element do objektu ByteArray. Díky uspořádání pole může kód vyvolat příslušné metody třídy ByteArray (writeUTFBytes() a writeFloat()) k zápisu dat. Opakující se datová struktura umožňuje čtení pole pomocí smyčky.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 151 Práce s bytovými poli
// The following example reads a simple Array (groceries), made up of strings // and floating-point numbers, and writes it to a ByteArray. import flash.utils.ByteArray; // define the grocery list Array var groceries:Array = ["milk", 4.50, "soup", 1.79, "eggs", 3.19, "bread" , 2.35] // define the ByteArray var bytes:ByteArray = new ByteArray(); // for each item in the array for (var i:int = 0; i < groceries.length; i++) { bytes.writeUTFBytes(groceries[i++]); //write the string and position to the next item bytes.writeFloat(groceries[i]);// write the float trace("bytes.position is: " + bytes.position);//display the position in ByteArray } trace("bytes length is: " + bytes.length);// display the length
Vlastnost position Vlastnost position uloží aktuální polohu kurzoru, která indexuje objekt ByteArray během čtení nebo zapisování. Počáteční hodnota vlastnosti position je nula (0), jak je znázorněno v následujícím kódu: var bytes:ByteArray = new ByteArray(); trace("bytes.position is initially: " + bytes.position); // 0
Při čtení a zapisování do objektu ByteArray použitá metoda aktualizuje vlastnost position, aby ukazovala na místo bezprostředně následující po posledním přečteném nebo zapsaném bytu. Následující kód například zapíše do objektu ByteArray řetězec a vlastnost position pak ukazuje na byt následující bezprostředně po řetězci v objektu ByteArray: var bytes:ByteArray = new ByteArray(); trace("bytes.position is initially: " + bytes.position); // 0 bytes.writeUTFBytes("Hello World!"); trace("bytes.position is now: " + bytes.position);// 12
Stejně tak operace čtení navyšuje vlastnost position počtem přečtených bytů. var bytes:ByteArray = new ByteArray(); trace("bytes.position is initially: " + bytes.position); // 0 bytes.writeUTFBytes("Hello World!"); trace("bytes.position is now: " + bytes.position);// 12 bytes.position = 0; trace("The first 6 bytes are: " + (bytes.readUTFBytes(6)));//Hello trace("And the next 6 bytes are: " + (bytes.readUTFBytes(6)));// World!
Všimněte si, že vlastnost position je možné nastavit na určité místo v objektu ByteArray, aby čtení nebo zapisování začalo s tímto odsazením.
Vlastnosti bytesAvailable a length Podle vlastností length a bytesAvailable poznáte, jak je objekt ByteArray dlouhý a kolik v něm zbývá bytů od aktuální polohy do konce. Následující příklad ilustruje, jak lze tyto vlastnosti použít. V tomto příkladu se do objektu ByteArray zapíše řetězec textu a potom se objekt ByteArray čte po jednotlivých bytech, dokud kód nenarazí na znak „a“ nebo na konec (bytesAvailable <= 0).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 152 Práce s bytovými poli
var bytes:ByteArray = new ByteArray(); var text:String = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus etc."; bytes.writeUTFBytes(text); // write the text to the ByteArray trace("The length of the ByteArray is: " + bytes.length);// 70 bytes.position = 0; // reset position while (bytes.bytesAvailable > 0 && (bytes.readUTFBytes(1) != 'a')) { //read to letter a or end of bytes } if (bytes.position < bytes.bytesAvailable) { trace("Found the letter a; position is: " + bytes.position); // 23 trace("and the number of bytes available is: " + bytes.bytesAvailable);// 47 }
Vlastnost endian Počítače mohou používat různé způsoby ukládání multibytových čísel, tedy čísel, jejichž uložení vyžaduje více než 1 byt paměti. Celé číslo může například zabrat 4 byty nebo 32 bytů paměti. Některé počítače ukládají na první místo (na nejnižší adresu paměti) nejdůležitější byt čísla, jiné ukládají na první místo nejméně důležitý byt. Tento atribut počítače neboli řazení bytů se označuje jako big endian (nejdůležitější byt na prvním místě) nebo little endian (nejméně důležitý byt na prvním místě). Například číslo 0x31323334 by bylo v řazení bytů big endian a little endian uloženo následujícím způsobem, kde a0 představuje nejnižší adresu paměti o velikosti 4 byty a a3 představuje nejvyšší adresu: Big Endian
Big Endian
Big Endian
Big Endian
a0
a1
a2
a3
31
32
33
34
Little Endian
Little Endian
Little Endian
Little Endian
a0
a1
a2
a3
34
33
32
31
Pomocí vlastnosti endian třídy ByteArray lze označit toto pořadí bytů u zpracovávaných multibytových čísel. Přijatelné hodnoty pro tuto vlastnost jsou buď "bigEndian", nebo "littleEndian" a třída Endian definuje konstanty BIG_ENDIAN a LITTLE_ENDIAN pro nastavení vlastnosti endian pomocí těchto řetězců.
Metody compress() a uncompress() Pomocí metody compress() lze komprimovat objekt ByteArray podle komprimačního algoritmu určeného jako parametr. Pomocí metody uncompress() lze dekomprimovat zkomprimovaný objekt ByteArray podle komprimačního algoritmu. Po vyvolání metod compress() a uncompress() se určí nová délka bytového pole a vlastnost position se nastaví na konec. Třída CompressionAlgorithm definuje konstanty, pomocí nichž lze určit komprimační algoritmus. Aplikace AIR podporuje algoritmus deflate i zlib. Komprimační algoritmus deflate se používá u řady kompresních formátů, např. zlib, gzip a u některých implementací zip. Formát komprimovaných dat zlib je popsán na adrese http://www.ietf.org/rfc/rfc1950.txt a komprimační algoritmus deflate je popsán na adrese http://www.ietf.org/rfc/rfc1951.txt. Následující příklad ilustruje kompresi objektu ByteArray s názvem bytes pomocí algoritmu deflate:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 153 Práce s bytovými poli
bytes.compress(CompressionAlgorithm.DEFLATE);
Následující příklad ilustruje dekompresi zkomprimovaného objektu ByteArray pomocí algoritmu deflate: bytes.uncompress(CompressionAlgorithm.DEFLATE);
Čtení a zapisování objektů Metody readObject() a writeObject() přečtou a zapíší objekt do třídy ByteArray, zakódovaný v serializovaném formátu AMF (Action Message Format). AMF je patentovaný protokol zpráv vytvořený společností Adobe, který se používá v různých třídách aplikace ActionScript 3.0, včetně Netstream, NetConnection, NetStream, LocalConnection a Shared Objects. Jednobytová značka typu popisuje typ zakódovaných dat, jež následují. AMF používá následujících 13 datových typů: value-type = undefined-marker | null-marker | false-marker | true-marker | integer-type | double-type | string-type | xml-doc-type | date-type | array-type | object-type | xml-type | byte-array-type
Zakódovaná data následující po značce typu, pokud značka nepředstavuje jedinou možnou hodnotu (např. nula, true nebo false), kdy se nic dalšího nekóduje. Existují dvě verze AMF: AMF0 a AMF3. AMF 0 podporuje posílání složitých objektů pomocí odkazu a povoluje koncové body za účelem obnovení vztahů mezi objekty. AMF 3 vylepšuje AMF 0 o posílání řetězců a vlastností objektů pomocí odkazu, kromě odkazů na objekty, a o podporu nových datových typů, jež byly zavedeny v aplikaci ActionScript 3.0. Vlastnost ByteArray.objectEcoding určuje verzi AMF použitou ke kódování dat objektu. Třída flash.net.ObjectEncoding definuje konstanty pro určení verze AMF: ObjectEncoding.AMF0 a ObjectEncoding.AMF3. import flash.filesystem.*; import flash.utils.ByteArray; // Label component must be in Library import fl.controls.Label;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 154 Práce s bytovými poli
var bytes:ByteArray = new ByteArray(); var myLabel:Label = new Label(); myLabel.move(150, 150); myLabel.width = 200; addChild(myLabel); var myXML:XML = <menuName>burger <price>3.95 <menuName>fries <price>1.45 // Write XML object to ByteArray bytes.writeObject(myXML); bytes.position = 0;//reset position to beginning bytes.compress(CompressionAlgorithm.DEFLATE);// compress ByteArray outFile("order", bytes); myLabel.text = "Wrote order file to desktop!"; function outFile(fileName:String, data:ByteArray):void { var outFile:File = File.desktopDirectory; // dest folder is desktop outFile = outFile.resolvePath(fileName); // name of file to write var outStream:FileStream = new FileStream(); // open output file stream in WRITE mode outStream.open(outFile, FileMode.WRITE); // write out the file outStream.writeBytes(data, 0, data.length); // close it outStream.close(); }
Metoda readObject() načte objekt v serializovaném AMF ze třídy ByteArray a uloží jej do objektu určeného typu. V následujícím příkladu se z plochy načte soubor order do třídy ByteArray (inBytes), dekomprimuje se a pomocí metody readObject() se uloží do objektu XML orderXML. V příkladu se pomocí konstrukce smyčky for each() do textové oblasti určené k zobrazení přidají jednotlivé uzly. V příkladu se rovněž zobrazí hodnota vlastnosti objectEncoding spolu se záhlavím pro obsah souboru order. import flash.filesystem.*; import flash.utils.ByteArray; // TextArea component must be in Library import fl.controls.TextArea;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 155 Práce s bytovými poli
var inBytes:ByteArray = new ByteArray(); // define text area for displaying XML content var myTxt:TextArea = new TextArea(); myTxt.width = 550; myTxt.height = 400; addChild(myTxt); //display objectEncoding and file heading myTxt.text = "Object encoding is: " + inBytes.objectEncoding + "\n\n" + "order file: \n\n"; readFile("order", inBytes); inBytes.position = 0; // reset position to beginning inBytes.uncompress(CompressionAlgorithm.DEFLATE); inBytes.position = 0;//reset position to beginning // read XML Object var orderXML:XML = inBytes.readObject(); //for each node in orderXML for each(var child:XML in orderXML) { // append child node to text area myTxt.text += child + "\n"; } // read specified file into byte array function readFile(fileName:String, data:ByteArray) { var inFile:File = File.desktopDirectory; // source folder is desktop inFile = inFile.resolvePath(fileName); // name of file to read var inStream:FileStream = new FileStream(); inStream.open(inFile, FileMode.READ); inStream.readBytes(data, 0, data.length); inStream.close(); }
Příklad ByteArray: Čtení souboru .zip Tento příklad ilustruje, jakým způsobem lze přečíst jednoduchý soubor .zip obsahující několik souborů různých typů. Toho se docílí vyjmutím příslušných dat z metadat pro jednotlivé soubory, dekompresí jednotlivých souborů do třídy ByteArray a zapsáním souboru na plochu. Obecná struktura souboru .zip je založena na specifikaci vytvořené společností PKWARE Inc., která je udržována na adrese http://www.pkware.com/documents/casestudies/APPNOTE.TXT. Na prvním místě se nachází záhlaví souboru a data souboru pro první soubor v archivu .zip, po nichž následuje dvojice záhlaví-data souboru pro každý další soubor. (Struktura záhlaví souboru bude popsána později.) Dále může soubor .zip zahrnovat záznam deskriptoru dat (obvykle při vytvoření výstupního souboru .zip v paměti místo jeho uložení na disku). Pak může následovat několik dalších elementů: záhlaví dekódování archivu, záznam dodatečných dat archivu, struktura ústředního adresáře, záznam konce ústředního adresáře Zip64, lokalizátor konce ústředního adresáře Zip64 a záznam konce ústředního adresáře. Kód v tomto příkladu je napsán jen pro analýzu souborů zip neobsahujících složky a neočekává záznamy deskriptorů dat. Ignoruje veškeré informace následující za posledními daty souboru. Formát záhlaví souboru pro jednotlivé soubory je následující:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 156 Práce s bytovými poli
podpis záhlaví souboru
4 byty
vyžadovaná verze
2 byty
univerzální bitový příznak
2 byty
metoda komprese
2 byty (8=DEFLATE; 0=UNCOMPRESSED)
čas poslední úpravy souboru
2 byty
datum poslední úpravy souboru
2 byty
crc-32
4 byty
komprimovaná velikost
4 byty
nekomprimovaná velikost
4 byty
délka názvu souboru
2 byty
délka dodatečného pole
2 byty
název souboru
proměnná
dodatečné pole
proměnná
Za záhlavím souboru následují vlastní data souboru, jež mohou být v závislosti na příznaku metody komprese buď komprimovaná, nebo nekomprimovaná. Hodnota příznaku je nula (0) pro nekomprimovaná data souboru, 8 pro data komprimovaná pomocí algoritmu DEFLATE či jiná pro další komprimační algoritmy. Uživatelské rozhraní pro tento příklad se skládá z popisu a textové oblasti (taFiles). Pro každý soubor, který bude v souboru .zip nalezen, zadá aplikace do textové oblasti následující údaje: název souboru, komprimovaná velikost a nekomprimovaná velikost. Na začátku programu se provedou následující úlohy:
• Definice uživatelského rozhraní import fl.controls.*; //requires TextArea and Label components in the Library var taFiles = new TextArea(); var output = new Label(); taFiles.setSize(320, 150); taFiles.move(10, 30); output.move(10, 10); output.width = 150; output.text = "Contents of HelloAir.zip"; addChild(taFiles); addChild(output);
• Definice objektu ByteArray bytes var bytes:ByteArray = new ByteArray();
• Definice proměnných pro ukládání metadat ze záhlaví souboru
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 157 Práce s bytovými poli
// var var var var var var var var
variables for reading fixed portion of file header fileName:String = new String(); flNameLength:uint; xfldLength:uint; offset:uint; compSize:uint; uncompSize:uint; compMethod:int; signature:int;
• Definice objektů File (zfile) a FileStream (zStream) představujících soubor .zip a určení umístění souboru .zip, z něhož se soubory vyjímají – soubor s názvem „HelloAIR.zip“ v adresáři plochy. // File variables for accessing .zip file var zfile:File = File.desktopDirectory.resolvePath("HelloAIR.zip"); var zStream:FileStream = new FileStream();
Program začne otevřením souboru .zip v režimu READ (čtení). zStream.open(zfile, FileMode.READ);
Potom nastaví vlastnost endian objektu bytes na LITTLE_ENDIAN, což značí, že v pořadí bytů číselných polí je na prvním místě uveden nejméně důležitý byt. bytes.endian = Endian.LITTLE_ENDIAN;
Následně příkaz while() zahájí smyčku, která bude pokračovat tak dlouho, dokud aktuální poloha ve streamu souborů nebude větší nebo rovna velikosti souboru. while (zStream.position < zfile.size) {
První příkaz ve smyčce načte prvních 30 bytů streamu souborů do objektu ByteArray bytes. Prvních 30 bytů tvoří část záhlaví prvního souboru s pevnou šířkou. // read fixed metadata portion of local file header zStream.readBytes(bytes, 0, 30);
Potom kód načte z prvních bytů 30 bytového záhlaví celé číslo (signature). Definice formátu ZIP určuje, že podpis pro každé záhlaví souboru je hexadecimální hodnota 0x04034b50. Pokud se podpis liší, znamená to, že se kód posunul za souborovou část souboru .zip a že již neexistují žádné další soubory k vyjmutí. V takovém případě kód okamžitě ukončí smyčku while místo toho, aby čekal na konec bytového pole. bytes.position = 0; signature = bytes.readInt(); // if no longer reading data files, quit if (signature != 0x04034b50) { break; }
Následující část kódu přečte byt záhlaví v poloze odsazení 8 a uloží tuto hodnotu do proměnné compMethod. Tento byt obsahuje hodnotu značící metodu komprese, jež byla použita ke kompresi tohoto souboru. Je povoleno několik metod komprese, v praxi však téměř všechny soubory .zip používají komprimační algoritmus DEFLATE. Pokud je aktuální soubor zkomprimovaný pomocí komprese DEFLATE, má metoda compMethod hodnotu 8. Jestliže je soubor nezkomprimovaný, má metoda compMethod hodnotu 0. bytes.position = 8; compMethod = bytes.readByte();
// store compression method (8 == Deflate)
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 158 Práce s bytovými poli
Za prvními 30 byty následuje část záhlaví délky proměnné, která obsahuje název souboru a případně i dodatečné pole. Velikost této části se uloží v proměnné offset. Tato velikost se vypočítá jako součet délky názvu souboru a délky dodatečného pole, která se načte ze záhlaví v odsazení 26 a 28. offset = 0;// stores length of variable portion of metadata bytes.position = 26; // offset to file name length flNameLength = bytes.readShort();// store file name offset += flNameLength; // add length of file name bytes.position = 28;// offset to extra field length xfldLength = bytes.readShort(); offset += xfldLength;// add length of extra field
Potom program načte část záhlaví souboru délky proměnné, kde je vyznačen počet bytů uložených v proměnné offset. // read variable length bytes between fixed-length header and compressed file data zStream.readBytes(bytes, 30, offset);
Program načte z části záhlaví délky proměnné název souboru a spolu s komprimovanou (v souboru zip) a nezkomprimovanou (původní) velikostí souboru jej zobrazí v textové oblasti. bytes.position = 30; fileName = bytes.readUTFBytes(flNameLength); // read file name taFiles.appendText(fileName + "\n"); // write file name to text area bytes.position = 18; compSize = bytes.readUnsignedInt(); // store size of compressed portion taFiles.appendText("\tCompressed size is: " + compSize + '\n'); bytes.position = 22; // offset to uncompressed size uncompSize = bytes.readUnsignedInt(); // store uncompressed size taFiles.appendText("\tUncompressed size is: " + uncompSize + '\n');
V příkladu se načte zbytek souboru ze streamu souborů do objektu bytes v délce určené komprimovanou velikostí, přičemž se přepíše záhlaví souboru v prvních 30 bytech. Komprimovaná velikost je přesná i v případě, že soubor není zkomprimovaný, neboť v takovém případě se komprimovaná velikost rovná nekomprimované velikosti souboru. // read compressed file to offset 0 of bytes; for uncompressed files // the compressed and uncompressed size is the same zStream.readBytes(bytes, 0, compSize);
Dále kód v příkladu dekomprimuje zkomprimovaný soubor a vyvolá funkci outfile(), která jej zapíše do streamu výstupních souborů. Funkci outfile() se předá název souboru a bytové pole obsahující data souboru. if (compMethod == 8) // if file is compressed, uncompress { bytes.uncompress(CompressionAlgorithm.DEFLATE); } outFile(fileName, bytes); // call outFile() to write out the file
Koncová složená závorka značí konec smyčky while a kódu aplikace, kromě metody outFile(). Provádění se vrátí zpět na začátek smyčky while a bude pokračovat ve zpracování následujících bytů v souboru .zip – buď se vyjme další soubor, nebo se zpracování souboru .zip ukončí, pokud již byl poslední soubor zpracován. } // end of while loop
Funkce outfile() otevře výstupní soubor na ploše v režimu WRITE (zápis) a přiřadí mu název určený parametrem filename. Potom zapíše data z parametru data do streamu výstupních souborů (outStream) a soubor zavře.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 159 Práce s bytovými poli
function outFile(fileName:String, data:ByteArray):void { var outFile:File = File.desktopDirectory; // destination folder is desktop outFile = outFile.resolvePath(fileName); // name of file to write var outStream:FileStream = new FileStream(); // open output file stream in WRITE mode outStream.open(outFile, FileMode.WRITE); // write out the file outStream.writeBytes(data, 0, data.length); // close it outStream.close(); }
160
Kapitola 18: Práce s lokálními databázemi SQL Program Adobe AIR zahrnuje možnost vytvoření lokálních databází SQL a práce s nimi. Runtime zahrnuje modul databáze SQL umožňující podporu mnoha standardních funkcí SQL, pomocí systému databáze otevřeného zdroje SQLite. Lokální databáze SQL lze použít pro ukládání místních trvalých dat. Lze je například použít pro data aplikace, uživatelské nastavení aplikace, dokumenty a jiné další typy dat, které chcete aplikací místně uložit.
Další online dostupné informace o lokálních databázích SQL Více informací o práci s lokálními databázemi SQL naleznete v těchto zdrojích: Stručné úvody (Adobe AIR Developer Connection) • Asynchronní práce s lokální databází SQL
• Synchronní práce s lokální databází SQL • Používání šifrované databáze Referenční příručka jazyka • SQLCollationType
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 161 Práce s lokálními databázemi SQL
• SQLViewSchema Články a Ukázky aplikace Adobe Developer Connection • Adobe AIR Developer Connection AIR pro Flash (hledejte výraz ‚AIR SQL )
O lokálních databázích SQL Program Adobe AIR zahrnuje modul vztahové databáze vycházející z SQL, který je spuštěn v době běhu, s daty lokálně umístěnými v souborech databáze na počítači, na kterém je spuštěna aplikace AIR (například na pevném disku počítače). Protože databáze běží a datové soubory jsou uloženy lokálně, může být databáze použita aplikací AIR bez ohledu na to, zda je dostupné síťové připojení. Proto modul lokální databáze SQL doby běhu poskytuje výhodný mechanismus pro ukládání trvalých lokálních dat aplikace, zvláště pokud máte zkušenosti s databázemi SQL a vztahovými databázemi.
Použití lokálních databází SQL Funkce lokálních databází SQL programu AIR lze použít za jakýmkoliv účelem. Můžete si tedy přát uchovat data aplikací na místním počítači uživatele. Program Adobe AIR obsahuje několik mechanismů pro lokální ukládání dat. Každý z těchto mechanismů má různé výhody. Následují možná použití lokální databáze SQL ve vaší aplikaci AIR:
• Pro aplikace orientované na data (například adresář) lze databázi použít k ukládání hlavních dat aplikace. • Pro aplikace orientované na dokumenty, kde mohou uživatelé vytvářet dokumenty k uložení a možnému sdílení, by měl být každý dokument uložen jako soubor databáze, a to v uživatelem určeném umístění. (Upozorňujeme, že s výjimkou případů, kdy je databáze zašifrována, dokáže jakákoli aplikace AIR soubor databáze otevřít. Doporučujeme, abyste potencionálně citlivé dokumenty zašifrovali.)
• Pro aplikaci detekující síť lze databázi použít k ukládání lokální vyrovnávací paměti dat aplikace nebo k dočasnému ukládání dat, pokud připojení k síti není dostupné. Pro synchronizaci lokální databáze s ukládáním dat na síti lze vytvořit mechanismus.
• Databázi lze v libovolné aplikaci použít pro uložení jednotlivých uživatelských nastavení aplikace, například voleb uživatele nebo informací aplikace, jako je velikost a poloha okna.
O databázích programu AIR a souborech databáze Jednotlivé lokální databáze SQL programu Adobe AIR jsou uloženy jako jediný soubor v systému souborů počítače. Runtime zahrnuje modul SQL databáze, který ovládá vytváření a strukturování souborů databáze a jejich manipulaci a načítání dat ze souboru databáze. Runtime neurčuje jak nebo kde jsou data databáze uložena v systému souborů; každá databáze je spíše uložena kompletně v jediném souboru. Umístění v systému souborů, kde je soubor databáze uložen, lze určit. Jediná databáze AIR může získat přístup k jedné nebo více samostatným databázím (tj. samostatným souborům databáze). Protože runtime uloží každou databázi jako jediný soubor v systému souborů, databázi můžete umístit dle své potřeby díky provedení své aplikace a omezení přístupu souborů operačního systému. Každý uživatel může mít samostatný soubor databáze pro svá specifická data, nebo soubor databáze může být přístupný všem uživatelům aplikace na jediném počítači pro sdílená data. Protože jsou data ve vztahu k jednomu počítači lokální, nejsou automaticky sdílena mezi uživateli na odlišných počítačích. Modul lokální databáze SQL neposkytuje žádnou možnost spuštění příkazů SQL oproti vzdálené nebo ze serveru vycházející databáze.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 162 Práce s lokálními databázemi SQL
O vztahových databázích Vztahová databáze je mechanismus pro ukládání (a načítání) dat na počítači. Data jsou organizována do tabulek: řádky představují záznamy nebo položky a sloupce (někdy nazývané „pole“) rozdělují každý záznam do jednotlivých hodnot. Aplikace adresáře by mohla například obsahovat tabulku „přátelé“. Každý řádek v tabulce by představoval jednoho přítele uloženého v databázi. Sloupce tabulky by představovaly data, například jméno, příjmení, datum narození, atd. Pro každý řádek přítele v tabulce uchovává databáze pro každý sloupec samostatnou hodnotu. Vztahové databáze jsou navrženy k ukládání komplexních dat, kde je jedna položka přiřazena k položce jiného typu, nebo s ní souvisí. Ve vztahové databázi by měla být jakákoliv data, která mají vztah „jeden k mnoha“—kde se může jeden záznam vztahovat k několika záznamům různého typu—rozdělena do odlišných tabulek. Předpokládejme například, že si přejete, aby vaše aplikace adresáře uložila pro každého přítele několik telefonních čísel; to je vztah „jeden k mnoha“. Tabulka „přátelé“ by pro každého přítele obsahovala všechny osobní informace. Samostatná tabulka „telefonní čísla“ by obsahovala všechna telefonní čísla pro všechny přátele. Mimo ukládání dat o přátelích a telefonních číslech by každá tabulka potřebovala určitou informaci pro sledování vztahu mezi dvěma tabulkami—pro spárování záznamů jednotlivých přátel s jejich telefonními čísly. Tato data jsou známá jako primární klíč—jedinečný identifikátor, který odlišuje každý řádek v tabulce od jiných řádků dané tabulky. Primární klíč může být „přirozený klíč“, to znamená jedna z položek dat, která přirozeně rozlišují každý záznam v tabulce. Pokud v tabulce „přátelé“ víte, že nikdo z vašich přátel nesdílí datum narození, mohli byste použít sloupec data narození jako primární klíč (přirozený klíč) tabulky „přátelé“. Jestliže žádný přirozený klíč neexistuje, mohli byste vytvořit samostatný sloupec, například „ID přítele“ – umělou hodnotu, kterou aplikace použije pro odlišení řádků. Pomocí primárního klíče můžete nastavit vztahy mezi více tabulkami. Předpokládejme například, že tabulka „přátelé“ má sloupec „ID přítele“, který pro každý řádek (každého přítele) obsahuje jedinečné číslo. Související tabulku „telefonní čísla“ lze strukturovat se dvěma sloupci:jeden s „ID přítelem“ přítele, ke kterému dané telefonní číslo patří a jeden se samotným telefonním číslem. Tím lze bez ohledu na počet telefonních čísel, která jednotliví přátelé mají, uložit všechna čísla v tabulce „telefonní čísla“ a lze je propojit s příslušnými přáteli pomocí primárního klíče „ID přítele“. Když je primární klíč z jedné tabulky použit v související tabulce k určení propojení mezi záznamy, je hodnota v související tabulce známá jako cizí klíč. Na rozdíl od mnoha databází vám modul lokální databáze AIR neumožňuje vytvořit vazby cizího klíče, které automaticky zkontrolují, že hodnotě vloženého nebo aktualizovaného cizího klíče odpovídá řádek v tabulce primárního klíče. Vztahy cizího klíče jsou nicméně důležitou částí struktury vztahové databáze a tyto cizí klíče byste ve své databázi měli použit při vytváření vztahů mezi tabulkami.
O SQL Structured Query Language (SQL-jazyk strukturovaného dotazu) se u vztahových databází používá k manipulaci a načítání dat. SQL je spíše než procedurální jazyk jazyk deskriptivní. Namísto zadání počítači omezení způsobu načtení dat popisuje příkaz SQL množinu dat, kterou požadujete. Modul databáze určuje způsob načtení daných dat. Jazyk SQL byl standardizován institutem American National Standards Institute (ANSI). Lokální databáze SQL programu Adobe AIR poporují většinu standardu SQL-92. Specifické popisy jazyka SQL podporovaného v programu Adobe AIR naleznete v příloze „SQL podpora v lokálních databázích“ v Referenční příručce jazyka ActionScript 3.0 a jeho komponent.
O třídách databází SQL Pro práci s lokálními databázemi SQL v jazyce ActionScript 3.0 použijte instance těchto tříd v balíku flash.data:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 163 Práce s lokálními databázemi SQL
Třída
Popis
flash.data.SQLConnection
Poskytuje prostředky pro vytváření a otevírání databází (souborů databáze) i metody pro provádění operací na úrovni databáze a pro ovládání transakcí databáze.
flash.data.SQLStatement
Představuje jediný příkaz SQL (jediný dotaz nebo příkaz), který je na databázi spuštěn, včetně definice textu příkazu a nastavení hodnot parametru.
flash.data.SQLResult
Poskytuje způsob získávání informací o spuštění příkazu nebo o výsledcích spuštění příkazu, například výsledné řádky z příkazu SELECT, počet řádků ovlivněných příkazem UPDATE nebo DELETE, atd.
K získání informací popisujících strukturu databáze použijete tyto třídy v balíku flash.data: Třída flash.data.SQLSchemaResult
Popis Slouží jako kontejner pro schéma výsledků databáze vytvořených voláním metody SQLConnection.loadSchema().
flash.data.SQLTableSchema
Poskytuje informace popisující jedinou tabulku v databázi.
flash.data.SQLViewSchema
Poskytuje informace popisující jediný náhled v databázi.
flash.data.SQLIndexSchema
Poskytuje informace popisující jediný sloupec tabulky nebo náhled v databázi.
flash.data.SQLTriggerSchem a
Poskytuje informace popisující jediný spouštěč v databázi.
Jiné třídy v balíku flash.data poskytují konstanty, které jsou používány s třídou SQLConnection a třídou SQLColumnSchema: Třída
Popis
flash.data.SQLMode
Definuje množinu konstant představující možné hodnoty pro parametr openMode metod SQLConnection.open() a SQLConnection.openAsync().
flash.data.SQLColumnNameStyle
Definuje množinu konstant představující možné hodnoty pro vlastnost SQLConnection.columnNameStyle.
flash.data.SQLTransactionLockType Definuje množinu konstant představující možné hodnoty pro parametr volby metody SQLConnection.begin(). flash.data.SQLCollationType
Definuje množinu konstant představující možné hodnoty pro vlastnost SQLColumnSchema.defaultCollationType a parametr defaultCollationType konstruktoru SQLColumnSchema().
Mimo to následující třídy v balíku flash.events představují události (a podpůrné konstanty), které používáte: Třída
Popis
flash.data.SQLEvent
Definuje události, které instance SQLConnection nebo SQLStatement odešle, pokud se jakékoliv z jejích operací úspěšně dokončí. Každá operace má přiřazenou konstantu typu události, která je definovaná ve třídě SQLEvent.
flash.data.SQLErrorEvent
Definuje událost, kterou instance SQLConnection nebo SQLStatement odešle, pokud jakékoliv z jejích operací vygeneruje chybu.
flash.data.SQLUpdateEvent
Definuje událost, kterou instance SQLConnection odešle, když se data tabulky z jedné z jejích připojených databází po provedení příkazu SQL INSERT, UPDATEneboDELETE změní.
Následující třídy v balíku flash.errors poskytují informace o chybách operací databáze.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 164 Práce s lokálními databázemi SQL
Třída
Popis
flash.data.SQLError
Poskytuje informace o chybách operací databáze včetně operace, u které došlo k pokusu o přístup, a příčiny chyby.
flash.data.SQLErrorEvent
Definuje množinu konstant představující možné hodnoty vlastnosti třídy SQLErroroperationoznačující operaci databáze, která vygenerovala chybu.
O synchronním a asynchronním režimu spuštění Při zápisu kódu, který bude pracovat s lokální databází SQL, určíte, že operace databáze se spustí v jednom ze dvou režimů spuštění: asynchronním nebo synchronním režimu spuštění. Ukázky kódů obecně ukazují způsob provedení každé operace dvěma způsoby, takže můžete použít ukázku, která je pro vaše potřeby nejvhodnější. V asynchronním režimu spuštění dáte runtime pokyn a runtime odešle při dokončení vámi požadované operace, nebo pokud tato operace selže, událost. Nejprve sdělíte modulu databáze, aby provedl operaci. Modul databáze pracuje na pozadí, zatímco aplikace stále běží. Nakonec po dokončení operace (nebo pokud operace selže) modul databáze odešle událost. Váš kód, spuštěný událostí, provede následující operace. Tento přístup má významnou výhodu: runtime provede operace databáze na pozadí, zatímco hlavní kód aplikace je dále prováděn. Jestliže operace databáze trvá výrazně dlouho, aplikace i nadále běží. Co je nejdůležitější, uživatel může i nadále pracovat s aplikací, bez zamrznutí obrazovky. Kód asynchronní operace může být nicméně složitější pro zápis než jiný kód. Tato složitost je obvyklá v případech, kdy musí být více závislých operací rozděleno mezi různé metody poslouchače události. Koncepčně je jednodušší kódovat operace jako jedinou sekvenci kroků—sadu synchronních operací—spíše než sadu operací rozdělených do několika metod poslouchače události. Vedle asynchronních operací databáze vám program Adobe AIR také umožňuje spustit operace databáze synchronně. V synchronním režimu spuštění neběží operace na pozadí. Namísto toho běží ve stejné sekvenci spuštění jako všechny ostatní kódy aplikace. Sdělíte modulu databáze, aby provedl operaci. Kód se poté v daném bodu zastaví, zatímco modul databáze pracuje. Po dokončení operace pokračuje provádění s dalším řádkem vašeho kódu. Asynchronní nebo synchronní spuštění se nastavuje na úrovni SQLConnection. Pomocí jediného připojení databáze nemůžete spustit některé operace nebo příkazy synchronně a jiné asynchronně. To, zda SQLConnection pracuje v synchronním nebo asynchronním režimu spuštění, určíte voláním metody SQLConnection pro otevření databáze. Jestliže voláte SQLConnection.open(), připojení probíhá v synchronním režimu spuštění, a jestliže voláte SQLConnection.openAsync(), dojde k připojení v asynchronním režimu. Jakmile je instance SQLConnection připojena k databázi pomocí open() nebo openAsync(), je nastavena na synchronní nebo asynchronní režim spuštění, pokud neuzavřete a znovu neotevřete připojení k databázi. Každý režim spuštění má své výhody. Zatímco je většina aspektů každého režimu podobná, existují určité rozdíly, které je vhodné si při práci s daným režimem zapamatovat. Více informací o těchto tématech a návrhy pro práci v každém režimu naleznete v tématu „Použití synchronních a asynchronních operací databáze“ na stránce 184.
Vytváření a úpravy databáze Před tím, než může vaše aplikace přidat nebo načíst data, musí existovat databáze s tabulkami, které jsou v ní definované, a ke kterým může daná aplikace získat přístup. Zde jsou popsány úlohy vytvoření databáze a vytvoření datové struktury uvnitř databáze. I když se tyto úlohy používají méně častěji než vkládání a načítání dat, jsou pro většinu aplikací nezbytné.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 165 Práce s lokálními databázemi SQL
Vytváření databáze Pro vytvoření souboru databáze nejprve vytvořte instanci SQLConnection. Voláním metody open() instanci otevřete v synchronním režimu spuštění a voláním metody openAsync() ji otevřete v asynchronním režimu. Metody open() a openAsync() se používají k otevření připojení k databázi. Jestliže předáte instanci File, která odkazuje na neexistující umístění souboru pro parametr reference (první parametr), metoda open() nebo openAsync() vytvoří soubor databáze v daném umístění souboru a otevře připojení k nově vytvořené databázi. Ať pro vytvoření databáze voláte metodu open() nebo metodu openAsync(), název souboru databáze může být jakýkoli platný název souboru s jakoukoli příponou názvu souboru. Jestliže voláte metodu open() nebo openAsync() s hodnotou null pro parametr reference, vytvoří se spíše nová databáze v paměti než soubor databáze na disku. Následující příklad kódu ukazuje proces vytvoření souboru databáze (nová databáze) pomocí asynchronního režimu spuštění. V tomto případě je soubor databáze uložen v adresáři uložení dat aplikace pod názvem souboru „DBSample.db“: import flash.data.SQLConnection; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent.OPEN, openHandler); conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); conn.openAsync(dbFile); function openHandler(event:SQLEvent):void { trace("the database was created successfully"); } function errorHandler(event:SQLErrorEvent):void { trace("Error message:", event.error.message); trace("Details:", event.error.details); }
Pro synchronní provedení operací volejte při otevření připojení databáze pomocí instance SQLConnection metodu open(). Následující příklad ukazuje způsob vytvoření a otevření instance SQLConnection, která své operace spustí synchronně: import flash.data.SQLConnection; import flash.errors.SQLError; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); try { conn.open(dbFile); trace("the database was created successfully"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.details); }
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 166 Práce s lokálními databázemi SQL
Vytváření tabulek databáze Vytvoření tabulky v databázi zahrnuje spuštění příkazu SQL na dané databázi, pomocí stejného procesu, který můžete použít pro spuštění příkazu SQL, například SELECT, INSERT, atd. Pro vytvoření tabulky použijte příkaz CREATE TABLE, který zahrnuje definice sloupců a vazeb pro novou tabulku. Více informací o spuštění příkazů SQL naleznete v části „Práce s příkazy SQL“ na stránce 168. Následující příklad ukazuje vytvoření tabulky pojmenované „zaměstnanci“ v existujícím souboru databáze, pomocí asynchronního režimu spuštění. Upozorňujeme, že tento kód předpokládá existenci instance SQLConnection pojmenované conn, která je již konkretizovaná a je již připojena k databázi. import flash.data.SQLConnection; import flash.data.SQLStatement; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; // ... create and open the SQLConnection instance named conn ... var createStmt:SQLStatement = new SQLStatement(); createStmt.sqlConnection = conn; var sql:String = "CREATE TABLE IF NOT EXISTS employees (" + " empId INTEGER PRIMARY KEY AUTOINCREMENT, " + " firstName TEXT, " + " lastName TEXT, " + " salary NUMERIC CHECK (salary > 0)" + ")"; createStmt.text = sql; createStmt.addEventListener(SQLEvent.RESULT, createResult); createStmt.addEventListener(SQLErrorEvent.ERROR, createError); createStmt.execute(); function createResult(event:SQLEvent):void { trace("Table created"); } function createError(event:SQLErrorEvent):void { trace("Error message:", event.error.message); trace("Details:", event.error.details); }
Následující příklad ukazuje způsob vytvoření tabulky pojmenované „zaměstnanci“ v existujícím souboru databáze, pomocí synchronního režimu spuštění. Upozorňujeme, že tento kód předpokládá existenci instance SQLConnection pojmenované conn, která je již konkretizovaná a je již připojena k databázi.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 167 Práce s lokálními databázemi SQL
import flash.data.SQLConnection; import flash.data.SQLStatement; import flash.errors.SQLError; // ... create and open the SQLConnection instance named conn ... var createStmt:SQLStatement = new SQLStatement(); createStmt.sqlConnection = conn; var sql:String = "CREATE TABLE IF NOT EXISTS employees (" + " empId INTEGER PRIMARY KEY AUTOINCREMENT, " + " firstName TEXT, " + " lastName TEXT, " + " salary NUMERIC CHECK (salary > 0)" + ")"; createStmt.text = sql; try { createStmt.execute(); trace("Table created"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.details); }
Manipulace s daty databází SQL Existují určité běžné úlohy, které při práci s lokálními databázemi SQL provedete. Tyto úlohy zahrnují připojení k databázi, přidání dat a načtení dat z tabulek v databázi. Během provádění těchto úloh, například při práci s datovými typy a zpracovávání chyb, je dobré pamatovat na několik aspektů. Všimněte si, že existuje také několik úloh databází, se kterými přijdete do styku méně častěji, ale bude je často třeba provést před provedením těchto běžnějších úloh. Například před připojením k databázi a načtením dat z tabulky budete potřebovat vytvořit databázi a v tabulkách vytvořit tabulkovou strukturu. Tyto méně časté úlohy počátečního nastavení jsou vysvětleny v části „Vytváření a úpravy databáze“ na stránce 164. Můžete si zvolit asynchronní provedení operací databáze, což znamená, že modul databáze běží na pozadí a úspěšné dokončení operace, nebo naopak její selhání, vám oznámí odesláním události. Tyto operace můžete také provést synchronně. V tomto případě jsou operace databáze provedeny postupně a celá aplikace (včetně aktualizacích na obrazovce) před spuštěním dalšího kódu počká na dokončení operací. Příklady v této části ukazují způsob provedení operací asynchronně i synchronně. Více informací o práci v asynchronním nebo synchronním režimu spuštění naleznete v části „Použití synchronních a asynchronních operací databáze“ na stránce 184.
Připojení k databázi Před tím, než můžete provést jakoukoliv operaci databáze, je třeba nejprve otevřít připojení k souboru databáze. Instance SQLConnection se používá k reprezentaci připojení k jedné nebo více databázím. První databáze, která je připojena pomocí instance SQLConnection, je známá jako „hlavní“ databáze. Tato databáze je připojena pomocí metody open() (pro synchronní režim spuštění) nebo metody openAsync() (pro asynchronní režim spuštění). Jestliže otevřete databázi pomocí asynchronní operace openAsync(), zaregistrujte se pro událost instance SQLConnectionopen, abyste věděli, kdy se operace openAsync() dokončí. Zaregistrujte se pro událost instance SQLConnection error, abyste určili případné selhání operace.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 168 Práce s lokálními databázemi SQL
Následující příklad ukazuje způsob otevření stávajícího souboru databáze pro asynchronní spuštění. Soubor databáze je pojmenován „DBSample.db“ a je umístěn v adresáři pro ukládání aplikace uživatele. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent.OPEN, openHandler); conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); conn.openAsync(dbFile, SQLMode.UPDATE); function openHandler(event:SQLEvent):void { trace("the database opened successfully"); } function errorHandler(event:SQLErrorEvent):void { trace("Error message:", event.error.message); trace("Details:", event.error.details); }
Následující příklad ukazuje způsob otevření stávajícího souboru databáze pro synchronní spuštění. Soubor databáze je pojmenován „DBSample.db“ a je umístěn v adresáři pro ukládání aplikace uživatele. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.errors.SQLError; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); try { conn.open(dbFile, SQLMode.UPDATE); trace("the database opened successfully"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.details); }
Všimněte si, že ve volání metody openAsync() v asynchronním příkladu a volání metody open() v synchronním příkladu, je druhý argument konstanta SQLMode.UPDATE. Určení SQLMode.UPDATE pro druhý parametr (openMode) způsobí, že runtime odešle chybu, jestliže určený soubor neexistuje. Jestliže předáte SQLMode.CREATE pro parametr openMode (nebo jestliže vynecháte parametr openMode), runtime se pokusí vytvořit soubor databáze, jestliže určení soubor neexistuje. Pokud ale soubor existuje, je otevřen. Tento postup je stejný jako postup pomocí SQLMode.Update. Můžete také určit SQLMode.READ pro parametr openMode k otevření stávající databáze v režimu určenému pouze ke čtení. V tomto případě lze data z databáze načíst, ale žádná data nelze přidat, smazat nebo změnit.
Práce s příkazy SQL Jednotlivý příkaz SQL (dotaz nebo příkaz) je znázorněn v runtime jako objekt SQLStatement. Pro vytvoření a spuštění příkazu SQL postupuje dle těchto kroků:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 169 Práce s lokálními databázemi SQL
Vytvořte instanci SQLStatement. Objekt SQLStatement představuje příkaz SQL ve vaší aplikaci. var selectData:SQLStatement = new SQLStatement();
Určete, oproti které databázi dotaz běží. Pro toto určení nastavte vlastnost objektu SQLStatement sqlConnection na instanci SQLConnection, která je připojena k požadované databázi. // A SQLConnection named "conn" has been created previously selectData.sqlConnection = conn;
Určete vlastní příkaz SQL. Vytvořte text příkazu jako řetězec a přiřaďte jej k vlastnosti instance SQLStatement text. selectData.text = "SELECT col1, col2 FROM my_table WHERE col1 = :param1";
Definujte funkce, které zpracují výsledek operace spuštění (pouze v režimu asynchronního spuštění). Pomocí metody addEventListener() zaregistrujte funkce jako posluchače událostí instanceresult a error. // using listener methods and addEventListener(); selectData.addEventListener(SQLEvent.RESULT, resultHandler); selectData.addEventListener(SQLErrorEvent.ERROR, errorHandler); function resultHandler(event:SQLEvent):void { // do something after the statement execution succeeds } function errorHandler(event:SQLErrorEvent):void { // do something after the statement execution fails }
Metody posluchače můžete také určit pomocí objektu Responder. V tomto příkladě vytvořte instanci Responder a připojte k ní metody posluchače. // using a Responder (flash.net.Responder) var selectResponder = new Responder(onResult, onError); function onResult(result:SQLResult):void { // do something after the statement execution succeeds } function onError(error:SQLError):void { // do something after the statement execution fails }
Jestliže text příkazu zahrnuje definice parametrů, přiřaďte těmto parametrům hodnoty. Pro přiřazení hodnot parametrů použijte vlastnost asociativního pole instance SQLStatement parameters. selectData.parameters[":param1"] = 25;
Spuštění příkazu SQL. Volání metody instance SQLStatementexecute().
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 170 Práce s lokálními databázemi SQL
// using synchronous execution mode // or listener methods in asynchronous execution mode selectData.execute();
Pokud používáte třídu Responder namísto posluchačů události v asynchronním režimu spuštění, předejte instanci Responder metodě execute(). // using a Responder in asynchronous execution mode selectData.execute(-1, selectResponder);
Specifické příklady, které tyto kroky ukazují, naleznete v následujících tématech: „Načítání dat z databáze“ na stránce 172 „Vkládání dat“ na stránce 177 „Změna nebo mazání dat“ na stránce 180
Používání parametrů v příkazech Parametr příkazu SQL vám umožňuje vytvořit příkaz SQL, který lze použít opakovaně. Při používání parametrů příkazu se mohou hodnoty uvnitř příkazu změnit (například hodnoty přidané v příkazu INSERT), ale základní text příkazu zůstává nezměněn. Díky tomu získáte při používání parametrů lepší výkon a i kódování aplikace bude snazší.
Chápání parametrů příkazu Aplikace často používá jediný příkaz SQL několikrát, s menší odchylkou. Vezměme například aplikaci sledující inventář, kde uživatel může přidat nové položky inventáře do databáze. Kód aplikace, který přidá položku inventáře do databáze, spustí příkaz SQL INSERT, který vlastně přidá data do databáze. Při každém provedení příkazu nicméně dojde k menší odchylce. Zvláště skutečné hodnoty vložené do tabulky se liší, protože jsou specifické pro přidávanou položku inventáře. U příkazů SQL, který je použit několikrát s několika hodnotami v příkaze, nejlepším přístupem je použít příkaz SQL, který zahrnuje parametry spíše než hodnoty literálu v textu SQL. Parametr je vyhrazené místo v textu příkazu, které je při každém spuštění příkazu nahrazeno skutečnou hodnotou. Pro použití parametrů v příkazu SQL vytvořte jako obvykle instanci SQLStatement. Pro skutečný vlastní SQL přiřazený k vlastnosti text použijte vyhrazené místo parametru spíše než hodnoty literálů. Poté definujte hodnotu pro každý parametr nastavením hodnoty elementu ve vlastnosti instance SQLStatement parameters. Vlastnost parametrů je asociativní pole, takže určitou hodnotu nastavíte pomocí následující syntaxe: statement.parameters[parameter_identifier] = value;
parameter_identifier je řetězec, pokud používáte pojmenovaný parametr nebo index celého čísla, jestliže používáte nepojmenovaný parametr.
Používání pojmenovaných parametrů Parametr může být pojmenovaným parametrem. Pojmenovaný parametr má určitý název, který databáze používá pro spárování hodnoty parametru s jejím vyhrazeným místem v textu příkazu. Název parametru se skládá ze znaků „:“ nebo „@“ následovaným názvem, viz následující příklad: :itemName @firstName
Následující příklad kódu ukazuje použití pojmenovaných parametrů:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 171 Práce s lokálními databázemi SQL
var sql:String = "INSERT INTO inventoryItems (name, productCode)" + "VALUES (:name, :productCode)"; var addItemStmt:SQLStatement = new SQLStatement(); addItemStmt.sqlConnection = conn; addItemStmt.text = sql; // set parameter values addItemStmt.parameters[":name"] = "Item name"; addItemStmt.parameters[":productCode"] = "12345"; addItemStmt.execute();
Používání nepojmenovaných parametrů Jako alternativu použití pojmenovaného parametru můžete také použít nepojmenované parametry. Pro použití nepojmenovaného parametru označíte parametr v příkazu SQL pomocí znaku „?“ znak. Každému parametru je přiřazen numerický index, podle pořadí parametrů v příkazu, které začíná indexem 0 pro první parametr. Následující příklad ukazuje verzi předchozího příkladu pomocí nepojmenovaných parametrů: var sql:String = "INSERT INTO inventoryItems (name, productCode)" + "VALUES (?, ?)"; var addItemStmt:SQLStatement = new SQLStatement(); addItemStmt.sqlConnection = conn; addItemStmt.text = sql; // set parameter values addItemStmt.parameters[0] = "Item name"; addItemStmt.parameters[1] = "12345"; addItemStmt.execute();
Výhody používání parametrů Používání parametrů v příkazu SQL poskytuje následující výhody: Vyšší výkon Instance SQLStatement používající parametry může mít o mnoho vyšší výkon v porovnání s instancí, která
dynamicky vytvoří text SQL při každém spuštění. Důvodem vyššího výkonu je to, že je příkaz proveden jednou a může být poté proveden několikrát použitím hodnot odlišného parametru, bez potřeby znovu kompilovat příkaz SQL. Explicitní typování dat Parametry jsou používány pro umožnění typovaného nahrazení hodnot, které jsou neznámé v době vytváření příkazu SQL. Použití parametrů je jediný způsob, jak zaručit třídu ukládání hodnoty, předané do databáze. Nejsou-li používány parametry, runtime se pokusí převést všechny hodnoty z jejich textového znázornění na třídu uložení, a to na základě podobnosti přiřazeného typu sloupce. Více informace o kategoriích ukládání a podobnosti sloupců naleznete v části „Podpora datového typu“ v příloze „SQL podpora v lokálních databázích “ v Referenční příručce jazyka ActionScript 3.0 a jeho komponent. Větší zabezpečení Používání parametrů vám pomůže zabránit problémové technice známé jako vnucení SQL. Při vnucení SQL zadá uživatel kód SQL do jemu přístupnému umístění (například do pole pro zadání dat). Pokud vytváří aplikační kód příkaz SQL přímo zřetězením vstupu uživatele do textu SQL, bude kód SQL zadaný uživatelem proveden na databázi. Následuje příklad spojení vstupu uživatele do textu SQL. Tuto techniku nepoužívejte:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 172 Práce s lokálními databázemi SQL
// assume the variables "username" and "password" // contain user-entered data var sql:String = "SELECT userId " + "FROM users " + "WHERE username = '" + username + "' " + " AND password = '" + password + "'"; var statement:SQLStatement = new SQLStatement(); statement.text = sql;
Používání parametrů příkazu namísto spojení uživatelem zadaných hodnot do textu příkazu zabraňuje vnucení SQL. K vnucení SQL nedojde, protože hodnoty parametru jsou explicitně zpracovány jako nahrazené hodnoty a nestávají se částí textu příkazu literálu. Následuje doporučená alternativa předcházejícího seznamu: // assume the variables "username" and "password" // contain user-entered data var sql:String = "SELECT userId " + "FROM users " + "WHERE username = :username " + " AND password = :password"; var statement:SQLStatement = new SQLStatement(); statement.text = sql; // set parameter values statement.parameters[":username"] = username; statement.parameters[":password"] = password;
Načítání dat z databáze Načítání dat z databáze zahrnuje dva kroky. Nejprve spusťte příkaz SQL SELECTpopisující množinu dat, kterou z databáze požadujete. Dále získejte přístup k načteným datům a dle potřeb své aplikace je zobrazte nebo s nimi manipulujte.
Spuštění příkazu SELECT Pro načtení stávajících dat z databáze použijte instanci SQLStatement. Přiřaďte příslušný příkaz SQL SELECT vlastnosti instance text a poté volejte její metodu execute(). Podrobnosti o syntaxi příkazu SELECT naleznete v příloze „SQL podpora v lokálních databázích “ v Referenční příručce jazyka ActionScript 3.0 a jeho komponent. Následující příklad ukazuje spuštění příkazu SELECT k načtení dat z tabulky pojmenované „products“ (produkty) pomocí asynchronního režimu spuštění: var selectStmt:SQLStatement = new SQLStatement(); // A SQLConnection named "conn" has been created previously selectStmt.sqlConnection = conn; selectStmt.text = "SELECT itemId, itemName, price FROM products"; // The resultHandler and errorHandler are listener methods are // described in a subsequent code listing selectStmt.addEventListener(SQLEvent.RESULT, resultHandler); selectStmt.addEventListener(SQLErrorEvent.ERROR, errorHandler); selectStmt.execute();
Následující příklad ukazuje spuštění příkazu SELECT pro načtení dat z tabulky pojmenované „products“ (produkty) pomocí asynchronního režimu spuštění:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 173 Práce s lokálními databázemi SQL
var selectStmt:SQLStatement = new SQLStatement(); // A SQLConnection named "conn" has been created previously selectStmt.sqlConnection = conn; selectStmt.text = "SELECT itemId, itemName, price FROM products"; // This try..catch block is fleshed out in // a subsequent code listing try { selectStmt.execute(); // accessing the data is shown in a subsequent code listing } catch (error:SQLError) { // error handling is shown in a subsequent code listing }
Když příkaz v asynchronním režimu spuštění dokončí provádění, instance SQLStatement odešle událostresult(SQLEvent.RESULT), která udává, že příkaz byl úspěšně spuštěn. Alternativně, pokud je objekt Responder předán jako argument ve volání execute(), je volána funkce zpracování výsledku objektu Responder. V synchronním režimu spuštění je spuštění přerušeno, dokud operace execute() není dokončena a poté se bude pokračovat s dalším řádkem kódu.
Přístup k výsledným datům příkazu SELECT Jakmile příkaz SELECT dokončil provádění, je dalším krokem získání přístupu k datům, která byla načtena. Každý řádek dat ve výsledné množině SELECT se stane instancí Object. Daný objekt má vlastnosti, jejichž názvy se shodují s názvy sloupců množin výsledků. Vlastnosti obsahují hodnoty ze sloupců množiny výsledků. Předpokládejme například, že příkaz SELECT určuje množinu výsledků se třemi sloupci pojmenovanými „itemId“, „itemName“ a „price“. Pro každý řádek v množině výsledků je vytvořena instance Object s vlastnostmi pojmenovanými itemId, itemNamea price. Tyto vlastnosti obsahují hodnoty ze svých příslušných sloupců. Následující příklad kódu navazuje na kód předcházejí pro načtení dat v režimu asynchronního spuštění. Ukazuje, jak získat přístup k načteným datům v rámci metody posluchače události výsledků. function resultHandler(event:SQLEvent):void { var result:SQLResult = selectStmt.getResult(); var numResults:int = result.data.length; for (var i:int = 0; i < numResults; i++) { var row:Object = result.data[i]; var output:String = "itemId: " + row.itemId; output += "; itemName: " + row.itemName; output += "; price: " + row.price; trace(output); } } function errorHandler(event:SQLErrorEvent):void { // Information about the error is available in the // event.error property, which is an instance of // the SQLError class. }
Následující příklad kódu rozšiřuje předcházející kód pro načtení dat v režimu synchronního spuštění. Rozšíří blok try..catch v předcházejícím příkladu synchronního spuštění a ukáže, jak získat přístup k načteným datům.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 174 Práce s lokálními databázemi SQL
try { selectStmt.execute(); var result:SQLResult = selectStmt.getResult(); var numResults:int = result.data.length; for (var i:int = 0; i < numResults; i++) { var row:Object = result.data[i]; var output:String = "itemId: " + row.itemId; output += "; itemName: " + row.itemName; output += "; price: " + row.price; trace(output); } } catch (error:SQLError) { // Information about the error is available in the // error variable, which is an instance of // the SQLError class. }
Jak ukazuje předchozí příklad kódu, jsou výsledné objekty obsaženy v poli, které je dostupné jako vlastnost instance SQLResult data. Jestliže asynchronní provedení s posluchačem události používáte k načtení dané instance SQLResult, voláte metodu instance SQLStatement getResult(). Jestliže určíte argument Responder ve volání execute(), je instance SQLResult předána funkci zpracování výsledku jako argument. V asynchronním režimu spuštění voláte metodu instance SQLStatement getResult() kdykoliv po volání metody execute(). V jakémkoliv případě můžete po získání objektu SQLResult získat přístup k řádkům výsledků pomocí vlastnosti pole data. Následující příklad kódu definuje instanci SQLStatement, jejíž text je příklad SELECT. Tento příklad načte řádky obsahující hodnoty sloupců firstName a lastName všech řádků tabulky pojmenované employees. Tento příklad používá asynchronní režim spuštění. Po dokončení spuštění je volána metoda selectResult() a výsledné řádky dat jsou přístupné pomocí metody SQLStatement.getResult() a zobrazeny pomocí metody trace(). Upozorňujeme, že tento kód předpokládá existenci instance SQLConnection pojmenované conn, která je již konkretizovaná a je již připojena k databázi. Předpokládá také, že tabulka „employees“ již byla vytvořena a je vyplněna daty.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 175 Práce s lokálními databázemi SQL
import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; // ... create and open the SQLConnection instance named conn ... // create the SQL statement var selectStmt:SQLStatement = new SQLStatement(); selectStmt.sqlConnection = conn; // define the SQL text var sql:String = "SELECT firstName, lastName " + "FROM employees"; selectStmt.text = sql; // register listeners for the result and error events selectStmt.addEventListener(SQLEvent.RESULT, selectResult); selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); // execute the statement selectStmt.execute(); function selectResult(event:SQLEvent):void { // access the result data var result:SQLResult = selectStmt.getResult(); var numRows:int = result.data.length; for (var i:int = 0; i < numRows; i++) { var output:String = ""; for (var columnName:String in result.data[i]) { output += columnName + ": " + result.data[i][columnName] + "; "; } trace("row[" + i.toString() + "]\t", output); } } function selectError(event:SQLErrorEvent):void { trace("Error message:", event.error.message); trace("Details:", event.error.details); }
Následující příklad kódu ukazuje stejné techniky jako předcházející příklad, ale používá synchronní režim spuštění. Následující příklad kódu definuje instanci SQLStatement, jejíž text je příkaz SELECT. Tento příklad načte řádky obsahující hodnoty sloupců firstName a lastName všech řádků tabulky pojmenované employees. Výsledné řádky dat jsou přístupné pomocí metody SQLStatement.getResult() a jsou zobrazeny pomocí metody trace(). Upozorňujeme, že tento kód předpokládá existenci instance SQLConnection pojmenovanéconn, která je již konkretizovaná a je již připojena k databázi. Předpokládá také, že tabulka „employees“ již byla vytvořena a je vyplněna daty.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 176 Práce s lokálními databázemi SQL
import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.errors.SQLError; // ... create and open the SQLConnection instance named conn ... // create the SQL statement var selectStmt:SQLStatement = new SQLStatement(); selectStmt.sqlConnection = conn; // define the SQL text var sql:String = "SELECT firstName, lastName " + "FROM employees"; selectStmt.text = sql; try { // execute the statement selectStmt.execute(); // access the result data var result:SQLResult = selectStmt.getResult(); var numRows:int = result.data.length; for (var i:int = 0; i < numRows; i++) { var output:String = ""; for (var columnName:String in result.data[i]) { output += columnName + ": " + result.data[i][columnName] + "; "; } trace("row[" + i.toString() + "]\t", output); } } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.details); }
Určení datového typu výsledných dat příkazu SELECT Každý řádek vrácený příkazem SELECT je implicitně vytvořen jako instance Object s vlastnostmi pojmenovanými pro názvy sloupců množiny výsledků a s hodnotou každého sloupce jako hodnotou své asociované vlastnosti. Nicméně před provedením příkazu SQL SELECT můžete vlastnost itemClass instance SQLStatement nastavit na třídu. Nastavením vlastnosti itemClass je každý řádek vrácený příkazem SELECT vytvořen jako instance určené třídy. Runtime přiřadí výsledné hodnoty sloupce k hodnotám vlastnosti spárováním názvů sloupců v množině výsledků SELECT s názvy vlastností ve třídě itemClass. Jakákoliv třída přiřazená jako hodnota vlastnosti itemClass musí mít konstruktor, který nevyžaduje žádné parametry. Navíc musí mít třída jedinou vlastnost pro každý sloupec vrácený příkazem SELECT. Jestliže nemá sloupec v seznamu SELECT odpovídající název vlastnosti ve třídě itemClass, je to považováno za chybu.
Částečné načítání výsledků příkazu SELECT. Provedení příkazu SELECT implicitně načte všechny řádky výsledné množiny najednou. Jakmile je příkaz dokončen, načtená data obvykle nějakým způsobem zpracujete. Například vytvořením objektů nebo zobrazením dat na obrazovce. Jestliže příkaz vrátí větší počet řádků, může být zpracování všech dat najednou náročné pro počítač, což způsobí, že se uživatelské rozhraní znovu nenakreslí.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 177 Práce s lokálními databázemi SQL
Vnímaný výkon své aplikace můžete vylepšit tím, že runtime nařídíte vrátit vždy specifický počet výsledných řádků. Tím se budou počáteční výsledná data vracet rychleji. Budete také moct rozdělit výsledné řádky do množin a uživatelské rozhraní bude tak po zpracování každé množiny řádků aktualizováno. Upozorňujeme, že tuto techniku je praktické použít pouze v asynchronním režimu spuštění. Pro částečné načtení výsledků SELECT určete hodnotu pro první parametr metody SQLStatement.execute() (parametr prefetch). Parametr prefetch určuje počet řádků, které budou načteny při prvním provedení příkazu. Když při volání metody instance SQLStatement execute() určíte hodnotu parametru prefetch, je načteno pouze určené množství řádků: var stmt:SQLStatement = new SQLStatement(); stmt.sqlConnection = conn; stmt.text = "SELECT ..."; stmt.addEventListener(SQLEvent.RESULT, selectResult); stmt.execute(20); // only the first 20 rows (or fewer) are returned
Příkaz odešle událost result určující, že první množina řádků je dostupná. Výsledná vlastnost instance SQLResult data obsahuje řádky dat a její vlastnostcomplete určuje, zda jsou k načtení určeny dodatečné řádky výsledků. Pro načtení dodatečných řádků výsledků volejte metodu instance SQLStatement next(). Jako v případě metody execute() je první parametr metody next() použit pro označení počtu řádků, které se mají při dalším odeslání události výsledku načíst. function selectResult(event:SQLEvent):void { var result:SQLResult = stmt.getResult(); if (result.data != null) { // ... loop through the rows or perform other processing ... if (!result.complete) { stmt.next(20); // retrieve the next 20 rows } else { stmt.removeEventListener(SQLEvent.RESULT, selectResult); } } }
SQLStatement odešle událost result pokaždé, kdy metoda next() vrátí následnou množinu řádků výsledků: Následně lze stejnou funkci posluchače použít k pokračování ve zpracovávání výsledků (z volání next()), dokud nejsou načteny všechny řádky. Více informací naleznete v referenčních popisech jazyka pro metodu SQLStatement.execute()(popis parametru prefetch) a metodu SQLStatement.next().
Vkládání dat Načítání dat z databáze zahrnuje provedení příkazu SQL INSERT. Ihned po dokončení provádění příkazu máte přístup k primárnímu klíči pro nově vložený řádek, jestliže byl klíč vygenerován databází.
Provádění příkazu INSERT Pro přidání dat do tabulky v databázi vytvořte a spusťte instanci SQLStatement, jejíž text je příkaz SQL INSERT.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 178 Práce s lokálními databázemi SQL
Následují příklad používá instanci SQLStatement k přidání řádku dat k již existující tabulce zaměstnanců. Tento příklad ukazuje vkládání dat pomocí režimu asynchronního spuštění. Upozorňujeme, že tento kód předpokládá existenci instance SQLConnection pojmenované conn, která je již konkretizovaná a je již připojena k databázi. Předpokládá také, že tabulka „employees“ již byla vytvořena. import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.events.SQLErrorEvent; import flash.events.SQLEvent; // ... create and open the SQLConnection instance named conn ... // create the SQL statement var insertStmt:SQLStatement = new SQLStatement(); insertStmt.sqlConnection = conn; // define the SQL text var sql:String = "INSERT INTO employees (firstName, lastName, salary) " + "VALUES ('Bob', 'Smith', 8000)"; insertStmt.text = sql; // register listeners for the result and failure (status) events insertStmt.addEventListener(SQLEvent.RESULT, insertResult); insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError); // execute the statement insertStmt.execute(); function insertResult(event:SQLEvent):void { trace("INSERT statement succeeded"); } function insertError(event:SQLErrorEvent):void { trace("Error message:", event.error.message); trace("Details:", event.error.details); }
Následující příklad přidá řádek dat k již existující tabulce zaměstnanců pomocí synchronního režimu spuštění. Upozorňujeme, že tento kód předpokládá existenci instance SQLConnection pojmenované conn, která je již konkretizovaná a je již připojena k databázi. Předpokládá také, že tabulka „zaměstnanci“ již byla vytvořena.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 179 Práce s lokálními databázemi SQL
import flash.data.SQLConnection; import flash.data.SQLResult; import flash.data.SQLStatement; import flash.errors.SQLError; // ... create and open the SQLConnection instance named conn ... // create the SQL statement var insertStmt:SQLStatement = new SQLStatement(); insertStmt.sqlConnection = conn; // define the SQL text var sql:String = "INSERT INTO employees (firstName, lastName, salary) " + "VALUES ('Bob', 'Smith', 8000)"; insertStmt.text = sql; try { // execute the statement insertStmt.execute(); trace("INSERT statement succeeded"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.details); }
Načítání databází vygenerovaného primárního klíče vloženého řádku Váš kód potřebuje po vložení řádku dat do tabulky často vědět databází vygenerovaný primární klíč nebo hodnotu identifikátoru řádku pro nově vložený řádek. Například po vložení řádku do tabulky si můžete přát vložit řádky do související tabulky. V takovém případě je třeba vložit hodnotu primárního klíče do související tabulky jako cizí klíč. Primární klíč nově vloženého řádku lze načíst pomocí objektu SQLResult vygenerovaného provedením příkazu. Jedná se o stejný objekt, který je použit pro přístup k výsledným datům po provedení příkazu SELECT. Stejně jako v případě libovolného příkazu SQL vytvoří runtime po dokončení provádění příkazu INSERT instanci SQLResult. K instanci SQLResult lze získat přístup voláním metody objektu getResult(), jestliže používáte posluchač události nebo používáte režim synchronního spuštění. Jestliže používáte režim asynchronního spuštění a předáte instanci Responder k volání execute(), je instance SQLResult předána jako argument funkce zpracovávající výsledky. V jakémkoliv příkladě má instance SQLResult vlastnost lastInsertRowID, která obsahuje identifikátor řádku nejnověji vloženého řádku, jestliže je provedený příkaz SQL příkaz INSERT. Následující příklad ukazuje přístup k primárnímu klíči vloženého řádku v režimu asynchronního spuštění: insertStmt.text = "INSERT INTO ..."; insertStmt.addEventListener(SQLEvent.RESULT, resultHandler); insertStmt.execute(); function resultHandler(event:SQLEvent):void { // get the primary key var result:SQLResult = insertStmt.getResult(); var primaryKey:Number = result.lastInsertRowID; // do something with the primary key }
Následující příklad ukazuje přístup k primárnímu klíči vloženého řádku v režimu synchronního spuštění:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 180 Práce s lokálními databázemi SQL
insertStmt.text = "INSERT INTO ..."; try { insertStmt.execute(); // get the primary key var result:SQLResult = insertStmt.getResult(); var primaryKey:Number = result.lastInsertRowID; // do something with the primary key } catch (error:SQLError) { // respond to the error }
Upozorňujeme, že identifikátor řádku může a nemusí být hodnotou sloupce, který je určen jako sloupec primárního klíče v definici tabulky, podle následujícího pravidla:
• Jestliže je tabulka definována pomocí sloupce primárního klíče, jehož podobnost (datový typ sloupce) je INTEGER, obsahuje vlastnost lastInsertRowID hodnotu, která byla do dané řádky vložena (nebo hodnotu vygenerovanou runtime, jestliže se jedná o sloupec AUTOINCREMENT).
• Jestliže je tabulka definována pomocí více sloupců primárního klíče (složený klíč) nebo pomocí jednoho sloupce primárního klíče, jehož podobnost není INTEGER, vytvoří databáze v pozadí pro daný řádek hodnotu identifikátoru řádku. Tato vygenerovaná hodnota je hodnotou vlastnosti lastInsertRowID.
• Hodnota je vždy identifikátorem nejnověji vloženého řádku. Jestliže příkaz INSERT způsobí aktivaci spouštěče, který vloží řádek, vlastnost lastInsertRowID obsahuje identifikátoru řádku posledního řádku vloženého spouštěčem, nikoliv řádku vytvořeného příkazem INSERT. Pokud si tedy přejete mít explicitně definovaný sloupec primárního klíče, jehož hodnota je dostupná po příkazu INSERT díky vlastnosti SQLResult.lastInsertRowID, musí být sloupec definován jako sloupec INTEGER PRIMARY KEY. Nicméně upozorňujeme, že i když vaše tabulka neobsahuje explicitní sloupec INTEGER PRIMARY KEY, je také přijatelná pro použití databází vytvořeného identifikátoru řádku jako primární klíč pro vaší tabulku ve smyslu definování vztahů se souvisejícími tabulkami. Hodnota sloupce identifikátoru řádku je dostupná v libovolném příkazu SQL pomocí jednoho ze speciálních názvů sloupce ROWID, _ROWID_neboOID. Sloupec cizího klíče můžete vytvořit v související tabulce a použít hodnotu identifikátoru řádku jako hodnotu sloupce cizího klíče, stejně jako v případě explicitně deklarovaného sloupce INTEGER PRIMARY KEY. Jestliže tedy používáte libovolný primární klíč spíše než přirozený klíč a pokud vám nevadí, že hodnotu primárního klíče pro vás generuje runtime, je velice malý rozdíl mezi použitím sloupce INTEGER PRIMARY KEY nebo systémem vytvořeného identifikátoru řádku jako primárního klíče tabulky pro určení vztahu cizího klíče mezi dvěma tabulkami. Více informací o primárních klíčích a vygenerovaných identifikátorech řádku naleznete v částech nazvaných „CREATE TABLE” a „Výrazy” v příloze „SQL podpora v lokálních databázích” v referenční příručce jazyka ActionScript 3.0 a jeho komponent.
Změna nebo mazání dat Proces provádění operací jiných než operací manipulace s daty je shodný s procesem použitým k provedení příkazu SQL SELECT nebo INSERT. Jednoduše nahraďte odlišný příkaz SQL ve vlastnosti instance SQLStatementtext:
• Pro změnu stávajících dat v tabulce použijte příkaz UPDATE. • Pro odstranění jednoho nebo více řádků z tabulky použijte příkaz DELETE. Popis těchto příkazů naleznete v příloze „SQL podpora v lokálních databázích” v referenční příručce jazyka ActionScript 3.0 a jeho komponent.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 181 Práce s lokálními databázemi SQL
Práce s více databázemi Metodu SQLConnection.attach() lze použít pro otevření spojení s dodatečnými databázemi na instanci SQLConnection, která již má otevřenou databázi. Přiřazenou databázi můžete pojmenovat pomocí parametru názvu ve volání metody attach(). Při zapisování příkazů pro manipulaci s danou databází můžete poté použít dané jméno v předponě (pomocí formy database-name.table-name) pro kvalifikaci libovolných názvů tabulky ve svých příkazech ve svých SQL. Určíte tak runtime, že danou tabulku lze nelézt v pojmenovaných databázích. Můžete provést jediný příkaz SQL, který zahrnuje tabulky z více databází připojených ke stejné instanci SQLConnection. Jestliže je na instanci SQLConnection vytvořena transakce, použije se daná transakce na všechny příkazy SQL, které jsou provedeny pomocí instance SQL. To je platné bez ohledu na to, na které připojené databázi příklad běží. Alternativně můžete také vytvořit více instancí SQLConnection v aplikaci, kde je každá z nich připojena k jedné nebo více databázím. Jestliže používáte více databází připojení ke stejné databázi, zapamatujte si, že transakce databáze není sdílena mezi instancemi SQLConnection. Následně jestliže připojíte stejný soubor databáze pomocí více instancí SQLConnection, nemůžete se spolehnout na to, že změny dat na obou připojeních budou použity očekávaným způsobem. Jestliže jsou například dva příkazy UPDATE nebo DELETE spuštěny oproti stejné databázi prostřednictvím rozdílných instancí SQLConnection a po provedení jedné operace dojde k chybě aplikace, data databáze lze ponechat v okamžitém stavu, který není vratný a může ovlivnit integritu databáze (a následně i aplikace).
Zpracovávání chyb databáze Obecně je zpracovávání chyb databáze podobné zpracovávání jiných chyb v době běhu. Měli byste zapsat kód, který je připraven pro chyby, ke kterým může dojít, a který na chyby reaguje, spíše než aby ponechal řešení runtime. V obecném smyslu lze možné chyby databáze rozdělit do tří kategorií: chyby připojení, chyby syntaxe SQL a chyby omezení.
Chyby připojení Většina chyb databáze jsou chyby připojení a může k nim dojít během jakékoliv operace. Ačkoliv existují strategie pro zabránění chybám připojení, málokdy existuje jednoduchý způsob napravení chyby připojení, jestliže je databáze důležitou částí vaší aplikace. Většina chyb připojení souvisí se způsobem, jakým runtime vzájemně reaguje s operačním systémem, se systémem souborů a se souborem databáze. K chybě připojení například dojde, jestliže uživatel nemá povolení vytvořit soubor databáze v určitém umístění v systému souborů. Následující strategie vám pomáhají předcházet chybám připojení: Používejte soubory databáze specifické pro daného uživatele Spíše než používání jediného souboru databáze pro
všechny uživatele, kteří aplikaci používají na jediném počítači, přidělte každému uživateli jejich vlastní soubor databáze. Soubor by měl být umístěn v adresáři, který je přiřazen k účtu uživatele. Mohl by být například umístěn v adresáři aplikace pro ukládání, složce v dokumentech uživatele, na ploše uživatele, atd. Vezměte v úvahu různé typy uživatelů Testujte svou aplikaci s různými typy uživatelských účtů, na různých operačních systémech. Nepředpokládejte, že má uživatel na počítači oprávnění administrátora. Nepředpokládejte také, že osoba, která aplikaci instalovala, je uživatel, který jí spouští. Vezměte v úvahu různá umístění souboru Jestliže umožníte uživateli určit, kde má být uložen soubor databáze, nebo
vybrat soubor pro otevření, zvažte možná umístění souboru, která může uživatel použít. Dále zvažte také definující omezení pro umístění, kde mohou uživatelé ukládat (nebo odkud mohou otevírat) soubory databáze. Například můžete uživatelům povolit otvírat pouze soubory, které jsou v úložišti jejich uživatelského účtu. Jestliže dojde k chybě připojení, dojde k ní nejčastěji při prvním pokusu o vytvoření nebo otevření databáze. To znamená, že daný uživatel nemůže v aplikaci provádět operace související s databází. Pro určité typy chyb, například typ pouze ke čtení nebo chyby povolení, je jednou možnou technikou nápravy zkopírování souboru databáze do jiného
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 182 Práce s lokálními databázemi SQL
umístění. Aplikace může zkopírovat soubor databáze do odlišného umístění tam, kde má uživatel povolení k vytváření souborů a k zápisu do souborů a místo toho použije dané umístění.
Chyby syntaxe K chybě syntaxe dojde, je-li příkaz SQL nesprávně formátovaný a aplikace se pokusí daný příkaz provést. Protože jsou příkazy lokální databáze SQL vytvářeny jako řetězce, kontrola syntaxe SQL v době kompilace není možná. Všechny příkazy SQL musí být pro kontrolu jejich syntaxe provedeny. Pro předcházení chyb syntaxe SQL použijte následující strategie: Důkladně otestujte všechny příkazy SQL Je-li to možné, otestujte při vyvíjení aplikace své příkazy SQL odděleně před
jejich zakódováním jako textu příkazu do kódu aplikace. Mimo to použijte přístup kód-test, například testování jednotky pro vytvoření sady testů, které provedou každou možnou volbu a variaci v kódu. Používejte parametry příkazu a vyhněte se řetězení (dynamickému vytváření) SQL Používání parametrů a vyhýbání
se dynamickému vytváření příkazů SQL znamená, že se stejný text příkazu SQL použije při každém provedení příkazu. Následně je o mnoho snazší testovat vaše příkazy a omezit možné variace. Jestliže musíte dynamicky vytvořit příkaz SQL, udržte dynamické části příkazu na minimu. Také důkladně ověřte jakýkoliv uživatelský vstup a ujistěte se, že nezpůsobí chyby syntaxe. Pro nápravu chyby syntaxe by aplikace potřebovala kompletní logiku, aby prozkoumala příkaz SQL a opravila jeho syntaxi. Pokud se budete řídit výše uvedenými pokyny pro předcházení chyb syntaxe, může váš kód identifikovat v době běhu jakékoliv potenciální zdroje chyb syntaxe SQL (například vstup uživatele použitý v příkazu). Pro nápravu chyby syntaxe poskytněte uživateli rady. Označte, co je třeba opravit, aby se příkaz provedl správně.
Chyby omezení K chybám omezení dochází, pokud se příkaz INSERT nebo UPDATE pokusí přidat data do sloupce. K této chybě dojde, pokud nová data poruší jedno z omezení definovaných pro tabulku nebo sloupec. Sada možných omezení zahrnuje: Jedinečné omezení Určuje, že na všech řádcích tabulky nemohou být v jednom sloupci duplicitní hodnoty. Při kombinování více sloupců do jedinečného omezení nesmí být kombinace hodnot v těchto sloupcích duplicitní. Jinak řečeno, mluvíme-li o určeném jedinečném sloupci nebo sloupcích, musí být každý řádek jiný. Omezení primárního klíče Ve vztahu k datům, které omezení povoluje a nepovoluje, je omezení primárního klíče
identické s jedinečným omezením. Nenulové omezení Určuje, že jediný sloupec nemůže uchovávat hodnotu NULL a následně, že v každém řádku musí
mít sloupec hodnotu. Omezení kontroly Umožňuje vám určit libovolné omezení na jedné nebo více tabulkách. Běžné omezení kontroly je
pravidlo, které definuje, že hodnota sloupce musí ležet uvnitř určité hranice (například, že 0). Další typ omezení kontroly určuje vztah mezi hodnotami sloupce (například, že se hodnota sloupce musí lišit od hodnoty jiného sloupce ve stejném řádku). Omezení datového typu (shodnost sloupce) Runtime uplatňuje datový typ hodnot sloupce a jestliže je proveden
pokus o uložení hodnoty nesprávného typu do sloupce, dojde k chybě. Hodnoty jsou nicméně v mnoha podmínkách převedeny, aby odpovídaly deklarovanému datovému typu sloupce. Více informací naleznete v tématu „Práce s datovými typy databáze“ na stránce 184. Runtime neuplatňuje omezení na hodnoty cizího klíče. Jinak řečeno, není vyžadováno, aby se hodnoty cizího klíče shodovaly se stávající hodnotu primárního klíče. Vedle předem definovaných typů omezení podporuje modul SQL runtime použití spouštěčů. Spouštěč se podobá objektu pro zpracování události. Jedná se o předem definovanou sadu pokynů, které jsou provedeny, pokud dojde k určité akci. Mohl by být například definován spouštěč, který běží, když jsou do určité tabulky vložena data, nebo jsou z ní odstraněna. Jedno možné použití spouštěče je prozkoumat změny dat a pokud nejsou splněny určené podmínky,
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 183 Práce s lokálními databázemi SQL
vygenerovat chybu. Proto může spouštěč sloužit ke stejnému účelu jako omezení a strategie pro předcházení chybám omezení a pro jejich nápravu platí také pro chyby generované spouštěčem. Nicméně ID chyby pro chyby vygenerované spouštěčem se liší od ID chyby pro chyby omezení. Množina omezení, která jsou platné pro určitou tabulku, je určena při navrhování aplikace. Pokud budete vědomě navrhovat omezení, bude lehčí navrhnout vaši aplikaci tak, aby předcházela chybám omezení a napravovala je. Systematické předvídání a prevence chyb omezení je nicméně obtížné. Předvídání je obtížné, protože k chybám omezení nedojde, dokud nejsou přidána data aplikace. K chybám omezení dojde s přidáním dat do databáze po jejím vytvoření. Tyto chyby jsou často výsledkem vztahu mezi novými daty a daty, které již v dané databázi existují. Následující strategie vám mohou pomoct vyhnout se mnoha chybám omezení: Opatrné plánování struktury databáze a omezení Účelem omezení je uplatňovat pravidla aplikace a napomáhat
ochraně integrity dat databáze. Při plánování aplikace zvažte, jak databázi strukturovat, aby vaši aplikaci podporovala. Jako součást procesu identifikujte pro svá data pravidla, například zda jsou vyžadovány určité hodnoty, zda má hodnota výchozí nastavení, zda jsou povoleny duplicitní hodnoty, atd. Tato pravidla vás povedou procesem definování omezení databáze. Explicitně určete názvy sloupců Příkaz INSERT může být zapsán bez explicitního určení sloupců, do kterých mají být hodnoty vloženy, ale vystavujete se tím zbytečnému riziku. Explicitním pojmenováním sloupců, do kterých mají být vloženy hodnoty, můžete umožnit automaticky vygenerované hodnoty, sloupce s výchozími hodnotami a sloupce, které umožňují hodnoty NULL. Dále tím můžete zajistit, že všechny sloupce NOT NULL mají vloženou explicitní hodnotu. Použijte výchozí hodnoty Kdykoliv určíte omezení NOT NULL pro sloupec, určete výchozí hodnotu v definici sloupce.
Kód aplikace může také poskytnout výchozí hodnoty. Například váš kód může zkontrolovat, zda je proměnná String null a může ji přiřadit hodnotě před jejím použitím pro nastavení hodnoty parametru příkazu.
Ověřte uživatelem zadaná data Dopředu zkontrolujte uživatelem zadaná data a ujistěte se, zda se řídí limity určenými omezeními, zvláště v případě omezeníNOT NULL a CHECK. Omezení UNIQUE je přirozeně pro kontrolu složitější, protože by kontrola vyžadovala provedení dotazu SELECT pro určení, zda jsou údaje jedinečné. Použijte spouštěče Můžete zapsat spouštěč, který ověří (a možná nahradí) vložená data nebo provede jiné akce pro opravení neplatných dat. Toto ověření a opravení může předejít chybě omezení.
Předcházení chybám omezení je v mnoha způsobech obtížnější, než předcházení jiným typům chyb. Naštěstí existuje několik strategií napravení chyb omezení způsoby, které nebudou mít za následek nestabilní nebo nepoužitelnou aplikaci. Používejte algoritmy konfliktu Při definování omezení na sloupci a při vytváření příkazu INSERT nebo UPDATE máte možnost určit algoritmus konfliktu. Algoritmus konfliktu definuje akci, kterou databáze provede, pokud dojde k porušení omezení. Existuje několik možných akcí, které může modul databáze provést. Modul databáze může ukončit jediný příkaz nebo celou transakci. Může chybu ignorovat. Může odstranit stará data a nahradit je daty, které se kód pokouší uložit.
Více informací o kategoriích naleznete v části „ON CONFLICT (algoritmy konfliktu)” v příloze „SQL podpora v lokálních databázích” v Referenční příručce jazyka ActionScript 3.0 a jeho komponent. Poskytněte korektivní zpětnou vazbu Sada omezení, která může ovlivnit určitý příkaz SQL, může být identifikována
dopředu. Následně můžete očekávat chybu omezení, která může být způsobena příkazem. Díky této znalosti můžete vytvořit logiku aplikace, která bude na chybu omezení reagovat. Předpokládejme například, že aplikace zahrnuje formulář pro zápis dat k zadávání nových produktů. Jestliže je sloupec názvu produktu v aplikaci definován omezením UNIQUE, může akce vložení nového řádku produktu do databáze způsobit chybu omezení. Proto je aplikace navržena tak, aby chyby omezení očekávala. Pokud k chybě dojde, aplikace uživatele upozorní a sdělí, že určený název produktu je již použit a požádá uživatele, aby vybral jiný název. Další možnou reakcí je umožnit uživateli zobrazit informace o jiných produktech se stejným názvem.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 184 Práce s lokálními databázemi SQL
Práce s datovými typy databáze Když je v databázi vytvořena tabulka, příkaz SQL pro vytvoření tabulky definuje pro každý sloupec podobnost nebo datový typ. Ačkoliv lze deklarace podobnosti vypustit, je dobré explicitně deklarovat podobnost sloupců ve vašich SQL příkazech CREATE TABLE. Jako obecné pravidlo je libovolný objekt, který uložíte v databázi pomocí příkazu INSERT, vrácen jako instance stejného datového typu, a to když provedete příkaz SELECT. Datový typ načtené hodnoty se nicméně může lišit v závislosti na podobnosti sloupce databáze, ve kterém je hodnota uložena. Když je ve sloupci uložena hodnota, pokud její datový typ neodpovídá podobnosti sloupce, pokusí se databáze převést hodnotu tak, aby se s podobností sloupce shodovala. Například jestliže je sloupec databáze deklarován pomocí podobnosti NUMERIC, pokusí se databáze před uložením dat převést vložená data do číselné třídy uložení (INTEGER nebo REAL). Jestliže data nelze převést, vygeneruje databáze chybu. Podle tohoto pravidla, jestliže je řetězec „12345“ vložen do sloupceNUMERIC, databáze jej před uložením automaticky převede na hodnotu celého čísla 12345. Když je hodnota načtena s příkazem SELECT, je vrácena jako instance číselného datového typu (například Number), spíše než jako instance String. Pokud chcete předejít nevhodnému převedení datového typu, je nelepší se řídit dvěma pravidly. Zaprvé: definujte každý sloupec s podobností, která se shoduje s typem dat, který má být uložen. Poté vložte pouze hodnoty, jejichž datový typ odpovídá definované podobnosti. Dodržováním těchto pravidel získáte dvě výhody. Data nejsou při vložení neočekávaně převedena (a následkem toho neztratí svůj zamýšlený význam). Dále při načítání dat jsou data vrácena se svým původním datovým typem. Více informací o dostupných typech podobnosti sloupců a používání datových typů v příkazech SQL naleznete v části „Podpora datového typu” v příloze „SQL podpora v lokálních databázích” v Referenční příručce jazyka ActionScript 3.0 a jeho komponent.
Použití synchronních a asynchronních operací databáze Předcházející části popisovaly běžné operace databází, například načítání, vkládání, aktualizace a mazání dat, i vytváření souborů a tabulek databáze a jiných objektů v rámci databáze. Příklady ukázaly, jak tyto operace provést asynchronně i synchronně. Abychom připomněli, v režimu asynchronního spouštění přikazujete modulu databáze provést operaci. Modul databáze poté pracuje na pozadí, zatímco aplikace nadále běží. Po dokončení operace odešle modul databáze událost, která vás na dokončení upozorní. Klíčovou výhodou asynchronního spuštění je to, že runtime provede operace databáze na pozadí, zatímco hlavní kód aplikace se provádí dále. To je zvláště cenné, pokud spuštění operace trvá velice dlouho. Naopak v režimu synchronního spuštění operace neběží na pozadí. Sdělíte modulu databáze, aby provedl operaci. Kód se poté v daném bodu zastaví, zatímco modul databáze pracuje. Po dokončení operace pokračuje provádění s dalším řádkem vašeho kódu. Pomocí jediného připojení databáze nemůžete spustit některé operace nebo příkazy synchronně a jiné asynchronně. To, zda SQLConnection pracuje v synchronním nebo asynchronním režimu, určíte při otevření připojení k databázi. Jestliže voláte SQLConnection.open(), připojení probíhá v synchronním režimu spuštění, a jestliže voláte SQLConnection.openAsync(), dojde k připojení v asynchronním režimu. Jakmile je instance SQLConnection připojena k databázi pomocí open() nebo openAsync(), je pevně nastavena na synchronní nebo asynchronní spuštění.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 185 Práce s lokálními databázemi SQL
Používání synchronních operací databáze Vlastní kód, který používáte k provedení operací i k reakci na ně v synchronním spuštění se v porovnání s kódem pro režim asynchronního spuštění liší jen málo. Klíčové rozdíly mezi těmito dvěma přístupy spadají do dvou oblastí. První je provedení operace, která závisí na jiné operaci (např. řádky výsledků SELECT nebo primární klíč řádku přidaného příkazem INSERT). Druhou oblastí rozdílu je zpracovávání chyb.
Zapisování kódu pro synchronní operace Klíčovým rozdílem mezi synchronním a asynchronním spuštěním je to, že v synchronním režimu zapisujete kód jako jedinou sérii kroků. Oproti tomu v asynchronním kódu registrujete posluchače události a operace často dělíte mezi metody posluchače. Je-li databáze připojena v režimu synchronního spuštění, můžete postupně provést sérii operací databáze v rámci jediného bloku kódu. Tato technika je ukázána v následujícím příkladě: var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); // open the database conn.open(dbFile, OpenMode.UPDATE); // start a transaction conn.begin(); // add the customer record to the database var insertCustomer:SQLStatement = new SQLStatement(); insertCustomer.sqlConnection = conn; insertCustomer.text = "INSERT INTO customers (firstName, lastName) " + "VALUES ('Bob', 'Jones')"; insertCustomer.execute(); var customerId:Number = insertCustomer.getResult().lastInsertRowID; // add a related phone number record for the customer var insertPhoneNumber:SQLStatement = new SQLStatement(); insertPhoneNumber.sqlConnection = conn; insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId, number) " + "VALUES (:customerId, '800-555-1234')"; insertPhoneNumber.parameters[":customerId"] = customerId; insertPhoneNumber.execute(); // commit the transaction conn.commit();
Jak můžete vidět, voláte stejné metody pro provedení operací databáze, ať používáte synchronní nebo asynchronní spouštění. Klíčovými rozdíly mezi těmito dvěma přístupy jsou provedení operace, která závisí na jiné operaci, a zpracovávání chyb.
Spuštění operace, která závisí na jiné operaci. Když používáte režim synchronního spuštění, nepotřebujete zapsat kód poslouchající událost pro určení, zda se operace dokončí. Namísto toho můžete předpokládat, že jestliže se operace v jednom řádku kódu úspěšně dokončí, provádění bude pokračovat na dalším řádku kódu. Proto pro provedení operace, která závisí na úspěchu jiné operace, jednoduše zapište závislý kód ihned po operaci, na které je závislý. Například pro kódování aplikace pro zahájení transakce proveďte příkaz INSERT, načtěte primární klíč vloženého řádku, vložte daný primární klíč do dalšího řádku jiné tabulky a nakonec proveďte transakci. Celý kód lze zapsat jako sérii příkazů. Následující příklad tyto operace ukazuje:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 186 Práce s lokálními databázemi SQL
var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); // open the database conn.open(dbFile, SQLMode.UPDATE); // start a transaction conn.begin(); // add the customer record to the database var insertCustomer:SQLStatement = new SQLStatement(); insertCustomer.sqlConnection = conn; insertCustomer.text = "INSERT INTO customers (firstName, lastName) " + "VALUES ('Bob', 'Jones')"; insertCustomer.execute(); var customerId:Number = insertCustomer.getResult().lastInsertRowID; // add a related phone number record for the customer var insertPhoneNumber:SQLStatement = new SQLStatement(); insertPhoneNumber.sqlConnection = conn; insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId, number) " + "VALUES (:customerId, '800-555-1234')"; insertPhoneNumber.parameters[":customerId"] = customerId; insertPhoneNumber.execute(); // commit the transaction conn.commit();
Zpracovávání chyb v synchronním spuštění V režimu synchronního spuštění neposloucháte událost chyby pro určení, zda byla operace neúspěšná. Namísto toho ohraničíte libovolný kód, který by mohl spustit chyby v sadě bloků kódu try..catch..finally. Kód generující chybu zabalíte do bloku try. Akce, které budou provedeny jako odpověď na každý typ chyby, zapište do samostatných bloků catch. Umístěte libovolný kód, který budete chtít vždy provést bez ohledu na úspěch nebo selhání (například uzavření připojení databáze, které již není třeba) do bloku finally. Následující příklad ukazuje použití bloku try..catch..finally pro zpracovávání chyb. Navazuje na předchozí příklad přidáním kódu pro zpracování chyby:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 187 Práce s lokálními databázemi SQL
var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); // open the database conn.open(dbFile, SQLMode.UPDATE); // start a transaction conn.begin(); try { // add the customer record to the database var insertCustomer:SQLStatement = new SQLStatement(); insertCustomer.sqlConnection = conn; insertCustomer.text = "INSERT INTO customers (firstName, lastName)" + "VALUES ('Bob', 'Jones')"; insertCustomer.execute(); var customerId:Number = insertCustomer.getResult().lastInsertRowID; // add a related phone number record for the customer var insertPhoneNumber:SQLStatement = new SQLStatement(); insertPhoneNumber.sqlConnection = conn; insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId, number)" + "VALUES (:customerId, '800-555-1234')"; insertPhoneNumber.parameters[":customerId"] = customerId; insertPhoneNumber.execute(); // if we've gotten to this point without errors, commit the transaction conn.commit(); } catch (error:SQLError) { // rollback the transaction conn.rollback(); }
Pochopení modelu asynchronního spuštění Jedním běžným aspektem používání režimu asynchronního spuštění je předpoklad, že nemůžete zahájit provádění instance SQLStatement, jestliže je jiná instance SQLStatement aktuálně prováděna oproti stejnému připojení databáze. Tento předpoklad není vlastně správný. Zatímco se instance SQLStatement provádí, nemůžete změnit vlastnost textpříkazu. Nicméně jestliže používáte samostatnou instanci SQLStatement pro každý odlišný příkaz SQL, který si přejete provést, můžete volat metodu execute() SQLStatement, zatímco další instance SQLStatement je stále prováděna bez způsobení chyby. Interně, pokud provádíte operace databáze pomocí režimu asynchronního spuštění, má každé připojení databáze (každá instance SQLConnection ) svou vlastní frontu nebo seznam operací, které mají být provedeny. Runtime provede každou operaci v sekvenci v pořadí, ve kterém jsou přidány do fronty. Když vytvoříte instanci SQLStatement a voláte její metodu execute(), operace spuštění daného příkazu je přidána do fronty pro připojení. Jestliže na dané instanci SQLConnection není aktuálně spuštěna žádná operace, příkaz se začne provádět na pozadí. Předpokládejme,
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 188 Práce s lokálními databázemi SQL
že v rámci stejného bloku kódu vytvoříte další instanci SQLStatement a také voláte metodu execute() dané metody. Operace spuštění druhého příkazu je přidána do fronty za první příkaz. Jakmile je dokončeno spuštění prvního příkazu, posune se runtime na další operaci ve frontě. Ke zpracování následujících operací ve frontě dochází na pozadí, i když je událost result pro první operaci odesílána v hlavním kódu aplikace. Tato technika je ukázána v následujícím kódu: // Using asynchronous execution mode var stmt1:SQLStatement = new SQLStatement(); stmt1.sqlConnection = conn; // ... Set statement text and parameters, and register event listeners ... stmt1.execute(); // At this point stmt1's execute() operation is added to conn's execution queue. var stmt2:SQLStatement = new SQLStatement(); stmt2.sqlConnection = conn; // ... Set statement text and parameters, and register event listeners ... stmt2.execute(); // At this point stmt2's execute() operation is added to conn's execution queue. // When stmt1 finishes executing, stmt2 will immediately begin executing // in the background.
Automatické spuštění následných příkazů umístěných do fronty databází má důležitý vedlejší vliv. Jestliže příkaz závisí na výsledku jiné operace, nemůžete daný příkaz přidat do fronty (jinak řečeno, nemůžete volat jeho metodu execute()) dokud není dokončena první operace. Důvodem je to, že pokud jste volali metodu execute() druhého příkazu, nemůžete změnit vlastnosti příkazu text nebo parameters. V tomto případě musíte před zahájením další operace počkat na událost, která určuje dokončení první operace. Pokud si například přejete provést příkaz v kontextu transakce, závisí provedení příkazu na operaci otevření transakce. Po volání metody SQLConnection.begin() pro otevření transakce musíte počkat, až instance SQLConnection odešle svou hodnotu begin. Pouze poté můžete volat metodu instance SQLStatement execute(). V tomto příkladě je nejjednodušším způsobem organizování aplikace pro zajištění řádného provedení aplikace vytvoření metody, která je zaregistrována jako posluchač pro událostbegin. Kód pro volání metody SQLStatement.execute() je umístěn uvnitř metody posluchače.
Použití šifrování s databázemi SQL Všechny aplikace Adobe AIR sdílejí stejný modul lokální databáze. Díky tomu se může jakákoli aplikace AIR připojit, načítat a zapisovat do nešifrovaného souboru databáze. Počínaje verzí Adobe AIR 1.5 obsahuje prostředí AIR možnost vytvořit a připojit se k šifrovaným souborům databáze. Když používáte šifrovanou databázi a aplikace se chce připojit k databázi, musíte zadat správný šifrovací klíč. Pokud zadáte nesprávný (nebo žádný) šifrovací klíč, nedokáže se aplikace připojit k databázi. Následně nemůže aplikace data databáze načítat, zapisovat nebo měnit. Chcete-li používat šifrovanou databázi, musíte databázi vytvořit jako šifrovanou databázi. Pokud už šifrovaná databáze existuje, můžete otevřít připojení k databázi. Také můžete změnit šifrovací klíč šifrované databáze. Nechámeli stranou vytváření a připojování se k šifrovaným databázím, jsou pracovní postupy se šifrovanými databázemi stejné jako práce s nešifrovanými databázemi. Zejména spouštění příkazů SQL je stejné, ať už je databáze šifrovaná nebo není.
Možnosti použití šifrované databáze Šifrování je vhodné použít, kdykoli chcete omezit přístup k informacím uloženým v databázi. Funkci šifrování databází lze v prostředí Adobe AIR používat k několika účelům. Následuje několik ukázkových případů, ve kterých by bylo vhodné šifrovanou databázi použít:
• Vyrovnávací paměť soukromých dat aplikace stahovaných ze serveru
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 189 Práce s lokálními databázemi SQL
• Lokální úložiště aplikace pro soukromá data, které je synchronizováno se serverem (data jsou odesílána a načítána ze serveru).
• Šifrované soubory používané jako formát souborů pro dokumenty vytvářené a upravované aplikací. Tyto soubory mohou být soukromé a určeny pro jednoho uživatele nebo mohou být navrženy tak, aby byly sdíleny mezi všemi uživateli aplikace.
• Jakákoli jiná použití lokálního úložiště dat, jako jsou použití popsaná v části „Použití lokálních databází SQL“ na stránce 161, při kterých je třeba zachovat soukromí dat před uživateli, kteří mají přístup k počítači nebo k souborům databáze. Pokud si uvědomíte, proč chcete šifrovanou databázi použít, můžete se lépe rozhodnout, jakým způsobem vytvoříte architekturu své aplikace. Zejména se to týká způsobu, jakým aplikace vytváří, získává nebo ukládá šifrovací klíč pro databázi. Další informace týkající se tohoto posouzení viz část „Posouzení použití šifrování s databází“ na stránce 193. Alternativu k uchovávání soukromí důvěrných dat v šifrované databázi představuje šifrované lokální úložiště. U šifrovaného lokálního úložiště můžete jednotlivou hodnotu ByteArray ukládat pomocí klíče String. Přístup k tomuto klíči má pouze aplikace AIR, která tuto hodnotu uložila, a pouze v počítači, ve kterém je uložen. U šifrovaného lokálního úložiště není potřeba vytvářet vlastní šifrovací klíč. Z těchto důvodů je šifrované lokální úložiště vhodnější pro jednoduché uložení jednotlivé hodnoty nebo sady hodnot, které lze snadno zakódovat do hodnoty ByteArray. Šifrovaná databáze je nejvhodnější pro rozsáhlejší sady dat, které vyžadují strukturované ukládání dat a dotazování. Více informací o používání šifrovaného lokálního úložiště naleznete v části „Ukládání šifrovaných dat“ na stránce 208.
Vytvoření šifrované databáze Pokud chcete použít šifrovanou databázi, musí být soubor databáze při jejím vytváření šifrován. Jakmile je databáze jednou vytvořena nešifrovaná, nelze ji zašifrovat později. Obdobně platí, že šifrovanou databázi nelze později odšifrovat. V případě potřeby můžete u šifrované databáze změnit šifrovací klíč. Podrobnosti viz část „Změna šifrovacího klíče databáze“ na stránce 192. Pokud máte stávající databázi, která není šifrována, a chcete použít šifrování databáze, můžete vytvořit novou šifrovanou databázi a zkopírovat stávající tabulkovou strukturu a data do nové databáze. Vytvoření šifrované databáze se téměř neliší od vytvoření nešifrované databáze. To je popsáno v části „Vytváření databáze“ na stránce 165. Nejdříve vytvoříte instanci SQLConnection, která představuje připojení k databázi. Databázi vytvoříte voláním metody objektu SQLConnection open() nebo openAsync(); tyto metody pro umístění databáze určí soubor, který zatím neexistuje. Jediný rozdíl je v tom, že při vytvoření šifrované databáze zadáte hodnotu pro parametr encryptionKey (pátý parametr metody open() a šestý parametr metody openAsync()). Platnou hodnotu parametru encryptionKey představuje objekt ByteArray obsahující přesně 16 bytů. Následující příklad ukazuje vytvoření šifrované databáze, která je otevírána v asynchronním režimu spuštění. V tomto příkladě je šifrovací klíč pro zjednodušení pevně zakódován do kódu aplikace. Tento postup ale důrazně nedoporučujeme, protože není zabezpečený.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 190 Práce s lokálními databázemi SQL
var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent.OPEN, openHandler); conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); var encryptionKey:ByteArray = new ByteArray(); encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! conn.openAsync(dbFile, SQLMode.CREATE, null, false, 1024, encryptionKey); function openHandler(event:SQLEvent):void { trace("the database was created successfully"); } function errorHandler(event:SQLErrorEvent):void { trace("Error message:", event.error.message); trace("Details:", event.error.details); }
Následující příklad ukazuje vytvoření šifrované databáze, která je otevírána v synchronním režimu spuštění. V tomto příkladě je šifrovací klíč pro zjednodušení pevně zakódován do kódu aplikace. Tento postup ale důrazně nedoporučujeme, protože není zabezpečený. import flash.data.SQLConnection; import flash.data.SQLMode; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); var encryptionKey:ByteArray = new ByteArray(); encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! try { conn.open(dbFile, SQLMode.CREATE, false, 1024, encryptionKey); trace("the database was created successfully"); } catch (error:SQLError) { trace("Error message:", error.message); trace("Details:", error.details); }
Ukázkový příklad doporučeného způsobu vygenerování šifrovacího klíče viz část „Příklad: Vygenerování a používání šifrovacího klíče“ na stránce 194.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 191 Práce s lokálními databázemi SQL
Připojení k šifrované databázi Stejně jako u vytvoření šifrované databáze i zde platí, že postup pro otevření připojení k šifrované databázi se podobá připojení k nešifrované databázi. Tento postup je podrobněji popsán v části „Připojení k databázi“ na stránce 167. Pomocí metody open() otevřete připojení v synchronním režimu spuštění, metodou openAsync() otevřete připojení v asynchronním režimu spuštění. Jediný rozdíl je v tom, že k otevření šifrované databáze určujete správnou hodnotu pro parametr encryptionKey (pátý parametr metody open() a šestý parametr metody openAsync()). Pokud poskytnutý šifrovací klíč není správný, dojde k chybě. U metody open() dojde k vyvolání výjimky SQLError. U metody openAsync() odešle objekt SQLConnection událost SQLErrorEvent, ve které objekt SQLError obsahuje vlastnost error. V obou případech je hodnota vlastnosti errorID objektu SQLError vygenerovaného touto výjimkou 3138. Tento identifikátor chyby odpovídá chybové zprávě „File opened is not a database file“ (Otevřený soubor není souborem databáze). Následující příklad ukazuje otevření šifrované databáze v asynchronním režimu spuštění. V tomto příkladě je šifrovací klíč pro zjednodušení pevně zakódován do kódu aplikace. Tento postup ale důrazně nedoporučujeme, protože není zabezpečený. import import import import import
var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent.OPEN, openHandler); conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); var encryptionKey:ByteArray = new ByteArray(); encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! conn.openAsync(dbFile, SQLMode.UPDATE, null, false, 1024, encryptionKey); function openHandler(event:SQLEvent):void { trace("the database opened successfully"); } function errorHandler(event:SQLErrorEvent):void { if (event.error.errorID == 3138) { trace("Incorrect encryption key"); } else { trace("Error message:", event.error.message); trace("Details:", event.error.details); } }
Následující příklad ukazuje otevření šifrované databáze v synchronním režimu spuštění. V tomto příkladě je šifrovací klíč pro zjednodušení pevně zakódován do kódu aplikace. Tento postup ale důrazně nedoporučujeme, protože není zabezpečený.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 192 Práce s lokálními databázemi SQL
import flash.data.SQLConnection; import flash.data.SQLMode; import flash.filesystem.File; var conn:SQLConnection = new SQLConnection(); var dbFile:File = File.applicationStorageDirectory.resolvePath("DBSample.db"); var encryptionKey:ByteArray = new ByteArray(); encryptionKey.writeUTFBytes("Some16ByteString"); // This technique is not secure! try { conn.open(dbFile, SQLMode.UPDATE, false, 1024, encryptionKey); trace("the database was created successfully"); } catch (error:SQLError) { if (error.errorID == 3138) { trace("Incorrect encryption key"); } else { trace("Error message:", error.message); trace("Details:", error.details); } }
Ukázkový příklad doporučeného způsobu vygenerování šifrovacího klíče viz část „Příklad: Vygenerování a používání šifrovacího klíče“ na stránce 194.
Změna šifrovacího klíče databáze Když je databáze šifrována, můžete šifrovací klíč databáze změnit později. Chcete-li změnit šifrovací klíč databáze, otevřete nejdříve připojení k databázi – vytvořte instanci SQLConnection a volejte metodu open() nebo openAsync(). Po připojení databáze volejte metodu reencrypt(). Jako argument předejte nový šifrovací klíč. Chování metody reencrypt() závisí, stejně jako většina operací databáze, na tom, zda připojení používá synchronní nebo asynchronní režim spuštění. Pokud se k databázi připojíte pomocí metody open(), je operace reencrypt() spuštěna synchronně. Po dokončení operace pokračuje provádění s dalším řádkem kódu: var newKey:ByteArray = new ByteArray(); // ... generate the new key and store it in newKey conn.reencrypt(newKey);
Pokud se k databázi naopak připojíte pomocí metody openAsync(), je operace reencrypt() asynchronní. Volání metody reencrypt() spouští proces opakovaného šifrování. Po dokončení operace odešle objekt SQLConnection událost reencrypt. K určení, kdy skončí opakované šifrování, použijte posluchače událostí:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 193 Práce s lokálními databázemi SQL
var newKey:ByteArray = new ByteArray(); // ... generate the new key and store it in newKey conn.addEventListener(SQLEvent.REENCRYPT, reencryptHandler); conn.reencrypt(newKey); function reencryptHandler(event:SQLEvent):void { // save the fact that the key changed }
Operace reencrypt() je spuštěna ve své vlastní transakci. Pokud je operace přerušena nebo se nezdaří (pokud je například aplikace ukončena před dokončením operace), je transakce vrácena zpět. V takovém případě zůstává šifrovacím klíčem pro databázi stále původní šifrovací klíč. Pomocí metody reencrypt() nelze z databáze odebrat šifrování. Pokud metodě reencrypt() předáte hodnotu null nebo jiný šifrovací klíč než 16bytový objekt ByteArray, vyvoláte chybu.
Posouzení použití šifrování s databází Část „Možnosti použití šifrované databáze“ na stránce 188 uvedla několik případů, ve kterých by bylo vhodné použít šifrovanou databázi. Je zřejmé, že scénáře použití různých aplikací (včetně výše uvedených i dalších scénářů) mají různé požadavky na soukromí. Pro řízení míry soukromí dat databáze hraje důležitou roli způsob, kterým navrhnete architekturu použití šifrování v aplikaci. Pokud například používáte šifrovanou databázi k uchování soukromí osobních dat, a to dokonce i před ostatními uživateli stejného počítače, pak musí mít databáze každého uživatele vlastní šifrovací klíč. Nejvyšší míry zabezpečení dosáhnete, když necháte aplikaci klíč vygenerovat z hesla zadaného uživatelem. Šifrovací klíč založený na heslu zajišťuje, že i když se jiné osobě podaří v rámci uživatelského účtu vystupovat jako oprávněná osoba, stále nelze k datům přistupovat. Na druhém konci spektra požadavků na soukromí je případ, kdy chcete, aby soubor databáze mohl číst kterýkoli uživatel aplikace, ale ne jiné aplikace. V takové případě musí mít každá nainstalovaná kopie aplikace přístup ke sdílenému šifrovacímu klíči. Aplikaci (a zejména metodu, která slouží ke generování šifrovacího klíče) můžete navrhnout v závislosti na úrovni soukromí, kterou pro data aplikace požadujete. Následující seznam poskytuje návrhy na různé úrovně soukromí dat:
• Pokud chcete, aby byla databáze přístupná v kterémkoli počítači pro kteréhokoli uživatele, který má k aplikaci přístup, použijte jediný klíč, dostupný pro všechny instance aplikace. Aplikace může sdílený šifrovací klíč například stáhnout ze serveru pomocí zabezpečeného protokolu, jako je protokol SSL, při prvním spuštění. Pak může klíč uložit do šifrovaného lokálního úložiště pro budoucí použití. Další možností je zašifrovat data v počítači pro jednotlivé uživatele a vytvořit přenositelná data jejich synchronizací se vzdáleným datovým úložištěm (například se serverem).
• Pokud chcete, aby byla databáze přístupná jedinému uživateli v kterémkoli počítači, vygenerujte šifrovací klíč z tajné informace uživatele (například z hesla). K vygenerování tohoto klíče hlavně nepoužívejte kteroukoli hodnotu, která je svázána s konkrétním počítačem (k těmto hodnotám patří například hodnoty uložené v šifrovaném lokálním úložišti). Další možností je zašifrovat data v počítači pro jednotlivé uživatele a vytvořit přenositelná data jejich synchronizací se vzdáleným datovým úložištěm (například se serverem).
• Pokud chcete, aby byla databáze přístupná jedinému uživateli v jediném počítači, vygenerujte klíč z hesla a vygenerované hodnoty Salt. Příklad této metody naleznete v části „Příklad: Vygenerování a používání šifrovacího klíče“ na stránce 194.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 194 Práce s lokálními databázemi SQL
Následují dodatečná doporučení pro zabezpečení, na která byste měli při návrhu aplikace používající šifrovanou databázi myslet:
• Systém je zabezpečený pouze tak, jak je zabezpečený jeho nejslabší článek. Pokud k vygenerování šifrovacího klíče používáte heslo zadávané uživatelem, je vhodné pro hesla zavést omezení, například minimální délku a složitost. Krátké heslo se základními znaky lze rychle uhodnout.
• Zdrojový kód aplikace AIR je v počítači uživatele uložen ve formátu prostého textu (pro obsah HTML) nebo ve snadno dekompilovatelném binárním formátu (pro obsah SWF). Protože je tento zdrojový kód přístupný, je si třeba zapamatovat dvě věci:
• Nikdy do zdrojového kódu pevně nekódujte šifrovací klíč. • Vždy předpokládejte, že metodu použitou k vygenerování šifrovacího klíče (jako je generátor náhodných znaků nebo konkrétní algoritmus hash) může útočník snadno rozluštit.
• Šifrování databáze AIR používá pokročilý standard šifrování AES (Advanced Encryption Standard) s čítačem s režimem CBC-MAC (CCM). Aby byla šifra tohoto šifrování zabezpečená, vyžaduje kombinaci klíče zadaného uživatelem a hodnoty Salt. Příklad této metody naleznete v části „Příklad: Vygenerování a používání šifrovacího klíče“ na stránce 194.
• Když se rozhodnete databázi šifrovat, jsou šifrovány všechny soubory na disku, které modul databáze používá ve spojení s touto databází. Modul databáze nicméně některá data dočasně udržuje ve vyrovnávací paměti, aby vylepšil výkon doby načtení a zápisu v transakcích. Jakákoli data v paměti jsou nešifrovaná. Pokud útočník dokáže získat přístup do paměti, kterou aplikace AIR používá (například pomocí ladícího programu), bude mít k dispozici data v databázi, která jsou aktuálně otevřena a nešifrována.
Příklad: Vygenerování a používání šifrovacího klíče Tato ukázková aplikace předvádí jednu metodu vygenerování šifrovacího klíče. Tato aplikace je navržena tak, aby pro data uživatelů poskytovala nejvyšší úroveň soukromí a zabezpečení. Jedním důležitým aspektem zabezpečení soukromých dat je, abyste při každém připojení aplikace k databázi na uživateli vyžadovali zadání hesla. Tento příklad ukazuje, že by v důsledku toho aplikace, která vyžaduje tuto úroveň soukromí, nikdy neměla přímo ukládat šifrovací klíč databáze. Aplikace se skládá ze dvou částí. Ze třídy jazyka ActionScript, která vygeneruje šifrovací klíč (třídy EncryptionKeyGenerator), a základního uživatelského rozhraní, které demonstruje způsob použití této třídy. Kompletní zdrojový kód viz část „Kompletní ukázkový kód k vygenerování a používání šifrovacího klíče“ na stránce 202.
Použití třídy EncryptionKeyGenerator k získání zabezpečeného šifrovacího klíče Část „Vysvětlení třídy EncryptionKeyGenerator“ na stránce 196 obsahuje podrobnosti metod, které třída EncryptionKeyGenerator používá k vygenerování šifrovacího klíče pro databázi. Abyste ale mohli třídu EncryptionKeyGenerator používat v aplikaci, nemusíte těmto podrobnostem rozumět. Chcete-li v aplikaci používat třídu EncryptionKeyGenerator, postupujte podle těchto kroků: 1 Třída EncryptionKeyGenerator je zahrnuta do projektu základní knihovny s otevřeným zdrojovým kódem jazyka
ActionScript 3.0 as3corelib. Balíček as3corelib můžete stáhnout včetně zdrojového kódu a dokumentace. Ze stránky projektu lze také stáhnout soubory SWC nebo soubory zdrojového kódu. 2 Umístěte zdrojový kód pro třídu EncryptionKeyGenerator (nebo soubor SWC knihovny as3corelib) do umístění,
kde ho dokáže nalézt zdrojový kód aplikace. 3 Přidejte do zdrojového kódu aplikace příkaz import pro třídu EncryptionKeyGenerator. import com.adobe.air.crypto.EncryptionKeyGenerator;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 195 Práce s lokálními databázemi SQL
4 Dříve, než kód vytvoří databázi nebo k ním otevře připojení, vytvořte přidáním kódu volání konstruktoru EncryptionKeyGenerator() instanci EncryptionKeyGenerator. var keyGenerator:EncryptionKeyGenerator = new EncryptionKeyGenerator();
5 Získejte od uživatele heslo: var password:String = passwordInput.text; if (!keyGenerator.validateStrongPassword(password)) { // display an error message return; }
Instance EncryptionKeyGenerator toto heslo používá jako základ šifrovacího klíče (viz následující krok). Instance EncryptionKeyGenerator toto heslo testuje pomocí specifických požadavků na ověřování silných hesel. Pokud se ověřování nezdaří, dojde k chybě. Jak vidíte v ukázkovém kódu, lze heslo zkontrolovat voláním metody validateStrongPassword() objektu EncryptionKeyGenerator i dříve. Tímto způsobem lze určit, zda heslo splňuje minimální požadavky na silná hesla, a vyhnout se tak chybě. 6 Vygenerujte z hesla šifrovací klíč: var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(password);
Šifrovací klíč (16bytový objekt ByteArray) vygeneruje a vrací metoda getEncryptionKey(). Šifrovací klíč lze poté použít k otevření nové nebo existující šifrované databáze. Metoda getEncryptionKey() má jediný požadovaný parametr. Tímto parametrem je heslo, které jste získali v pátém kroku. Poznámka: Chcete-li pro data zajistit nejvyšší úroveň zabezpečení a soukromí, musí aplikace od uživatele vyžadovat, aby zadal heslo při každém připojení aplikace k databázi. Uživatelská hesla nebo šifrovací klíč databáze neukládejte přímo. Pokud to uděláte, vystavujete se ohrožením zabezpečení. Namísto toho (jak demonstroval tento příklad) by měla aplikace tuto metodu k odvození šifrovacího klíče z hesla použít jak při vytváření šifrované databáze, tak i když se k ní později připojuje. Metoda getEncryptionKey() také přijímá druhý (volitelný) parametr – overrideSaltELSKey. Třída EncryptionKeyGenerator vytváří náhodnou hodnotu (označovanou jako hodnotu Salt), která slouží jako součást šifrovacího klíče. Abyste mohli šifrovací klíč znovu vytvořit, ukládá se hodnota Salt do šifrovaného místního úložiště ELS (Encrypted Local Store) aplikace AIR. Ve výchozím nastavení používá třída EncryptionKeyGenerator jako klíč šifrovaného místního úložiště (klíč ELS) konkrétní řetězec. I když je to nepravděpodobné, může být tento klíč v konfliktu s jiným klíčem používaným aplikací. Můžete chtít namísto výchozího klíče určit vlastní klíč ELS. V takovém případě určete vlastní klíč tím, že ho předáte jako druhý parametr metody getEncryptionKey() (viz níže): var customKey:String = "My custom ELS salt key"; var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(password, customKey);
7 Vytvoření nebo otevření databáze
Jestliže metoda getEncryptionKey() vrátila šifrovací klíč, může kód vytvořit novou šifrovanou databázi nebo zkusit otevřít existující šifrovanou databázi. V obou případech je třeba použít metody open() nebo openAsync() třídy SQLConnection. Tyto metody jsou popsány v částech „Vytvoření šifrované databáze“ na stránce 189 a „Připojení k šifrované databázi“ na stránce 191. V tomto příkladě je aplikace navržena tak, aby databázi otevírala v asynchronním režimu spuštění. Tento kód nastavuje příslušné posluchače událostí a volá metodu openAsync(), pro kterou předává šifrovací klíč jako poslední argument:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 196 Práce s lokálními databázemi SQL
V metodách posluchače tento kód odstraňuje registrace posluchače událostí. Potom zobrazí stavovou zprávu informující o tom, zda byla databáze vytvořena nebo otevřena nebo zda došlo k chybě. Všimněte si zejména jedné součásti těchto posluchačů událostí v metodě openError(). V této metodě kontroluje příkaz if, zda databáze existuje (to znamená, že se kód zkusí připojit ke stávající databázi) a zda ID chyby odpovídá konstantě EncryptionKeyGenerator.ENCRYPTED_DB_PASSWORD_ERROR_ID. Pokud jsou splněné obě tyto podmínky (pokud mají hodnotu true), pravděpodobně to znamená, že uživatelem zadané heslo je nesprávné. (Také by to mohlo znamenat, že určený soubor vůbec není souborem databáze.) Následuje kód, který kontroluje ID chyby: if (!createNewDB && event.error.errorID == EncryptionKeyGenerator.ENCRYPTED_DB_PASSWORD_ERROR_ID) { statusMsg.text = "Incorrect password!"; } else { statusMsg.text = "Error creating or opening database."; }
Kompletní kód pro posluchače událostí příkladu naleznete v části „Kompletní ukázkový kód k vygenerování a používání šifrovacího klíče“ na stránce 202.
Vysvětlení třídy EncryptionKeyGenerator Chcete-li třídu EncryptionKeyGenerator používat k vytvoření zabezpečeného šifrovacího klíče pro databáze aplikace, nemusíte nutně rozumět jejímu vnitřnímu fungování. Proces použití třídy je vysvětlován v části „Použití třídy EncryptionKeyGenerator k získání zabezpečeného šifrovacího klíče“ na stránce 194. Pokud ale porozumíte metodám, které třída používá, může to být pro vás užitečné. Můžete tuto třídu například přizpůsobit nebo začlenit některé její metody do situací, kde je vyžadována jiná úroveň soukromí dat. Třída EncryptionKeyGenerator je zahrnuta do projektu základní knihovny s otevřeným zdrojovým kódem jazyka ActionScript 3.0 as3corelib. Balíček as3corelib můžete stáhnout včetně zdrojového kódu a dokumentace. Na stránce projektu můžete také zobrazit zdrojový kód nebo tento kód stáhnout a sledovat tak výklady. Když kód vytvoří instanci EncryptionKeyGenerator a volá její metodu getEncryptionKey(), provede se několik kroků, které zajišťují, že může k datům přistupovat pouze oprávněný uživatel. Tento proces je stejný pro vygenerování klíče z hesla zadaného uživatelem před vytvořením databáze i pro opětovné vytvoření šifrovacího klíče k otevření databáze. Získání a ověření silného hesla Když kód volá metodu getEncryptionKey(), předává heslo jako parametr. Heslo slouží jako základ pro šifrovací klíč. Protože toto uspořádání používá informaci, kterou zná pouze uživatel, zajišťuje, že může k datům v databázi přistupovat pouze uživatel, který zná heslo. Dokonce i když útočník získá v počítači přístup k uživatelskému účtu, nemůže se bez znalosti hesla dostat do databáze. Maximálního zabezpečení dosahuje aplikace tím, že heslo nikdy neukládá. V ukázkové aplikaci představuje výraz passwordInput název instance komponenty TextInput, do které uživatel zadává heslo. Než aby aplikace zpracovávala hodnotu text komponenty přímo, zkopíruje heslo do proměnné s názvem password. var password:String = passwordInput.text;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 197 Práce s lokálními databázemi SQL
Ukázková aplikace potom vytvoří instanci EncryptionKeyGenerator a volá její metodu getEncryptionKey() (jako argument použije hodnotu proměnné password): var keyGenerator:EncryptionKeyGenerator = new EncryptionKeyGenerator(); var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(password);
Prvním krokem, který třída EncryptionKeyGenerator podnikne při volání metody getEncryptionKey(), je kontrola, zda heslo zadané uživatelem splňuje požadavky na sílu hesla. V tomto případě musí být délka hesla v rozmezí 8–32 znaků. Musí obsahovat velká i malá písmena a minimálně jedno číslo nebo znak symbolu. Regulární výraz kontrolující tento vzorek je definován jako konstanta s názvem STRONG_PASSWORD_PATTERN: private static const STRONG_PASSWORD_PATTERN:RegExp = /(?=^.{8,32}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/;
Kód kontrolující heslo je v metodě validateStrongPassword() třídy EncryptionKeyGenerator. Tento kód vypadá takto: public function vaidateStrongPassword(password:String):Boolean { if (password == null || password.length <= 0) { return false; } return STRONG_PASSWORD_PATTERN.test(password)) }
Metoda getEncryptionKey() volá metodu validateStrongPassword() a pokud je heslo neplatné, vyvolá výjimku. Metoda validateStrongPassword() je veřejná, aby mohl kód heslo kontrolovat a přitom nemusel volat metodu getEncryptionKey(). Tímto způsobem se lze vyhnout způsobení chyby. Rozšíření hesla na 256 bitů V procesu je později vyžadováno, aby heslo mělo 256bitovou délku. Než aby kód vyžadoval od každého uživatele zadání hesla, které má přesně délku 256 bitů (32 znaků), vytvoří delší heslo tím, že zopakuje znaky hesla. Za úkolem vytvoření delšího hesla volá metoda getEncryptionKey() metodu concatenatePassword(). var concatenatedPassword:String = concatenatePassword(password);
Následuje kód pro metodu concatenatePassword():
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 198 Práce s lokálními databázemi SQL
private function concatenatePassword(pwd:String):String { var len:int = pwd.length; var targetLength:int = 32; if (len == targetLength) { return pwd; } var repetitions:int = Math.floor(targetLength / len); var excess:int = targetLength % len; var result:String = ""; for (var i:uint = 0; i < repetitions; i++) { result += pwd; } result += pwd.substr(0, excess); return result; }
Pokud má heslo méně než 256 bitů, zřetězí kód heslo samo se sebou, aby ho převedl na 256bitovou délku. Pokud není dosaženo přesné délky, získá kód přesně 256 bitů zkrácením posledního opakování. Vygenerování nebo získání 256bitové hodnoty Salt Dalším krokem je získat 256bitovou hodnotu Salt, která bude později zkombinována s heslem. Salt je náhodná hodnota, která je přidána nebo zkombinována s hodnotou zadanou uživatelem za účelem vytvoření hesla. Pokud s heslem používáte i hodnotu Salt, zajišťujete, že dokonce i když uživatel za heslo vybere reálné slovo nebo běžný výraz, má kombinace hesla a hodnoty Salt použitá systémem náhodnou hodnotu. Náhodná hodnota pomáhá chránit před slovníkovým útokem, při kterém se útočník pokusí heslo uhodnout pomocí seznamu slov. Navíc platí, že pokud vygenerujete hodnotu Salt a uložíte ji do šifrovaného místního úložiště, je svázána s uživatelským účtem v počítači, ve kterém je umístěn soubor databáze. Pokud aplikace volá metodu getEncryptionKey() poprvé, vytvoří kód náhodnou 256bitovou hodnotu Salt. V opačném případě kód hodnotu Salt načte ze šifrovaného místního úložiště. Hodnota Salt je uložena do proměnné s názvem salt. Kód určuje, zda již hodnotu Salt vytvořil, pomocí pokusu o načtení hodnoty Salt ze šifrovaného místního úložiště: var salt:ByteArray = EncryptedLocalStore.getItem(saltKey); if (salt == null) { salt = makeSalt(); EncryptedLocalStore.setItem(saltKey, salt); }
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 199 Práce s lokálními databázemi SQL
Pokud kód vytváří novou hodnotu Salt, vygeneruje metoda makeSalt() náhodnou 256bitovou hodnotu. Protože je tato hodnota nakonec uložena do šifrovaného místního úložiště, je vygenerována jako objekt ByteArray. Metoda makeSalt() používá k náhodnému vygenerování této hodnoty metodu Math.random(). Metoda Math.random() nedokáže 256 bitů vygenerovat najednou. Kód namísto toho používá smyčku, která metodu Math.random() volá osmkrát. Pokaždé se vygeneruje náhodná hodnota uint v rozmezí 0 až 4294967295 (maximální hodnota uint). Použití hodnot uint je výhodné, protože uint používá přesně 32 bitů. Zápisem osmi hodnot uint do objektu ByteArray se vygeneruje 256bitová hodnota. Následuje kód pro metodu makeSalt(): private function makeSalt():ByteArray { var result:ByteArray = new ByteArray; for (var i:uint = 0; i < 8; i++) { result.writeUnsignedInt(Math.round(Math.random() * uint.MAX_VALUE)); } return result; }
Když kód hodnotu Salt ukládá do místního šifrovaného úložiště nebo ji z úložiště získává, potřebuje klíč String, pod kterým je hodnota Salt uložena. Bez znalosti tohoto klíče nelze hodnotu Salt získat. V takovém případě nelze při každém opakovaném otevření databáze znovu vytvářet šifrovací klíč. Ve výchozím nastavení používá třída EncryptionKeyGenerator předem definovaný klíč šifrovaného místního úložiště definovaný v konstantě SALT_ELS_KEY. Kód aplikace nemusí použít výchozí klíč, ale může také určit klíč šifrovaného místního úložiště, který slouží k volání metody getEncryptionKey(). Klíč šifrovaného místního úložiště je pro výchozí hodnotu Salt i pro hodnotu Salt definovanou aplikací uložen v proměnné s názvem saltKey. Jak vidíte v následujícím výčtu kódu, slouží tato proměnná k volání metod EncryptedLocalStore.setItem() a EncryptedLocalStore.getItem(). Zkombinování 256bitového hesla a hodnoty Salt pomocí operátoru XOR Kód nyní obsahuje 256bitové heslo a 256bitovou hodnotu Salt. Dále postupuje tak, že pomocí bitového operátoru XOR zkombinuje hodnotu Salt a zřetězené heslo do jediné hodnoty. To v podstatě znamená, že tato metoda vytváří 256bitové heslo, které se skládá ze znaků z kompletní řady možných znaků. V principu to tak sice je, skutečné heslo se ale bude nejpravděpodobněji skládat především z alfanumerických znaků. Přínos této zvýšené nahodilosti je v tom, že vytváří rozsáhlou sadu možných hesel, uživatel přitom nemusí zadávat dlouhá a komplexní hesla. Výsledek operace XOR se ukládá do proměnné unhashedKey. Skutečný proces provedení bitového operátoru XOR na těchto dvou hodnotách se uskutečňuje v metodě xorBytes(): var unhashedKey:ByteArray = xorBytes(concatenatedPassword, salt);
Bitový operátor XOR (^) přebírá dvě hodnoty uint a jednu hodnotu uint vrací. (Hodnota uint obsahuje 32 bitů.) Vstupní hodnoty předané jako argumenty metodě xorBytes() jsou objekty String (heslo) a ByteArray (hodnota Salt). Kód následně používá smyčku k extrahování 32 bitů z každého vstupu najednou a ty zkombinuje pomocí operátoru XOR.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 200 Práce s lokálními databázemi SQL
private function xorBytes(passwordString:String, salt:ByteArray):ByteArray { var result:ByteArray = new ByteArray(); for (var i:uint = 0; i < 32; i += 4) { // ... } return result; }
V rámci této smyčky je z parametru passwordString extrahováno prvních 32 bitů (4 bajty). Tyto bity jsou extrahovány a převedeny do formátu uint (o1) v procesu, který se skládá ze dvou částí. Nejdříve získá metoda charCodeAt() číselnou hodnotu jednotlivých znaků. V dalším kroku je hodnotu posunuta do příslušné pozice v uint pomocí bitového operátoru posunutí vlevo (<<) a posunutá hodnota je přidána do o1. Z prvního znaku (i) se například pomocí bitového operátoru posunutí vlevo (<<), který posune zbývající bity o 24 bitů a tuto hodnotu přiřadí do o1, stane prvních 8 bitů. Z druhého znaku (i+1) se posunem jeho hodnoty vlevo o 16 bitů a přidáním výsledku do o1 stane druhých 8 bitů. Stejným způsobem jsou přidány i hodnoty třetího a čtvrtého znaku. // ... // Extract 4 bytes from the password string and convert to a uint var o1:uint = passwordString.charCodeAt(i) << 24; o1 += passwordString.charCodeAt(i + 1) << 16; o1 += passwordString.charCodeAt(i + 2) << 8; o1 += passwordString.charCodeAt(i + 3); // ...
Proměnná o1 nyní obsahuje 32 bitů z parametru passwordString. V dalším kroku je z parametru salt extrahováno 32 bitů voláním metody readUnsignedInt(). Těchto 32 bitů je uloženo v proměnné uint o2. // ... salt.position = i; var o2:uint = salt.readUnsignedInt(); // ...
V posledním kroku jsou tyto dvě 32bitové (uint) hodnoty zkombinovány pomocí operátoru XOR a výsledek je zapsán do objektu ByteArray s názvem result. // ... var xor:uint = o1 ^ o2; result.writeUnsignedInt(xor); // ...
Po dokončení smyčky je objekt ByteArray obsahující výsledek operace XOR vrácen. // ... } return result; }
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 201 Práce s lokálními databázemi SQL
Použití algoritmu hash na klíč Poté, co bylo zkombinováno zřetězené heslo a hodnota Salt, je dalším krokem další zabezpečení této hodnoty pomocí algoritmu hash SHA-256. Pokud na hodnotu použijete algoritmus hash, je pro útočníka obtížnější zpětně tuto hodnotu získat. V tomto bodě je v kódu objekt ByteArray s názvem unhashedKey, který obsahuje zřetězené heslo zkombinované s hodnotou Salt. Projekt základní knihovny jazyka ActionScript 3.0 (as3corelib) obsahuje v balíčku com.adobe.crypto třídu SHA256. Metoda SHA256.hashBytes() provádí na objektu ByteArray algoritmus hash SHA-256 a vrací objekt String, který obsahuje výsledek 256bitového algoritmu hash ve formě hexadecimálního čísla. Třída EncryptionKeyGenerator používá třídu SHA256 k provedení algoritmu hash na klíči: var hashedKey:String = SHA256.hashBytes(unhashedKey);
Extrahování šifrovacího klíče z algoritmu hash Šifrovacím klíčem musí být objekt ByteArray s délkou přesně 16 bajtů (128 bitů). Výsledek algoritmu hash SHA-256 má vždy délku 256 bitů. Posledním krokem je výběr 128 bitů z výsledku algoritmu hash, které se použijí jako skutečný šifrovací klíč. Ve třídě EncryptionKeyGenerator kód klíč zredukuje na 128 bitů voláním metody generateEncryptionKey(). Pak kód výsledek této metody vrací jako výsledek metody getEncryptionKey(): var encryptionKey:ByteArray = generateEncryptionKey(hashedKey); return encryptionKey;
Není nezbytně nutné, abyste pro šifrovací klíč použili prvních 128 bitů. Můžete vybrat řadu bitů se začátkem v libovolném bodě, každý druhý bit, nebo můžete použít nějaký jiný způsob výběru bitů. Důležité je, že kód vybere 128 rozdílných bitů, a že se pokaždé použije těch samých 128 bitů. V tomto případě používá metoda generateEncryptionKey() jako šifrovací klíč rozsah bitů se začátkem v 18 bajtu. Jak jsme uvedli dříve, třída SHA256 vrací objekt String, který obsahuje 256bitový výsledek hash ve formě hexadecimálního čísla. Jediný blok 128 bitů obsahuje příliš mnoho bajtů na to, aby je bylo možno do objektu ByteArray přidat najednou. V důsledku toho používá kód smyčku for; tato smyčka extrahuje znaky z hexadecimálního objektu String, převádí je na skutečné číselné hodnoty a přidává do objektu ByteArray. Výsledek algoritmu SHA-256 má délku 64 znaků. Rozsah 128 bitů se rovná 32 znakům v objektu String; každý znak představuje 4 bity. Nejmenší přírůstek dat, který můžete přidat do objektu ByteArray, je jeden bajt (8 bitů), což se rovná dvěma znakům v řetězci hash. Smyčka díky tomu počítá od 0 do 31 (32 znaků) po přírůstcích o velikosti dvou znaků. V rámci smyčky kód nejdříve určí počáteční pozici aktuálního páru znaků. Protože požadovaný rozsah začíná u znaku na indexové poloze 17 (u osmnáctého bajtu), je proměnné position přiřazena aktuální iterační hodnota (i) zvýšená o 17. Kód používá k extrahování dvou znaků na aktuální pozici metodu substr() objektu String. Tyto znaky jsou uloženy do proměnné hex. Kód potom použije metodu parseInt() k převodu řetězce hex na desítkovou celočíselnou hodnotu. Tuto hodnotu ukládá v proměnné typu int byte. Nakonec přidá kód hodnotu v proměnné byte k objektu ByteArray result pomocí metody writeByte(). Po dokončení smyčky obsahuje objekt ByteArray result 16 bajtů a lze ho použít jako šifrovací klíč databáze.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 202 Práce s lokálními databázemi SQL
private function generateEncryptionKey(hash:String):ByteArray { var result:ByteArray = new ByteArray(); for (var i:uint = 0; i < 32; i += 2) { var position:uint = i + 17; var hex:String = hash.substr(position, 2); var byte:int = parseInt(hex, 16); result.writeByte(byte); } return result; }
Kompletní ukázkový kód k vygenerování a používání šifrovacího klíče Následuje kompletní kód ukázkové aplikace „Vygenerování a používání šifrovacího klíče“. Kód tvoří dvě části. Tento příklad vytvoří šifrovací kód z hesla pomocí třídy EncryptionKeyGenerator. Třída EncryptionKeyGenerator je zahrnuta do projektu základní knihovny s otevřeným zdrojovým kódem jazyka ActionScript 3.0 as3corelib. Balíček as3corelib můžete stáhnout včetně zdrojového kódu a dokumentace. Ze stránky projektu lze také stáhnout soubory SWC nebo soubory zdrojového kódu. Soubor FLA aplikace obsahuje zdrojový kód pro jednoduchou aplikaci, která vytváří nebo otevírá připojení k šifrované databázi. Soubor FLA má čtyři komponenty, které jsou umístěny ve vymezené ploše: Název instance
Typ komponenty
Popis
instructions
Label
Obsahuje pokyny pro uživatele.
passwordInput
TextInput
Vstupní pole určené k zadání hesla uživatelem.
openButton
Button
Tlačítko, na které uživatel klepne po zadání hesla.
statusMsg
Label
Zobrazuje stavové zprávy (úspěch nebo selhání).
Kód aplikace je definovaný v klíčovém snímku na snímku 1 hlavní časové osy. Následuje kód pro aplikaci: import com.adobe.air.crypto.EncryptionKeyGenerator; const dbFileName:String = "encryptedDatabase.db"; var dbFile:File; var createNewDB:Boolean = true; var conn:SQLConnection; init(); // ------- Event handling ------function init():void { passwordInput.displayAsPassword = true; openButton.addEventListener(MouseEvent.CLICK, openConnection); statusMsg.setStyle("textFormat", new TextFormat(null, null, 0x990000)); conn = new SQLConnection(); dbFile = File.applicationStorageDirectory.resolvePath(dbFileName);
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 203 Práce s lokálními databázemi SQL
if (dbFile.exists) { createNewDB = false; instructions.text = "Enter your database password to open the encrypted database."; openButton.label = "Open Database"; } else { instructions.text = "Enter a password to create an encrypted database. The next time you open the application, you will need to re-enter the password to open the database again."; openButton.label = "Create Database"; } } function openConnection(event:MouseEvent):void { var keyGenerator:EncryptionKeyGenerator = new EncryptionKeyGenerator(); var password:String = passwordInput.text; if (password == null || password.length <= 0) { statusMsg.text = "Please specify a password."; return; } if (!keyGenerator.validateStrongPassword(password)) { statusMsg.text = "The password must be 8-32 characters long. It must contain at least one lowercase letter, at least one uppercase letter, and at least one number or symbol."; return; } passwordInput.text = ""; passwordInput.enabled = false; openButton.enabled = false; var encryptionKey:ByteArray = keyGenerator.getEncryptionKey(password); conn.addEventListener(SQLEvent.OPEN, openHandler); conn.addEventListener(SQLErrorEvent.ERROR, openError); conn.openAsync(dbFile, SQLMode.CREATE, null, false, 1024, encryptionKey); } function openHandler(event:SQLEvent):void { conn.removeEventListener(SQLEvent.OPEN, openHandler); conn.removeEventListener(SQLErrorEvent.ERROR, openError); statusMsg.setStyle("textFormat", new TextFormat(null, null, 0x009900)); if (createNewDB) { statusMsg.text = "The encrypted database was created successfully."; } else
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 204 Práce s lokálními databázemi SQL
{ statusMsg.text = "The encrypted database was opened successfully."; } } function openError(event:SQLErrorEvent):void { conn.removeEventListener(SQLEvent.OPEN, openHandler); conn.removeEventListener(SQLErrorEvent.ERROR, openError); if (!createNewDB && event.error.errorID == EncryptionKeyGenerator.ENCRYPTED_DB_PASSWORD_ERROR_ID) { statusMsg.text = "Incorrect password!"; } else { statusMsg.text = "Error creating or opening database."; } }
Strategie pro práci s databázemi SQL Existují různé způsoby, jak může aplikace získat přístup k lokální databázi SQL a pracovat s ní. Provedení aplikace se může lišit co do způsobu organizování kódu aplikace, sekvence a načasování provedení operací, atd. Vámi vybrané techniky mohou ovlivnit to, jak snadno lze vaši aplikaci vyvinout. Mohou ovlivnit to, jak snadné je upravit aplikaci v budoucích aktualizacích. Mohou také ovlivnit kvalitu výkonu aplikace z perspektivy uživatele.
Distribuce a zaplnění databází předem Jestli ve své aplikaci používáte lokální databázi SQL AIR, očekává aplikace databázi s určitou strukturou tabulek, sloupců, atd. Některé aplikace také očekávají předem vyplnění určitých dat do souboru databáze. Jedním způsobem pro zajištění správné struktury databáze je vytvoření databáze v kódu aplikace. Když se aplikace načte, zkontroluje existenci svého souboru databáze v určitém umístění. Jestliže soubor neexistuje, aplikace provede sadu příkazů pro vytvoření souboru databáze, vytvoření struktury databáze a vyplnění tabulek počátečními daty. Kód, který vytváří databázi a její tabulky, je často složitý. Často je použit pouze jednou v instalovaném životním cyklu aplikace, ale přesto zvětšuje velikost a složitost aplikace. Jako alternativu k programatickému vytvoření databáze, struktury a dat můžete distribuovat předem vyplněnou databázi pomocí své aplikace. Pro distribuci předem definované databáze zahrňte soubor databáze do balíku aplikace AIR. Jako všechny soubory, které jsou zahrnuty do balíku AIR, je přibalený soubor databáze instalován v adresáři aplikace (adresář představovaný vlastností File.applicationDirectory). Soubory v daném adresáři jsou nicméně určeny pouze ke čtení. Soubor z balíku AIR použijte jako „šablonovou“ databázi. Při prvním spuštění aplikace zkopírujte původní soubor databáze do adresáře pro ukládání uživatelské aplikace (nebo jiného umístění) a použijte danou databázi v rámci aplikace.
Vylepšení výkonu databáze Několik metod vestavěných do prostředí Adobe AIR vám umožňuje ve vaší aplikaci zlepšit výkon operací databáze.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 205 Práce s lokálními databázemi SQL
Vedle zde popsaných technik může způsob zapsání příkazu SQL také ovlivnit výkon databáze. Často existuje více způsobů pro zapsání příkazu SQL SELECT k načtení určité sady výsledků. V některých případech vyžadují odlišné přístupy více či méně úsilí od modulu databáze. Tento aspekt vylepšení výkonu databáze—navrhování příkazů SQL pro lepší výkon—není obsahem dokumentace programu Adobe AIR.
Pro každý příkaz SQLStatement použijte jednu instanci SQL Před provedením jakéhokoliv příkazu jej SQL připraví (kompiluje) k určení kroků, které jsou provedeny interně pro provedení příkazu. Když voláte SQLStatement.execute() na instanci SQLStatement, která nebyla dříve provedena, příkaz je před provedením automaticky připraven. U dalších volání metody execute(), dokud nebyla vlastnost SQLStatement.text změněna, je příkaz stále připraven. Proto je proveden rychleji. Pro získání maximálních výhod díky opětovnému použití příkazů, jestliže je třeba mezi provedeními příkazu změnit hodnoty, použijte parametry příkazu k vlastnímu nastavení příkazu. (Parametry příkazu jsou určeny pomocí vlastnosti asociativního poleSQLStatement.parameters.) Oproti změně vlastnosti instance SQLStatement textse při změně hodnoty parametrů příkazu nevyžaduje od runtime opětovné připravení příkazu. Více informací o používání parametrů v příkazech naleznete v části „Používání parametrů v příkazech“ na stránce 170. Protože příprava a provedení příkazu je operace, která je potenciálně náročná, je dobrou strategií předem načíst počáteční data a poté provést jiné příkazy na pozadí. Načtení dat, která aplikace potřebuje nejdříve. Po dokončení počátečních spouštěcích operací aplikace nebo při dalším „nečinném“ čase v aplikaci proveďte další příkazy. Například jestliže vaše aplikace nemá přístup k databázi na všech úrovních pro zobrazení počáteční obrazovky, počkejte dokud se daná obrazovka nezobrazí, poté otevřete připojení databáze, vytvořte instance SQLStatement a proveďte jakoukoliv z nich, kterou můžete. Alternativně předpokládejme, že aplikace při spuštění okamžitě zobrazí některá data, například výsledek určitého dotazu. V tomto případě pokračujte a pro daný dotaz proveďte instanci SQLStatement. Po načtení a zobrazení počátečních dat vytvořte instance SQLStatement pro další operace databáze a je-li to možné, proveďte jiné příkazy, které jsou potřeba později. Když opětovně používáte instanci SQLStatement, potřebuje vaše aplikace uchovat referenci na instanci SQLStatement po jejím připravení. Po uchování reference na danou instanci deklarujte danou proměnou jako proměnou rozsahu třídy, nikoliv jako proměnnou rozsahu funkce. Jedním dobrým způsobem je strukturovat vaši aplikaci tak, že je příkaz SQL zabalen do jediné třídy. Skupina příkazů, které jsou provedeny v kombinaci, může být také zabalena do jediné třídy. Definováním instance nebo instancí SQLStatement jako členových proměnných dané třídy zůstanou tyto tak dlouho, dokud instance třídy objektu zabalení existuje v aplikaci. Minimálně můžete jednoduše definovat proměnou obsahující instanci SQLStatement mimo funkci, takže je instance uchována v paměti. Instanci SQLStatement deklarujte například jako členovou proměnnou ve třídě ActionScript nebo jako ne-funkční proměnnou v souboru JavaScript. Poté můžete nastavit hodnoty parametru příkazů a volat jeho metodu execute(), pokud si přejete dotaz skutečně spustit.
Seskupení více operací do skupiny Předpokládejme, že provádíte velký počet příkazů SQL, které zahrnují přidání nebo změnu dat (příkazy INSERT nebo UPDATE). Můžete významně vylepšit výkon, a to provedením všech příkazů v rámci explicitní transakce. Jestliže explicitně nezahájíte transakci, každý z příkazů běží ve vlastní automaticky vytvořené transakci. Po dokončení spuštění každé transakce (každého příkazu) zapíše runtime výsledná data do souboru databáze na disk. Na druhou stranu zvažte, co se stane, pokud explicitně vytvoříte transakci a provedete příkazy v kontextu dané transakce. Runtime provede všechny změny v paměti a poté je všechny najedou zapíše do souboru databáze při spuštění transakce. Zapsání dat na disk obvykle zabírá nejvíce času z operace. Proto zapisování na disk najednou spíše než pro každý příkaz SQL může výrazně zlepšit výkon.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 206 Práce s lokálními databázemi SQL
Minimalizování zpracovávání v době běhu Použití následujících technik může předcházet nepotřebné práci na části modulu databáze a aplikace tak budou mít lepší výkon:
• V příkazu vždy výslovně určete názvy databáze společně s názvy tabulky. (Použijte „hlavní“, jedná-li se o hlavní databázi). Například použijte SELECT employeeId FROM hlavní.employees spíše než SELECT employeeId FROM employees. Explicitní určení názvu databáze zabraňuje runtime v kontrole každé databáze pro vyhledání shodné tabulky. Zabraňuje také tomu, že runtime zvolí špatnou databázi. Tímto pravidlem se řiďte, i pokud je SQLConnection pouze připojena k jediné databázi, protože SQLConnection je v pozadí také připojena k přechodné databázi, které je přístupná pomocí příkazů SQL.
• Vždy explicitně určete názvy sloupců v příkazu SELECT nebo INSERT. • Rozdělte řádky vrácené příkazem SELECT, který načte velké množství řádků: viz „Částečné načítání výsledků příkazu SELECT.“ na stránce 176.
Vyhněte se změnám schématu Je-li to možné, vyhněte se po vložení dat do tabulek databáze změně schématu (struktury tabulky) databáze. Běžně je soubor databáze strukturován s definicemi tabulky na začátku souboru. Když otevřete připojení k databázi, runtime načte tyto definice. Když přidáte data do tabulek databáze, data jsou přidána do souboru za definiční data tabulky. Pokud nicméně schéma změníte, například přidáte sloupec do tabulky nebo přidáte novou tabulku, nová definiční data se smíchají s daty tabulky v souboru databáze. Jestliže definiční data tabulky nejsou všechna na začátku souboru databáze, otevření spojení k databázi trvá déle, protože runtime čte definiční data tabulky z různých částí souboru. Potřebujete-li změnit schéma, můžete po dokončení změn volat metodu SQLConnection.compact(). Tato operace změní strukturu souboru databáze tak, že definiční data tabulky budou všechna umístěna na začátku souboru. Operace compact() může nicméně zabrat mnoho času, zvláště při narůstající velikosti souboru databáze.
Nejlepší způsoby pro práci s lokálními databázemi SQL Následující seznam je sada navržených technik, které můžete použít pro zlepšení výkonu, zabezpečení a usnadnění údržby svých aplikací při práci s lokálními databázemi SQL. Další techniky vylepšení aplikací databáze naleznete v tématu „Vylepšení výkonu databáze“ na stránce 204.
Vytvoření připojení databáze předem I když vaše aplikace neprovede při prvním načtení žádné příkazy, konkretizujte objekt SQLConnection a volejte jeho metodu open() nebo openAsync() dostatečně dopředu (například po úvodním spuštění aplikace), abyste se vyhnuli zpožděním při spouštění příkazů. Viz. „Připojení k databázi“ na stránce 167.
Opětovné použití připojení databáze Jestliže přistupujete k určité databázi během času provedení vaší aplikace, uchovejte si referenci na danou instanci SQLConnection a znovu ji použijte v celé aplikaci, namísto toho, abyste spojení uzavřeli a znovu otevřeli. Viz. „Připojení k databázi“ na stránce 167.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 207 Práce s lokálními databázemi SQL
Upřednostněte asynchronní režim spuštění Při zapisování kódu přístupu k datům může být lákavé provést operace synchronně spíše než asynchronně, protože používání synchronních operací často vyžaduje kratší a méně složitý kód. Jak je nicméně popsáno v tématu „Použití synchronních a asynchronních operací databáze“ na stránce 184, synchronní operace mohou mít vliv na výkonnost, což nepříznivě ovlivňuje zážitek uživatelů s aplikací. Objem času, který jednotlivá operace zabere, se liší podle operace a zvláště podle množství dat, které operace zahrnuje. Například příkaz SQL INSERT , který do databáze přidá pouze jednu řádku zabere méně času než příkaz SELECT, který dosadí tisíce řádků dat. Pokud ale používáte pro provedení více operací synchronní spuštění, operace jsou obvykle zřetězeny dohromady. I v případě, že doba trvání každé jediné operace je velice krátká, aplikace zamrzne, dokud nejsou všechny synchronní operace dokončeny. Výsledkem je to, že kumulativní doba více operaci zřetězených dohromady může stačit k zablokování vaší aplikace. Jako standardní přístup použijte asynchronní operace, zvláště u operací, které zahrnují velké množství řádků. Existuje technika pro rozdělení zpracování velkých sad výsledků příkazuSELECT, která je popsaná v tématu „Částečné načítání výsledků příkazu SELECT.“ na stránce 176. Tato technika může být nicméně použita pouze v asynchronním režimu spuštění. Synchronní operace používejte pouze v případě, kdy nemůžete dosáhnout určité funkce pomocí asynchronního programování, poté, co jste zvážili rozdíly ve výkonu, kterými budou uživatelé vaší aplikace ovlivněni, a svoji aplikaci jste otestovali a víte, jak bude výkon aplikace ovlivněn. Používání asynchronního spuštění může zahrnovat složitější kódování. Nicméně pamatujte, že kód je třeba zapsat pouze jednou, ale uživatelé aplikace jej musí používat opakovaně, rychle nebo pomalu. V mnoha případech může být použitím samostatné instance SQLStatement pro každý příkaz SQL určený k provedení nahromaděno více operací SQL najednou do fronty, čímž se asynchronní kód podobá synchronnímu kódu, co se týče způsobu zapsání kódu. Více informací naleznete v tématu „Pochopení modelu asynchronního spuštění“ na stránce 187.
Použijte samostatné příkazy SQL a neměňte vlastnost textu SQLStatement Pro jakýkoliv příkaz SQL, který je v aplikaci proveden více než jednou, vytvořte pro každý příkaz SQL samostatnou instanci SQLStatement. Tuto instanci SQLStatement použijte při každém provedení příkazu SQL. Předpokládejme například, že vytváříte aplikaci, která zahrnuje čtyři odlišné operace SQL provedené několikrát. V tomto případě vytvořte čtyři samostatné instance SQLStatement a pro spuštění volejte metodu execute() každého segmentu. Vyhněte se použití jediné instance SQLStatement pro všechny příkazy SQL a novému definování její vlastnosti text pokaždé před spuštěním příkazu. Více informací naleznete v tématu „Pro každý příkaz SQLStatement použijte jednu instanci SQL“ na stránce 205.
Používání parametrů příkazu Používejte parametry SQLStatement—nikdy nespojujte vstup uživatele do textu příkazu. Díky použití parametrů bude vaše aplikace lépe zabezpečena, protože tím zabráníte možnému vnucení SQL. Bude tak možné použít objekty v dotazech (spíše než pouze hodnoty literálu SQL). Příkazy budou také prováděny účinněji, protože je lze opětovně použít bez potřeby je znovu kompilovat při každém spuštění. Více informací naleznete v tématu „Používání parametrů v příkazech“ na stránce 170.
Používání konstant pro názvy sloupců a parametrů Jestliže pro příkaz SQLStatement neurčíteitemClass, definujte konstanty String obsahující názvy sloupců tabulky. Vyhnete se tak chybám při psaní. Tyto konstanty použijte v textu příkazu a pro názvy vlastnosti při načítání hodnot z výsledných objektů. Konstanty použijte také pro názvy parametrů.
208
Kapitola 19: Ukládání šifrovaných dat Modul runtime prostředí Adobe® AIR™ poskytuje trvalé šifrované místní úložiště pro jednotlivé aplikace prostředí AIR nainstalované v počítači uživatele. To umožňuje ukládat a načítat data uložená na místním pevném disku v šifrovaném formátu, který nemohou jiné aplikace nebo uživatelé snadno dešifrovat. Oddělené šifrované místní úložiště se používá pro jednotlivé aplikace prostředí AIR a každá aplikace AIR používá oddělená šifrovaná místní úložiště pro jednotlivé uživatele. Poznámka: Kromě šifrovaného místního úložiště poskytuje aplikace AIR také šifrování pro obsah, který je uložený v databázích SQL. Podrobnosti naleznete v části „Použití šifrování s databázemi SQL“ na stránce 188. V některých případech je vhodné použít šifrované místní úložiště k ukládání informací, které musí být zabezpečeny, například oprávnění pro přihlášení k webovým službám. Aplikace AIR používá k přiřazení šifrovaného místního úložiště ke každé aplikaci a uživateli v operačním systému Windows rozhraní DPAPI, v operačním systému Mac OS metodu KeyChain a v systému Linux metody KeyRing nebo KWallet. Šifrované místní úložiště používá 128bitové šifrování AES-CBC. Informace v šifrovaném místním úložišti jsou dostupné pro obsah aplikací AIR v karanténě zabezpečení aplikace. Statické metody setItem() a removeItem() třídy EncryptedLocalStore slouží k uložení a načtení dat z místního úložiště. Data jsou uložena v tabulce hash, jako klíče jsou použity řetězce a samotná data jsou uložena jako bajtová pole. Následující kód ukládá řetězec do šifrovaného místního úložiště: var str:String = "Bob"; var bytes:ByteArray = new ByteArray(); bytes.writeUTFBytes(str); EncryptedLocalStore.setItem("firstName", bytes); var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); trace(storedValue.readUTFBytes(storedValue.length)); // "Bob"
Třetí parametr metody setItem() parametr stronglyBound je volitelný. Jestliže je tento parametr nastaven na hodnotu true, šifrované místní úložiště poskytne vyšší úroveň zabezpečení tím, že vytvoří vazbu uložené položky k digitálnímu podpisu a bitům ukládající aplikace AIR a k ID vydavatele aplikace, pokud platí: var str:String = "Bob"; var bytes:ByteArray = new ByteArray(); bytes.writeUTFBytes(str); EncryptedLocalStore.setItem("firstName", bytes, true);
Pro položku, která je uložena s parametrem stronglyBound nastaveným na hodnotu true, budou následná vyvolání metody getItem() úspěšná pouze v případě, že vyvolávající aplikace AIR bude shodná s ukládající aplikací (v souborech v adresáři aplikace se nezměnila žádná data). Pokud se vyvolávající aplikace AIR liší od ukládající aplikace a budete vyvolávat metodu getItem() pro pevně svázanou položku, aplikace vyvolá výjimku chyby. Budete-li svou aplikaci aktualizovat, nebude schopna číst pevně svázaná data zapsaná dříve do šifrovaného místního úložiště. Aplikace AIR ve výchozím nastavení nemůže číst ze šifrovaného místního úložiště jiné aplikace. Nastavení stronglyBound zajišťuje další vazbu (s daty v bitech aplikace), která aplikaci útočníka znemožní čtení ze šifrovaného místního úložiště vaší aplikace, pokud se pokusí o krádež ID vydavatele vaší aplikace.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 209 Ukládání šifrovaných dat
Jestliže aktualizujete aplikaci, aby používala jiný podpisový certifikát (pomocí podpisu přesunutí), aktualizovaná verze nebude mít přístup k žádné položce v původním úložišti ani v případě, že bude parametr stronglyBound nastaven na hodnotu false. Další informace naleznete v části „Změna certifikátů“ na stránce 313. Odstranění hodnoty ze šifrovaného místního úložiště je možné pomocí metody EncryptedLocalStore.removeItem() jako v následujícím příkladu: EncryptedLocalStore.removeItem("firstName");
Chcete-li ze šifrovaného místního úložiště vymazat veškerá data, můžete vyvolat metodu EncryptedLocalStore.reset() jako v následujícím příkladu: EncryptedLocalStore.reset();
Když ladíte aplikaci v programu ADL (AIR Debug Launcher), aplikace používá jiné šifrované místní úložiště než to, které bylo používáno v nainstalované verzi aplikace. Pokud uložená data přesahují 10MB, šifrované místní úložiště může pracovat pomaleji. Jestliže odinstalujete aplikaci AIR, odinstalační program neodstraní data uložená v šifrovaném místním úložišti. Data z šifrovaného místního úložiště jsou přemístěna do podadresáře v adresáři dat aplikací uživatele. Cesta k podadresáři je Adobe/AIR/ELS/ s připojeným ID aplikace.
210
Kapitola 20: Prostředí HTML Prostředí Adobe®AIR™ využívá modul WebKit (www.webkit.org), který je rovněž používán webovým prohlížečem Safari, k analýze, rozvržení a vykreslení obsahu HTML a JavaScript. Používání rozhraní API prostředí AIR v obsahu HTML je volitelné. K programování obsahu objektu HTMLLoader nebo okna HTML zcela postačí jazyk HTML a JavaScript. Většinu stávajících stránek a aplikací HTML by mělo být možné spouštět pouze s několika změnami (za předpokladu, že používají funkce jazyků HTML, CSS, DOM a JavaScript kompatibilní s modulem WebKit). Protože jsou aplikace AIR spouštěny přímo na pracovní ploše a mají plný přístup k systému souborů, model zabezpečení obsahu HTML je přísnější než model zabezpečení obvyklých webových prohlížečů. V prostředí AIR je do aplikační karantény umísťován pouze obsah načtený z instalačního adresáře aplikace. Aplikační karanténa má nejvyšší úroveň oprávnění a umožňuje přístup k rozhraním API prostředí AIR. Prostředí AIR umísťuje ostatní obsah do izolovaných karantén na základě místa jeho původu. Soubory načtené ze systému souborů jsou ukládány do místní karantény a soubory načtené ze sítě prostřednictvím protokolu http: nebo https: do příslušné karantény založené na doméně vzdáleného serveru. Obsah v těchto neaplikačních karanténách má zakázán přístup ke všem rozhraním API prostředí AIR a je spouštěn v podstatě stejně jako v obvyklých webových prohlížečích. Prostředí AIR využívá modul WebKit (www.webkit.org), který je rovněž používán webovým prohlížečem Safari, k analýze, rozvržení a vykreslení obsahu HTML a JavaScript. Vestavěné třídy a objekty hostitele prostředí AIR poskytují rozhraní API pro funkce tradičně spojované s aplikacemi na ploše. K těmto funkcím patří čtení a zapisování souborů a správa oken. Prostředí Adobe AIR rovněž dědí rozhraní API z přehrávače Adobe® Flash® Player, která zahrnují funkce, jako je zvukový a binární soket. Pokud jsou použita nastavení alfa, změny měřítka nebo průhlednosti, v obsahu HTML v prostředí AIR se nezobrazí obsah SWF a PDF. Další informace naleznete v části Opatření při načítání obsahu SWF nebo PDF na stránku HTML a „Průhlednost okna“ na stránce 61.
Přehled prostředí HTML Adobe AIR poskytuje úplné prostředí JavaScript podobné prohlížeči, včetně vykreslovacího modulu HTML, modelu DOM a překladače jazyka JavaScript. Prostředí JavaScript je reprezentováno třídou HTMLLoader prostředí AIR. Objekt HTMLLoader v oknech HTML zahrnuje veškerý obsah HTML a zároveň je obsažen v objektu NativeWindow. V obsahu SWF může být třída HTMLLoader, která rozšiřuje třídu Sprite, přidána do seznamu zobrazení plochy jako kterýkoli jiný objekt zobrazení. Vlastnosti jazyka ActionScript™ pro tuto třídu jsou popsány v části „Skriptování kontejneru HTML“ na stránce 251 a v dokumentu Referenční příručka jazyka ActionScript pro aplikaci Flex 3.
Prostředí JavaScript a jeho vztah k prostředí AIR Následující schéma ilustruje vztah mezi prostředím JavaScript a běhovým prostředím AIR. Ačkoli je zobrazeno pouze jedno nativní okno, aplikace AIR může obsahovat více oken. (A jedno okno může obsahovat více objektů HTMLLoader.)
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 211 Prostředí HTML
AIR Run-time Environment
NativeWindow
HTMLLoader window JavaScript Environment window
window
body
head
htmlLoader
native4Window
runtime h1
div
table
p
Prostředí JavaScript má své vlastní objekty Document (Dokument) a Window (Okno). Kód jazyka JavaScript může spolupracovat s běhovým prostředím AIR prostřednictvím vlastností runtime, nativeWindow a htmlLoader. Kód jazyka ActionScript může spolupracovat s prostředím JavaScript prostřednictvím vlastnosti okna objektu HTMLLoader, což je odkaz na objekt Window (Okno) jazyka JavaScript. Objekty jazyků ActionScript a JavaScript mohou také naslouchat událostem vyslaným objekty prostředí AIR i jazyka JavaScript.
Vlastnost runtime poskytuje přístup k třídám rozhraní API prostředí AIR a umožňuje vytváření nových objektů AIR a členů tříd pro přístup (označovaných také jako statické členy). Chcete-li získat přístup k rozhraní API prostředí AIR, přidejte k vlastnosti runtime název třídy včetně balíčku. Chcete-li například vytvořit objekt File (Soubor), použijte tento příkaz: var file = new window.runtime.filesystem.File();
Poznámka: Sada AIR SDK obsahuje soubor JavaScript AIRAliases.js, který definuje vhodnější aliasy pro většinu běžně používaných tříd AIR. Při importu tohoto souboru můžete namísto tvaru window.runtime.package.Class použít kratší tvar air.Class. Například objekt File (Soubor) můžete vytvořit pomocí řetězce new air.File(). Objekt NativeWindow poskytuje vlastnosti pro ovládání okna na ploše. Ze stránky HTML je možné získat přístup k nadřazenému objektu NativeWindow pomocí vlastnosti window.nativeWindow. Objekt HTMLLoader poskytuje vlastnosti, metody a události pro ovládání způsobu načtení a vykreslení obsahu. Ze stránky HTML je možné získat přístup k nadřazenému objektu HTMLLoader pomocí vlastnosti window.htmlLoader.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 212 Prostředí HTML
Důležité: Pouze stránky nainstalované jako součást aplikace mají vlastnost htmlLoader, nativeWindow nebo runtime, a to pouze v případě, že byly načteny jako dokument nejvyšší úrovně. Tyto vlastnosti nejsou přidávány, pokud byl dokument načten do elementu frame nebo iframe. (Podřízený dokument může mít přístup k těmto vlastnostem v nadřazeném dokumentu, pokud se nachází ve stejné zabezpečené karanténě. Například dokument načtený do elementu frame může získat přístup k vlastnosti runtime svého nadřazeného dokumentu pomocí vlastnosti·parent.runtime.)
Zabezpečení Prostředí AIR spouští celý kód v zabezpečené karanténě podle domény původu. Obsah aplikace, který je omezen na obsah načtený z instalačního adresáře aplikace, je umístěn do aplikační karantény. Přístup k běhovému prostředí a rozhraním API prostředí AIR je k dispozici pouze pro HTML a JavaScript spuštěné v této karanténě. Současně je většina dynamických vyhodnocení a spouštění jazyka JavaScript blokována v aplikační karanténě poté, co byly vráceny všechny manipulační programy události load (načtení) stránky. Stránku aplikace můžete mapovat do neaplikační karantény načtením do prvku frame nebo iframe a nastavením atributů sandboxRoot a documentRoot rámce specifických pro prostředí AIR. Nastavením hodnoty vlastnosti sandboxRoot na skutečnou vzdálenou doménu můžete povolit, aby obsah umístěný v karanténě provedl křížové skriptování obsahu v této doméně. Mapování stránek tímto způsobem může být užitečné při načítání a skriptování vzdáleného obsahu, jako je tomu v hybridní webové aplikaci. Jiným způsobem, jak lze povolit obsahu aplikace a obsahu mimo aplikaci, aby provedly vzájemné křížové skriptování, a jediným způsobem, jak umožnit obsahu mimo aplikaci přístup k rozhraním API prostředí AIR, je vytvořit most karantény. Most typu nadřazený–podřízený umožňuje obsahu v podřízeném elementu frame či iframe nebo v okně získat přístup k vybraným metodám a vlastnostem definovaným v aplikační karanténě. Naopak most typu podřízený– nadřazený umožňuje obsahu aplikace přístup k vybraným metodám a vlastnostem definovaným v karanténě podřízeného prvku. Mosty karantén se vytvářejí nastavením vlastností parentSandboxBridge a childSandboxBridge objektu okna. Další informace naleznete v části „Zabezpečení HTML“ na stránce 29 a „Elementy HTML frame a iframe“ na stránce 220.
Zásuvné moduly a vložené objekty Prostředí AIR podporuje zásuvný modul Adobe® Acrobat®. Pro zobrazení obsahu PDF musí mít uživatelé k dispozici aplikaci Acrobat nebo Adobe® Reader® 8.1 (nebo novější). Objekt HTMLLoader poskytuje vlastnost pro zjištění, zda může uživatelův počítač zobrazit PDF. Obsah souboru SWF je možné zobrazit také v prostředí HTML, ale tato funkce je zabudována do prostředí AIR a nepoužívá vnější zásuvný modul. V prostředí AIR nejsou podporovány žádné další zásuvné moduly Webkit.
Viz také „Zabezpečení HTML“ na stránce 29 „Karantény HTML“ na stránce 213 „Elementy HTML frame a iframe“ na stránce 220 „Objekt Window (Okno) jazyka JavaScript“ na stránce 218 „Objekt XMLHttpRequest“ na stránce 214 „Přidávání obsahu PDF“ na stránce 265
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 213 Prostředí HTML
Rozšíření prostředí AIR a modulu Webkit Prostředí Adobe AIR používá modul Webkit s otevřeným zdrojovým kódem používaný rovněž ve webovém prohlížeči Safari. Prostředí AIR přidává několik rozšíření, která umožňují přístup k třídám a objektům runtime a slouží k zabezpečení. Samotný modul Webkit navíc doplňuje funkce, které nejsou obsaženy ve standardech W3C pro HTML, CSS a JavaScript. Zde jsou popsány pouze doplňky prostředí AIR a nejdůležitější rozšíření modulu Webkit. Další dokumentaci k nestandardním jazykům HTML, CSS a JavaScript naleznete na stránkách www.webkit.org a developer.apple.com. Informace o standardech naleznete na stránkách konsorcia W3C. Rovněž nadace Mozilla poskytuje cenné obecné informace k tématům HTML, CSS a DOM (moduly Webkit a Mozilla samozřejmě nejsou identické). Poznámka: Prostředí AIR nepodporuje následující standardní a rozšířené funkce modulu WebKit: metodu print() objektu Window (Okno) jazyka JavaScript; zásuvné moduly kromě aplikací Acrobat a Adobe Reader 8.1+; formát SVG (Scalable Vector Graphics) a vlastnost opacity jazyka CSS.
JavaScript v prostředí AIR Prostředí AIR provádí několik změn typického chování běžných objektů jazyka JavaScript. Mnoho těchto změn bylo provedeno s cílem usnadnit psaní zabezpečených aplikací v prostředí AIR. Tyto rozdíly v chování zároveň znamenají, že některé obvyklé kódovací vzory jazyka JavaScript a stávající webové aplikace využívající tyto vzory nemusí vždy v prostředí AIR fungovat podle očekávání. Informace o opravách těchto typů chyb naleznete v části „Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením“ na stránce 228.
Karantény HTML Prostředí AIR umísťuje obsah do karantén podle jeho původu. Pravidla karantény jsou konzistentní se zásadami stejného původu implementovanými většinou webových prohlížečů a s pravidly pro karantény implementovanými přehrávačem Adobe Flash Player. Prostředí AIR dále poskytuje nový typ aplikační karantény, který slouží k ukládání a ochraně jejich obsahu. Další informace o typech karantén, se kterými se můžete setkat při vývoji aplikací AIR, naleznete v části „Karantény zabezpečení“ na stránce 27. Přístup k běhovému prostředí a rozhraním API prostředí AIR je k dispozici pouze pro HTML a JavaScript spuštěné v této aplikační karanténě. Současně je však dynamické vyhodnocení a provedení jazyka JavaScript v jeho různých formách uvnitř aplikační karantény z bezpečnostních důvodů značně omezeno. Tato omezení jsou uplatňována bez ohledu na to, zda vaše aplikace skutečně načítá informace přímo ze serveru či nikoli. (Dokonce i obsah souboru, vložené řetězce a data přímo vložená uživatelem mohou být nedůvěryhodné.) Karanténa, do které je obsah na stránce odesílán, je určena původem obsahu. Do aplikační karantény je umísťován pouze obsah načtený z adresáře aplikace (instalačního adresáře uvedeného ve schématu app: adresy URL). Obsah načtený ze systému souborů je umístěn do místní z hlediska systému souborů nebo místně důvěryhodné karantény, což umožňuje přístup a interakci s obsahem v místním systému souborů, ale nikoli se vzdáleným obsahem. Obsah načtený ze sítě je umístěn do vzdálené karantény odpovídající doméně původu obsahu. Aby mohla stránka aplikace bez omezení spolupracovat s obsahem ve vzdálené karanténě, musí být mapována do stejné domény jako vzdálený obsah. Jestliže například napíšete aplikaci, která zobrazuje data mapování z internetové služby, stránka vaší aplikace, která načítá a zobrazuje obsah z této služby, může být namapována do domény služby. Atributy mapování stránek do vzdálené karantény a domény jsou novými atributy přidanými do elementů HTML frame a iframe.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 214 Prostředí HTML
Chcete-li umožnit, aby obsah v neaplikační karanténě bezpečně využíval funkce prostředí AIR, můžete nastavit nadřízený most karantény. Aby mohl mít obsah aplikace možnost bezpečného vyvolání metod a měl přístup k vlastnostem obsahu v jiných karanténách, můžete nastavit podřízený most karantény. Bezpečnost zde znamená, že vzdálený obsah nemůže nedopatřením získat odkazy na objekty, vlastnosti nebo metody, které nejsou výslovně zpřístupněny. Přes most mohou projít pouze jednoduché typy dat a anonymní objekty. I nadále se však musíte vyhýbat výslovnému zpřístupnění potenciálně nebezpečných funkcí. Pokud byste například zpřístupnili rozhraní, které umožňuje vzdálenému obsahu číst a zapisovat soubory kdekoli v systému uživatele, pak byste pravděpodobně vzdálenému obsahu poskytli možnosti způsobovat uživatelům značné škody.
Funkce eval() jazyka JavaScript Použití funkce eval() je v aplikační karanténě po dokončení načtení stránky omezeno. Některé způsoby použití jsou povoleny, aby mohla být bezpečně analyzována data ve formátu JSON, ale jakékoli vyhodnocení, jehož výsledkem jsou spustitelné příkazy, vyvolá chybu. V části „Omezení kódu pro obsah v různých karanténách zabezpečení“ na stránce 31 jsou popsány povolené způsoby použití funkce eval().
Konstruktory Function (Funkce) V aplikační karanténě lze před dokončením načtení stránky použít konstruktory funkce. Po dokončení všech manipulačních programů události load (načtení)stránky nelze vytvářet nové funkce.
Načítání externích skriptů Stránky HTML v aplikační karanténě nemohou používat tag script k načtení souborů JavaScript z umístění mimo adresář aplikace. Aby mohla stránka ve vaší aplikaci načíst skript z umístění mimo adresář aplikace, musí být mapována do neaplikační karantény.
Objekt XMLHttpRequest Prostředí AIR zahrnuje objekt XMLHttpRequest (XHR), který může být využíván aplikacemi k vytváření požadavků na data. V následujícím příkladu je popsán jednoduchý požadavek na data: xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", "http:/www.example.com/file.data", true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4) { //do something with data... } } xmlhttp.send(null);
Prostředí AIR na rozdíl od prohlížeče umožňuje obsahu spuštěnému v aplikační karanténě požadovat data z kterékoli domény. Výsledek požadavku XHR obsahující řetězec JSON může být vyhodnocením převeden na datové objekty, pokud zároveň neobsahuje spustitelný kód. Jsou-li ve výsledku požadavku XHR přítomny spustitelné příkazy, dojde k chybě a pokus o vyhodnocení se nezdaří. Aby nebyl nedopatřením vložen kód ze vzdálených zdrojů, synchronní požadavky XHR, pokud byly vytvořeny před dokončením načtení stránky, vrátí prázdný výsledek. Asynchronní požadavky XHR jsou po načtení stránky vždy vráceny. Prostředí AIR ve výchozím nastavení blokuje požadavky XMLHttpRequest mezi doménami v neaplikačních karanténách. Nadřazené okno v aplikační karanténě může povolit požadavky mezi doménami v podřízeném rámci s obsahem v neaplikační karanténě po nastavení atributu allowCrossDomainXHR přidaného prostředím AIR v nadřazeném prvku frame nebo iframe na hodnotu true:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 215 Prostředí HTML
Poznámka: Třída URLStream prostředí AIR může být ve vhodných případech rovněž použita ke stažení dat. Pokud odešlete požadavek XMLHttpRequest na vzdálený server z elementu frame nebo iframe zahrnujícího obsah aplikace, který byl namapován do vzdálené karantény, přesvědčte se, že adresa URL mapování nemaskuje adresu serveru použitou v požadavku XHR. Zvažte například následující definici elementu iframe, která mapuje obsah aplikace do vzdálené karantény pro doménu example.com: <iframe id="mashup" src="http://www.example.com/map.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/" allowCrossDomainXHR="true"
Protože atribut sandboxRoot přemapuje kořenovou adresu URL adresy www.example.com, všechny požadavky budou načteny z adresáře aplikace a nikoli ze vzdáleného serveru. Požadavky jsou přemapovány, ať jsou odvozeny z navigace stránky nebo z požadavku XMLHttpRequest. Aby nebyly nedopatřením blokovány požadavky na data určené příslušnému vzdálenému serveru, mapujte atribut sandboxRoot do podadresáře adresy URL a nikoli do kořenového adresáře. Tento adresář nemusí nutně existovat. Chcete-li například povolit požadavky na server www.example.com na stahování ze vzdáleného serveru a nikoli z adresáře aplikace, změňte předchozí element iframe na tento: <iframe id="mashup" src="http://www.example.com/map.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/air/" allowCrossDomainXHR="true"
V takovém případě bude místně načten pouze obsah podadresáře air. Další informace o mapování karantény naleznete v části „Elementy HTML frame a iframe“ na stránce 220 a „Zabezpečení HTML“ na stránce 29.
Objekt Canvas (Plátno) Objekt Canvas (Plátno) určuje rozhraní API pro kreslení geometrických tvarů, jako jsou čáry, oblouky, elipsy a mnohoúhelníky. Chcete-li použít rozhraní API plátna, nejprve přidejte do dokumentu element plátno a pak v něm kreslete pomocí rozhraní API Canvas (Plátno) jazyka JavaScript. Ve většině ostatních ohledů se objekt Canvas (Plátno) chová jako obraz. V následujícím příkladu je pomocí objektu Canvas (Plátno) kreslen trojúhelník:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 216 Prostředí HTML
Další dokumenty týkající se rozhraní API Canvas (Plátno) naleznete na stránce Safari JavaScript Reference (Příručka jazyka JavaScript pro webový prohlížeč Safari) společnosti Apple. Povšimněte si, že se nedávno v rámci projektu Webkit za účelem standardizace začalo měnit rozhraní API Canvas (Plátno), jak je uvedeno v dokumentu HTML 5 Working Draft (Pracovní návrh HTML 5) předloženém skupinou WHATWG (Web Hypertext Application Technology Working Group) a konsorciem W3C. Výsledkem je, že některé dokumenty příručky jazyka JavaScript pro webový prohlížeč Safari mohou být nekonzistentní s verzí objektu Canvas (Plátno) v rámci prostředí AIR.
Soubory cookie V aplikacích AIR může soubory cookie využívat pouze obsah ve vzdálených karantén (obsah načtený ze zdrojů http: a https:) (vlastnost document.cookie. V aplikační karanténě poskytují rozhraní API prostředí AIR další prostředky pro ukládání trvalých dat (například třídy EncryptedLocalStore a FileStream).
Objekt Clipboard (Schránka) Rozhraní API Clipboard (Schránka) modulu WebKit je řízeno těmito událostmi: copy (kopírování), cut (vyjmutí) a paste (vložení). Objekt události předaný prostřednictvím těchto událostí poskytuje přístup ke schránce prostřednictvím vlastnosti clipboardData. Následující metody objektu clipboardData lze použít ke čtení nebo zápisu dat schránky: Metoda
Popis
clearData(mimeType)
Vymaže data schránky. Parametr mimeType nastavte na typ MIME dat určených k vymazání.
getData(mimeType)
Slouží k získání dat schránky. Tuto metodu je možné vyvolat pouze do manipulačního programu události paste (vložení). Parametr mimeType nastavte na typ MIME dat určených k vrácení.
setData(mimeType, data)
Slouží ke kopírování dat do schránky. Parametr mimeType nastavte na typ MIME požadovaných dat.
Kód jazyka JavaScript mimo aplikační karanténu může získat přístup ke schránce pouze prostřednictvím těchto událostí. Avšak obsah v aplikační karanténě může získat přístup ke schránce systému přímo pomocí třídy Clipboard (Schránka) prostředí AIR. K získání dat v textovém formátu umístěných ve schránce je například možné použít následující příkaz: var clipping = air.Clipboard.generalClipboard.getData("text/plain", air.ClipboardTransferMode.ORIGINAL_ONLY);
Platné typy MIME dat jsou tyto:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 217 Prostředí HTML
Typ MIME
Hodnota
Text
"text/plain"
HTML
"text/html"
URL
"text/uri-list"
Bitmapa
"image/x-vnd.adobe.air.bitmap"
Seznam souborů
"application/x-vnd.adobe.air.file-list"
Důležité: Přístup k datům obsaženým ve schránce může získat pouze obsah v aplikační karanténě. Pokud se o přístup k objektu souboru ze schránky pokusí obsah mimo aplikaci, dojde k chybě zabezpečení. Další informace o používání schránky naleznete v části „Kopírování a vkládání“ na stránce 145 a na stránce Using the Pasteboard from JavaScript (Používání pracovní plochy prostřednictvím jazyka JavaScript) (Apple Developer Center).
Přetažení Gesty přetažení do HTML a z HTML jsou vytvářeny následující události DOM: dragstart, drag, dragend, dragenter, dragover, dragleave a drop. Objekt události předaný v těchto událostech poskytuje přístup k přetaženým datům prostřednictvím vlastnosti dataTransfer. Vlastnost dataTransfer odkazuje na objekt, který poskytuje stejné metody jako objekt clipboardData asociovaný s událostí schránky. Následující funkci můžete například použít k získání dat v textovém formátu z události drop (vložení): function onDrop(dragEvent){ return dragEvent.dataTransfer.getData("text/plain", air.ClipboardTransferMode.ORIGINAL_ONLY); }
Objekt dataTransfer obsahuje následující důležité členy: Člen
Popis
clearData(mimeType)
Vymaže data. Parametr mimeType nastavte na typ MIME reprezentace dat určené k vymazání.
getData(mimeType)
Slouží k získání přetažených dat. Tuto metodu je možné vyvolat pouze do manipulačního programu události drop (vložení). Parametr mimeType nastavte na typ MIME dat, která chcete získat.
setData(mimeType, data)
Slouží k nastavení dat určených k přetažení. Parametr mimeType nastavte na typ MIME požadovaných dat.
types
Pole řetězců obsahující typy MIME všech reprezentací dat aktuálně dostupných v objektu dataTransfer.
effectsAllowed
Určuje, zda přetažená data mohou být kopírována, přesunuta, propojena, nebo zpracována některou kombinací těchto operací. Vlastnost effectsAllowed nastavte v manipulačním programu události dragstart.
dropEffect
Určuje, které z povolených efektů vložení jsou podporovány cílem přetažení. Vlastnost dropEffect nastavte v manipulačním programu události dragEnter. Během přetažení se kurzor mění a udává efekt, který by mělo uvolnění myši uživatelem. Není-li určena žádná událost dropEffect, bude vybrán účinek vlastnosti effectsAllowed. Efekt kopírování má přednost před efektem přesunutí, který má přednost před efektem vazby. Uživatel může změnit výchozí prioritu pomocí klávesnice.
Další informace o přidávání podpory přetažení do aplikace AIR naleznete v části „Přetažení“ na stránce 131 a na stránce Using the Drag-and-Drop from JavaScript (Používání funkce přetažení prostřednictvím jazyka JavaScript) (Apple Developer Center).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 218 Prostředí HTML
Vlastnosti innerHTML a outerHTML Prostředí AIR uplatňuje omezení použití vlastností innerHTML a outerHTML pro obsah spuštěný v aplikační karanténě. Před událostí načtení stránky a během spouštění jakýchkoli manipulačních programů události načtení je použití vlastností innerHTML a outerHTML neomezené. Avšak jakmile je stránka načtena, můžete pro přidání statického obsahu do dokumentu použít pouze vlastnost innerHTML nebo outerHTML. Jakýkoli příkaz v řetězci přiřazeném k vlastnosti innerHTML nebo outerHTML, který se vyhodnocuje na spustitelný kód, je ignorován. Pokud například zahrnete do definice elementu atribut zpětného vyvolání události, nebude přidán posluchač události. Obdobně nebudou vyhodnoceny vložené tagy <script>. Další informace naleznete v části „Zabezpečení HTML“ na stránce 29.
Metody Document.write() a Document.writeln() Použití metod write() a writeln() není v aplikační karanténě před událostí load (načtení) stránky omezeno. Avšak jakmile je stránka načtena, vyvolání kterékoli z těchto metod stránku nevymaže ani nevytvoří novou. V neaplikační karanténě, jako ve většině webových prohlížečů, vyvolání metody document.write() nebo writeln() po dokončení načtení stránky vymaže aktuální stránku a otevře novou, prázdnou.
Vlastnost Document.designMode Nastavíte-li vlastnost document.designMode na hodnotu on, elementy v dokumentu bude možné upravit. Podpora vestavěného editoru zahrnuje úpravy, kopírování, vložení a přetažení textu. Nastavení vlastnosti designMode na hodnotu on a nastavení vlastnosti contentEditable elementu body na hodnotu true jsou ekvivalentní. Vlastnost contentEditable lze použít u většiny elementů HTML k určení částí dokumentu, které bude možné upravit. Další informace naleznete v části „Atribut contentEditable jazyka HTML“ na stránce 223.
Události unload (odstranění z paměti) (pro objekty body a frameset) V tagu nejvyšší úrovně frameset (sady rámců) nebo body (hlavní část) okna (včetně hlavního okna aplikace) nepoužívejte událost unload (odstranění z paměti) pro reakci na zavření okna (nebo ukončení aplikace). Namísto ní použijte událost exiting objektu NativeApplication (ke zjištění okamžiku ukončování aplikace). Také můžete použít událost closing objektu NativeWindow (ke zjištění okamžiku zavírání okna). Například následující kód jazyka JavaScript zobrazí zprávu("Goodbye."), když uživatel ukončuje aplikaci: var app = air.NativeApplication.nativeApplication; app.addEventListener(air.Event.EXITING, closeHandler); function closeHandler(event) { alert("Goodbye."); }
Avšak skripty mohou úspěšně reagovat na událost unload (odstranění z paměti) způsobenou navigací elementu frame, iframe nebo obsahu okna nejvyšší úrovně. Poznámka: Tato omezení mohou být v budoucí verzi prostředí Adobe AIR odstraněna.
Objekt Window (Okno) jazyka JavaScript Objekt okno zůstává v kontextu provádění jazyka JavaScript globálním objektem. V aplikační karanténě přidává prostředí AIR nové vlastnosti objektu Window (Okno) jazyka JavaScript, aby poskytlo přístup k vestavěným třídám prostředí AIR a důležitým objektům hostitele. Kromě toho se některé metody a vlastnosti chovají rozdílně podle toho, zda jsou nebo nejsou uvnitř aplikační karantény. Vlastnost window.runtime Vlastnost runtime umožňuje vytvářet instance a používat vestavěné třídy runtime z
prostředí aplikační karantény. Tyto třídy zahrnují rozhraní API prostředí AIR a programu Flash Player (ale nikoli například rámec Flex). Následující příkaz například vytvoří objekt souboru prostředí AIR:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 219 Prostředí HTML
var preferencesFile = new window.runtime.flash.filesystem.File();
Soubor AIRAliases.js obsažený v sadě AIR SDK zahrnuje definice aliasů, které umožňují zkrátit takovéto odkazy. Pokud je například soubor AIRAliases.js importován na stránku, objekt File (Soubor) může být vytvořen pomocí následujícího příkazu: var preferencesFile = new air.File();
Vlastnost window.runtime je definována pouze pro obsah v aplikační karanténě a pouze pro nadřazený dokument stránky s elementy frame a iframe. Viz část „Použití souboru AIRAliases.js“ na stránce 232. Vlastnost Window.nativeWindow Vlastnost nativeWindow poskytuje odkaz na základní objekt nativního okna. Pomocí této vlastnosti můžete vytvořit skript funkcí okna a vlastností, jako je poloha, velikost a viditelnost obrazovky, a zpracovávat události okna, například zavření, změnu velikosti a přesunutí. Například následující příkaz slouží k zavření okna: window.nativeWindow.close();
Poznámka: Funkce ovládání okna zajištěné objektem NativeWindow překryje funkce dodané objektem Window (Okno) jazyka JavaScript. V takových případech můžete použít metodu, která se jeví jako nejvhodnější. Vlastnost window.nativeWindow je definována pouze pro obsah v aplikační karanténě a pouze pro nadřazený dokument stránky s elementy frame a iframe. Vlastnost Window.htmlLoader Vlastnost HTMLLoader poskytuje odkaz na objekt HTMLLoader prostředí AIR, v němž
se nachází obsah HTML. Pomocí této vlastnosti můžete vytvářet skripty vzhledu a chování prostředí HTML. Například vlastnost htmlLoader.paintsDefaultBackground můžete použít k určení, zda bude ovládací prvek malovat výchozí bílé pozadí: window.htmlLoader.paintsDefaultBackground = false;
Poznámka: Objekt HTMLLoader sám o sobě má vlastnost window (okno), která odkazuje na objekt Window (Okno) jazyka JavaScript obsahu HTML, který zahrnuje. Tuto vlastnost můžete použít pro přístup k prostředí jazyka JavaScript prostřednictvím odkazu na nadřazený objekt HTMLLoader. Vlastnost window.htmlLoader je definována pouze pro obsah v aplikační karanténě a pouze pro nadřazený dokument stránky s elementy frame a iframe. Vlastnosti Window.parentSandboxBridge a Window.childSandboxBridge Vlastnosti parentSandboxBridge a childSandboxBridge umožňují definovat rozhraní mezi nadřazeným a podřízeným elementem frame. Další
informace naleznete v části „Vytváření křížových skriptů pro obsah v různých karanténách zabezpečení“ na stránce 240. Funkce Window.setTimeout() a Window.setInterval() Prostředí AIR uplatňuje bezpečnostní omezení pro používání
funkcí setTimeout() a setInterval() v rámci aplikační karantény. Kód, který má být spuštěn, nelze při vyvolání funkce setTimeout() nebo setInterval() definovat jako řetězec. Je nutné použít odkaz funkce. Další informace naleznete v části „setTimeout() a setInterval()“ na stránce 230. Funkce Window.open() Pokud je metoda open() vyvolána kódem spuštěným v neaplikační karanténě, otevře okno
pouze je-li vyvolána v důsledku interakce uživatele (například klepnutí myší nebo stisknutí klávesy). Nadpis okna obsahuje předponu názvu aplikace (aby nedošlo k otevření oken vzdáleným obsahem z oken zosobnění otevřených pomocí aplikace). Další informace naleznete v části „Omezení pro volání metody JavaScript window.open()“ na stránce 34.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 220 Prostředí HTML
Objekt air.NativeApplication Objekt NativeApplication poskytuje informace o stavu aplikace, odesílá některé důležité události na úrovni aplikace a nabízí užitečné funkce pro ovládání chování aplikace. Jednotlivá instance objektu NativeApplication je vytvořena automaticky a lze k ní získat přístup prostřednictvím vlastnosti NativeApplication.nativeApplication definované pomocí třídy. Pro přístup k objektu z kódu jazyka JavaScript můžete použít: var app = window.runtime.flash.desktop.NativeApplication.nativeApplication;
Nebo, pokud byl importován skript AIRAliases.js, můžete použít kratší tvar: var app = air.NativeApplication.nativeApplication;
Objekt NativeApplication je přístupný pouze zevnitř aplikační karantény. Interakce s operačním systémem „Práce s runtime a informacemi operačního systému“ na stránce 290 podrobně popisuje objekt NativeApplication.
Schéma adresy URL v jazyce JavaScript Spouštění kódu definovaného ve schématu adresy URL jazyka JavaScript (jako v případě href="javascript:alert('Test')") je blokováno uvnitř aplikační karantény. Nedošlo k žádné chybě.
Rozšíření pro jazyk HTML Prostředí AIR a modul WebKit definují několik nestandardních elementů a atributů HTML, mimo jiné: „Elementy HTML frame a iframe“ na stránce 220 „Element Canvas (Plátno) jazyka HTML“ na stránce 222 „Manipulační programy událostí elementů HTML“ na stránce 222
Elementy HTML frame a iframe Prostředí AIR přidává nové atributy elementům frame a iframe obsahu v aplikační karanténě: Atribut sandboxRoot Atribut sandboxRoot určuje alternativní doménu (nikoli doménu aplikace) původu souboru určeného atributem src elementu frame. Soubor je načten do neaplikační karantény odpovídající určené doméně. Obsah v souboru a obsah načtený z určené domény mohou vzájemně vytvářet křížové skripty.
Důležité: Pokud nastavíte hodnotu atributu sandboxRoot na základní adresu URL domény, všechny požadavky na obsah z této domény budou načteny z adresáře aplikace a nikoli ze vzdáleného serveru (ať již je požadavek výsledkem navigace stránky, objektu XMLHttpRequest, nebo jakéhokoli jiného prostředku pro načtení obsahu). Atribut documentRoot Atribut documentRoot určuje místní adresář, z něhož mají být načteny adresy URL, které
budou přeloženy na soubory v umístění určeném atributem sandboxRoot. Při překladu adres URL, buď v atributu src elementu frame, nebo v obsahu načteném do elementu frame, je část adresy URL odpovídající hodnotě určené v atributu sandboxRoot nahrazena hodnotou určenou v atributu documentRoot. Tímto způsobem v následujícím tagu rámce: <iframe src="http://www.example.com/air/child.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/air/"/>
je soubor child.html načten z podadresáře sandbox instalační složky aplikace. Relativní adresy URL v souboru child.html jsou přeloženy podle adresáře sandbox. Povšimněte si, že žádné soubory na vzdáleném serveru na adrese www.example.com/air nejsou dostupné v rámci, protože pak by se prostředí AIR pokusilo je načíst z adresáře app:/sandbox/.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 221 Prostředí HTML
Atribut allowCrossDomainXHR Zahrnete-li řetězec allowCrossDomainXHR="allowCrossDomainXHR" do počátečního tagu, povolíte, aby obsah v rámci odeslal požadavky XMLHttpRequest na libovolnou vzdálenou doménu. Ve výchozím nastavení může obsah mimo aplikaci vytvářet takové požadavky pouze na svou vlastní doménu původu. S požadavky XHR mezi doménami souvisejí vážné bezpečnostní aspekty. Kód na stránce je schopen vyměňovat si data s libovolnou doménou. Pokud je na stránku nějakým způsobem vložen nebezpečný obsah, bezpečnost veškerých dat dostupných pro kód v aktuální karanténě může být ohrožena. Povolte pouze požadavky XHR mezi doménami, které vytváříte a ovládáte, a pouze pokud je načítání dat mezi doménami skutečně nezbytné. Rovněž pečlivě ověřujte platnost všech dat načítaných stránkou, abyste zabránili vkládání kódů a jiným formám útoků.
Důležité: Jestliže je atribut allowCrossDomainXHR obsažen v elementu frame nebo iframe, požadavky XHR mezi doménami jsou povoleny (pokud přiřazená hodnota není „0“ nebo nezačíná písmenem „f“ nebo „n“). Nastavíte-li například atribut allowCrossDomainXHR na hodnotu "deny", požadavky XHR mezi doménami budou přesto povoleny. Nechcete-li povolit požadavky mezi doménami, ponechte atribut zcela mimo deklaraci elementu. Atribut ondominitialize Určuje manipulační program události pro událost dominitialize rámce. Tato událost je
specifická pro prostředí AIR a spouští se poté, co byly vytvořeny objekty okno a dokument rámce, ale před tím, než byly analyzovány jakékoli skripty byly vytvořeny elementy Dokument. Rámec odešle událost dominitialize dostatečně brzy v sekvenci načítání, aby mohl libovolný skript na podřízené stránce odkazovat na objekty, proměnné a funkce přidané do podřízeného dokumentu manipulačním programem události dominitialize. Nadřízená stránka se musí nacházet ve stejné karanténě jako podřízená stránka, aby bylo možné přímo přidat nebo získat přístup k libovolným objektům v podřízeném dokumentu. Avšak nadřazený prvek v aplikační karanténě může vytvořit most karantény pro komunikaci s obsahem v neaplikační karanténě. Následující příklady ilustrují použití tagu iframe v prostředí AIR: Umístěte soubor child.html do vzdálené karantény bez mapování do skutečné domény na vzdáleném serveru: <iframe src="http://localhost/air/child.html" documentRoot="app:/sandbox/" sandboxRoot="http://localhost/air/"/>
Umístěte soubor child.html do vzdálené karantény a povolte požadavky XMLHttpRequest pouze na server www.example.com: <iframe src="http://www.example.com/air/child.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/air/"/>
Umístěte soubor child.html do vzdálené karantény a povolte požadavky XMLHttpRequest na libovolnou vzdálenou doménu: <iframe src="http://www.example.com/air/child.html" documentRoot="app:/sandbox/" sandboxRoot="http://www.example.com/air/" allowCrossDomainXHR="allowCrossDomainXHR"/>
Umístěte soubor child.html do karantény místního vzhledem k systému souborů: <iframe
Následující dokument child.html ilustruje způsob, jakým může podřízený obsah získat přístup k nadřazenému mostu karantény: <script> document.write(window.parentSandboxBridge.testProperty);
Další informace naleznete v části „Vytváření křížových skriptů pro obsah v různých karanténách zabezpečení“ na stránce 240 a „Zabezpečení HTML“ na stránce 29.
Element Canvas (Plátno) jazyka HTML Definuje kreslicí oblast, kterou lze použít s rozhraním API Canvas (Plátno) modulu Webkit. Příkazy grafiky nemohou být určeny v samotném tagu. Chcete-li kreslit na plátno, vyvolejte metody kreslení na plátno prostřednictvím jazyka JavaScript.
Další informace naleznete v části „Objekt Canvas (Plátno)“ na stránce 215.
Manipulační programy událostí elementů HTML Objekty DOM v prostředí AIR a v modulu Webkit odesílají některé události, které se nenacházejí ve standardním modelu události DOM. V následující tabulce jsou uvedeny související atributy událostí, které můžete použít k určení manipulačních programů pro tyto události:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 223 Prostředí HTML
Název atributu zpětného vyvolání
Popis
oncontextmenu
Vyvolá se po otevření kontextové nabídky, například klepnutím pravým tlačítkem myši nebo klepnutím na vybraný text se stisknutou klávesou Apple.
oncopy
Vyvolá se po zkopírování výběru v elementu.
oncut
Vyvolá se po vyjmutí výběru v elementu.
ondominitialize
Vyvolá se po vytvoření modelu DOM dokumentu načteného do elementu frame nebo iframe, ale předtím, než jsou vytvořeny jakékoli elementy DOM nebo analyzovány skripty.
ondrag
Vyvolá se při přetažení elementu.
ondragend
Vyvolá se po uvolnění při přetažení.
ondragenter
Vyvolá se, když gesto přetažení vstupuje do ohraničení elementu.
ondragleave
Vyvolá se, když gesto přetažení opouští ohraničení elementu.
ondragover
Vyvolává se neustále po dobu, kdy se gesto přetažení nachází uvnitř ohraničení elementu.
ondragstart
Vyvolá se po zahájení gesta přetažení.
ondrop
Vyvolá se, když je gesto přetažení uvolněno na elementu.
onerror
Vyvolá se, pokud během načítání elementu dojde k chybě.
oninput
Vyvolá se po zadání textu do elementu formuláře.
onpaste
Vyvolá se po vložení položky do elementu.
onscroll
Vyvolá se, pokud je posouván element s možností posuvu.
onsearch
Vyvolá se při kopírování elementu. (Jsou dokumenty Apple správné?)
onselectstart
Vyvolá se po zahájení výběru.
Atribut contentEditable jazyka HTML Atribut contentEditable můžete přidat ke kterémukoli elementu HTML, chcete-li uživatelům povolit úpravy jeho obsahu. Například následující kód HTML nastavuje celý dokument jako upravitelný s výjimkou prvního elementu p:
de Finibus Bonorum et Malorum
Sed ut perspiciatis unde omnis iste natus error.
At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis.
Poznámka: Nastavíte-li vlastnost document.designMode na hodnotu on, všechny elementy v dokumentu budou upravitelné bez ohledu na nastavení atributu contentEditable pro jednotlivé elementy. Avšak nastavením vlastnosti designMode na hodnotu off nezakážete úpravy elementů, pro které má vlastnost contentEditable hodnotu true. Další informace naleznete v části „Vlastnost Document.designMode“ na stránce 218.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 224 Prostředí HTML
Rozšíření pro jazyk CSS Modul WebKit podporuje několik rozšířených vlastností CSS. V následující tabulce jsou uvedeny vlastnosti, pro které je zajištěna podpora. V modulu WebKit jsou k dispozici nestandardní vlastnosti, ty ale nejsou plně podporovány v prostředí AIR, buď proto, že jsou v modulu WebKit dosud ve vývoji, nebo protože se jedná o pokusné funkce, které mohou být v budoucnosti odebrány. Název vlastnosti CSS
Hodnoty
Popis
-webkit-border-horizontal-spacing
Nezáporná délková jednotka
Určuje vodorovnou komponentu okraje u ohraničení.
-webkit-border-vertical-spacing
Nezáporná délková jednotka
Určuje svislou komponentu okraje u ohraničení.
-webkit-line-break
after-white-space, normal
Určuje pravidlo zalomení řádku pro čínský, japonský a korejský text (CJK).
-webkit-margin-bottom-collapse
collapse, discard, separate
Určuje způsob sbalení spodního okraje tabulky.
-webkit-margin-collapse
collapse, discard, separate
Určuje způsob sbalení horního a spodního okraje buňky v tabulce.
-webkit-margin-start
Libovolná délková jednotka
Šířka počátečního okraje. U textu psaného zleva doprava tato vlastnost potlačí levý okraj. U textu psaného zprava doleva tato vlastnost potlačí pravý okraj.
-webkit-margin-top-collapse
collapse, discard, separate
Určuje způsob sbalení horního okraje buňky v tabulce.
-webkit-nbsp-mode
normal, space
Určuje chování pevných mezer v uzavřeném obsahu.
-webkit-padding-start
Libovolná délková jednotka
Určuje šířku počátečního odsazení. U textu psaného zleva doprava tato vlastnost potlačí hodnotu levého odsazení. U textu psaného zprava doleva tato vlastnost potlačí hodnotu pravého odsazení.
-webkit-rtl-ordering
logical, visual
Potlačí výchozí zpracování smíšených textů psaných zleva doprava a zprava doleva.
-webkit-text-fill-color
Jakákoli pojmenovaná nebo číselná hodnota barvy
Určuje barvu výplně textu.
-webkit-text-security
circle, disc, none, square
Určuje náhradní tvar, který se použije v poli pro zadání hesla.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 225 Prostředí HTML
Název vlastnosti CSS
Hodnoty
Popis
-webkit-user-drag
•
auto – Výchozí chování
Potlačí chování při automatickém přetažení.
•
element – Celý element je přetažen
•
none – Element nelze přetáhnout
-webkit-user-modify
read-only, read-write, read-writeplaintext-only
Určuje, zda může být obsah elementu upravován.
-webkit-user-select
•
auto – Výchozí chování
Určuje, zda může uživatel vybrat obsah elementu.
•
none – Element nelze vybrat
•
text – V elementu může být vybrán pouze text
Další informace naleznete v příručce společnosti Apple k jazyku CSS v prohlížeči Safari (http://developer.apple.com/documentation/AppleApplications/Reference/SafariCSSRef/).
226
Kapitola 21: Programování v jazycích HTML a JavaScript Některá témata programování jsou jedinečná pro vývoj aplikací Adobe® AIR™ pomocí jazyků HTML a JavaScript. Následující informace jsou důležité bez ohledu na to, zda programujete aplikaci AIR založenou na HTML nebo aplikaci AIR založenou na SWF, která spouští HTML a JavaScript pomocí třídy HTMLLoader (nebo komponenty mx:HTML Flex™).
Popis třídy HTMLLoader Třída HTMLLoader aplikace Adobe AIR definuje objekty zobrazení, které mohou v aplikaci AIR zobrazit obsah HTML. Aplikace založené na SWF mohou přidat ovladač HTMLLoader do existujícího okna nebo vytvořit okno HTML, které bude automaticky obsahovat objekt HTMLLoader, pomocí metody HTMLLoader.createRootWindow(). K objektu HTMLLoader lze získat přístup prostřednictvím vlastnosti jazyka JavaScript window.htmlLoader z načtené stránky HTML.
Načtení obsahu HTML z URL Následující kód načítá URL do objektu HTMLLoader (přidává objekt HTMLLoader jako podřízený objekt vymezené plochy nebo jiného kontejneru objektu zobrazení k zobrazení obsahu HTML v aplikaci): import flash.html.HTMLLoader; var html:HTMLLoader = new HTMLLoader; html.width = 400; html.height = 600; var urlReq:URLRequest = new URLRequest("http://www.adobe.com/"); html.load(urlReq);
Vlastnosti width a height objektu HTMLLoader jsou standardně nastaveny na hodnotu 0. Tyto rozměry je vhodné nastavit při přidávání objektu HTMLLoader na plochu. Objekt HTMLLoader odešle při načítání stránky několik událostí. Pomocí těchto událostí lze určit, kdy lze s načtenou stránkou bezpečně interaktivně pracovat. Tyto události jsou popsány v sekci „Zpracování událostí týkajících se HTML“ na stránce 245. Text HTML lze rovněž vykreslit pomocí třídy TextField, ale její možnosti jsou omezené. Třída TextField aplikace Adobe® Flash® Player podporuje podmnožinu značek HTML, její možnosti jsou však omezené z důvodu omezení velikosti. (Třída HTMLLoader obsažená v aplikaci Adobe AIR není v aplikaci Flash Player k dispozici.)
Načtení obsahu HTML z řetězce Metoda loadString() objektu HTMLLoader načte řetězec obsahu HTML do objektu HTMLLoader: var html:HTMLLoader = new HTMLLoader(); var htmlStr:String = "Hello world."; html.loadString(htmlStr);
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 227 Programování v jazycích HTML a JavaScript
Ve výchozím nastavení je obsah načtený prostřednictvím metody loadString() umístěný do neaplikační karantény s následujícími vlastnostmi:
• Může přistupovat a načítat obsah ze sítě (ale ne ze systému souborů). • Nemuže načítat data pomocí objektu XMLHttpRequest. • Vlastnost window.location je nastavena na hodnotu "about:blank". • Obsah nemůže přistupovat k vlastnosti window.runtime (obdobně jako obsah v jakékoli neaplikační karanténě). V prostředí AIR 1.5 obsahuje třída HTMLLoader vlastnost placeLoadStringContentInApplicationSandbox. Je-li tato vlastnost pro objekt HTMLLoader nastavena na hodnotu true, je obsah načítaný prostřednictvím metody loadString() umisťovaný do karantény aplikace. (Výchozí hodnota je false.) Tato možnost dává obsahu načítanému prostřednictvím metody loadString() přístup k vlastnosti window.runtime a ke všem rozhraním API prostředí AIR. Pokud tuto vlastnost nastavíte na hodnotu true, ujistěte se, že je datový zdroj pro řetězec použitý k volání metody loadString() důvěryhodný. Když je tato vlastnost nastavena na hodnotu true, jsou všechny příkazy kódu v řetězci HTML spouštěny s plnými aplikačními oprávněními. Tuto vlastnost nastavujte na hodnotu true pouze tehdy, když víte určitě, že tento řetězec nemůže obsahovat nebezpečný kód. U aplikací kompilovaných pomocí sad SDK pro prostředí AIR 1.0 nebo AIR 1.1 je obsah načítaný prostřednictvím metody loadString() umisťovaný do karantény aplikace.
Důležitá pravidla zabezpečení při použití HTML v aplikacích AIR Soubory instalované s aplikací AIR mají přístup k rozhraním API aplikace AIR. Obsah z jiných zdrojů tento přístup z důvodu zabezpečení nemá. Kvůli tomuto omezení nemůže například obsah ze vzdálené domény (např. http://example.com) číst obsah adresáře plochy uživatele (v lepším případě). Vzhledem k tomu, že se v zabezpečení vyskytují mezery, kterých lze využít voláním funkce eval() (a souvisejících rozhraní API), obsah instalovaný s aplikací má použití těchto funkcí standardně zakázáno. Některé architektury Ajax však používají volání funkce eval() a souvisejících rozhraní API. Má-li být obsah dobře zformován, aby fungoval v aplikaci AIR, je třeba vzít v úvahu pravidla pro omezení vyplývající ze zabezpečení týkající se obsahu z jiných zdrojů. Obsah z jiných zdrojů se umístí do samostatných klasifikací zabezpečení zvaných karantény (viz sekce „Karantény zabezpečení“ na stránce 27). Obsah instalovaný s aplikací se standardně instaluje do karantény, která se nazývá aplikační karanténa, a to mu zajistí přístup k rozhraním API aplikace AIR. Aplikační karanténa je obvykle nejbezpečnější karanténa, pro niž jsou zavedena omezení zamezující provedení nedůvěryhodného kódu. Běhový modul umožňuje načtení obsahu instalovaného s aplikací do jiné karantény, než je aplikační karanténa. Obsah v neaplikačních karanténách pracuje v prostředí zabezpečení podobném běžnému webovému prohlížeči. Kód v neaplikačních karanténách například může použít metodu eval() a další související metody (ale současně nemá povolen přístup k rozhraním API aplikace AIR). Běhový modul zahrnuje postupy pro zajištění bezpečné komunikace obsahu v různých karanténách (aniž by například byla rozhraní API aplikace AIR vystavena neaplikačnímu obsahu). Podrobnosti naleznete v sekci „Vytváření křížových skriptů pro obsah v různých karanténách zabezpečení“ na stránce 240. Jestliže voláte kód, který má z bezpečnostních důvodů zakázáno používat karanténu, odešle běhový modul chybu jazyka JavaScript: „Narušení bezpečnosti běhu aplikace Adobe AIR pro kód JavaScript v karanténě zabezpečení aplikace“. Aby k této chybě nedocházelo, dodržujte postupy psaní kódu popsané v následující sekci „Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením“ na stránce 228. Další informace naleznete v sekci „Zabezpečení HTML“ na stránce 29.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 228 Programování v jazycích HTML a JavaScript
Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením Jestliže voláte kód, který má kvůli těmto omezením vyplývajícím ze zabezpečení zakázáno používat karanténu, odešle běhový modul chybu jazyka JavaScript: „Narušení bezpečnosti běhu aplikace Adobe AIR pro kód JavaScript v karanténě zabezpečení aplikace“. Aby k této chybě nedocházelo, dodržujte následující postupy psaní kódu.
Příčiny chyb jazyka JavaScript souvisejících se zabezpečením Provádění kódu v aplikační karanténě nesmí provádět většinu operací zahrnujících vyhodnocení a provádění řetězců, jakmile se spustí událost load dokumentu a ukončí se zpracování některých událostí load. Při pokusu o použití následujících příkazů jazyka JavaScript, které vyhodnocují a provádějí potenciálně nezabezpečené řetězce, vzniknou chyby jazyka JavaScript:
• funkce eval() • setTimeout() a setInterval() • Konstruktor funkce Kromě toho dojde k selhání následujících typů příkazů jazyka JavaScript, aniž by byla vygenerována chyba nebezpečného kódu JavaScript:
• javascript: URL • Zpětná volání událostí přiřazená pomocí atributů onevent v příkazech innerHTML a outerHTML • Načtení souborů JavaScript z místa mimo instalační adresář aplikace • document.write() a document.writeln() • Synchronní požadavky XMLHttpRequests před událostí load nebo během zpracování události load • Dynamicky vytvořené elementy skriptu Poznámka: V některých omezených případech je povoleno vyhodnocení řetězců. Další informace naleznete v sekci „Omezení kódu pro obsah v různých karanténách zabezpečení“ na stránce 31. Aplikace Adobe uchovává seznam architektur Ajax, o nichž je známo, že podporují karanténu zabezpečení aplikace, na adrese http://www.adobe.com/go/airappsandboxframeworks_cz. V následujících sekcích je popsáno, jakým způsobem je zapotřebí přepsat skripty, aby nedocházelo k těmto chybám nebezpečného kódu JavaScript a k tichému selhání u kódu spuštěného v aplikační karanténě.
Mapování aplikačního obsahu do jiné karantény Ve většině případů lze aplikaci přepsat nebo změnit její strukturu, aby nedocházelo k chybám jazyka JavaScript souvisejícím se zabezpečením. Když však přepsání nebo změna struktury aplikace nepřipadá v úvahu, lze načíst aplikační obsah do jiné karantény pomocí metody popsané v sekci „Načtení aplikačního obsahu do neaplikační karantény“ na stránce 241. Jestliže tento obsah potřebuje také přístup k rozhraním API aplikace AIR, lze vytvořit most karantény, jak je popsáno v sekci „Vytvoření rozhraní mostu karantény“ na stránce 242.
funkce eval() V aplikační karanténě je možné použít funkci eval() pouze před událostí load stránky nebo během zpracování události load. Jakmile bude stránka načtena, volání funkce eval() již nebude moci kód provést. Avšak v následujících případech je možné kód přepsat a tím se vyhnout použití funkce eval().
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 229 Programování v jazycích HTML a JavaScript
Přiřazení vlastností k objektu Místo analýzy řetězce za účelem vytvoření mechanismu přístupu k vlastnosti: eval("obj." + propName + " = " + val);
zajistěte přístup k vlastnostem pomocí závorkové notace: obj[propName] = val;
Vytvoření funkce s proměnnými dostupnými v kontextu Nahraďte příkazy jako je tento: function compile(var1, var2){ eval("var fn = function(){ this."+var1+"(var2) }"); return fn; }
následujícím kódem: function compile(var1, var2){ var self = this; return function(){ self[var1](var2) }; }
Vytvoření objektu za použití názvu třídy jako parametru řetězce Zvažte hypotetickou třídu JavaScript definovanou následujícím kódem: var CustomClass = { Utils: { Parser: function(){ alert('constructor') } }, Data: { } }; var constructorClassName = "CustomClass.Utils.Parser";
Nejjednodušší by bylo vytvořit instanci objektu pomocí funkce eval(): var myObj; eval('myObj=new ' + constructorClassName +'()')
Volání funkce eval() se však lze vyhnout provedením analýzy jednotlivých komponent názvu třídy a vytvořením nového objektu pomocí závorkové notace:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 230 Programování v jazycích HTML a JavaScript
function getter(str) { var obj = window; var names = str.split('.'); for(var i=0;i
Vytvořte instanci pomocí následujícího kódu: try{ var Parser = getter(constructorClassName); var a = new Parser(); }catch(e){ alert(e); }
setTimeout() a setInterval() Nahraďte řetězec předaný jako funkce zpracování odkazem na funkci nebo objektem. Například nahraďte příkaz jako je tento: setTimeout("alert('Timeout')", 10);
následujícím kódem: setTimeout(alert('Timeout'), 10);
Nebo když funkce vyžaduje, aby volající nastavil objekt this, nahraďte příkaz jako je tento: this.appTimer = setInterval("obj.customFunction();", 100);
následujícím kódem: var _self = this; this.appTimer = setInterval(function(){obj.customFunction.apply(_self);}, 100);
Konstruktor funkce Volání funkce new Function(param, body) lze nahradit deklarací vložené funkce nebo použít ještě před zpracováním události load stránky.
javascript: URL Kód definovaný v odkazu pomocí schématu URL javascript: se v karanténě aplikace ignoruje. Není vygenerována žádná chyba nebezpečného kódu JavaScript. Pomocí schémat URL javascript: lze nahradit odkazy jako je tento: Click Me
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 231 Programování v jazycích HTML a JavaScript
Zpětná volání událostí přiřazená pomocí atributů onevent v příkazech innerHTML a outerHTML Při použití příkazu innerHTML nebo outerHTML k přidání elementů do objektového modelu dokumentu (DOM) budou všechna zpětná volání událostí přiřazená uvnitř příkazu, např. onclick nebo onmouseover, ignorována. Nebude vygenerována žádná chyba zabezpečení. Místo toho lze novým elementům přiřadit atribut id a nastavit funkce zpětného volání zpracování událostí pomocí metody addEventListener(). Například existuje-li v dokumentu cílový element jako:
Nahraďte příkazy jako je tento: document.getElementById('container').innerHTML = 'Click Me.';
Načtení souborů JavaScript z místa mimo instalační adresář aplikace Načtení souborů skriptů z místa mimo aplikační karanténu není povoleno. Nebude vygenerována žádná chyba zabezpečení. Všechny soubory skriptů spuštěné v aplikační karanténě musí být instalovány v adresáři aplikace. Aby bylo možné použít na stránce externí skripty, je třeba stránku mapovat do jiné karantény. Viz sekce „Načtení aplikačního obsahu do neaplikační karantény“ na stránce 241.
document.write() a document.writeln() Po zpracování události load stránky se volání metody document.write() nebo document.writeln() ignorují. Nebude vygenerována žádná chyba zabezpečení. Případně je možné načíst nový soubor nebo nahradit tělo dokumentu pomocí technik zpracování DOM.
Synchronní požadavky XMLHttpRequests před událostí load nebo během zpracování události load Synchronní požadavky XMLHttpRequests spuštěné před událostí load stránky nebo během zpracování události load stránky nevrátí žádný obsah. Asynchronní požadavky XMLHttpRequests lze spustit, nevrátí se však dříve, než skončí událost load. Po zpracování události load se již synchronní požadavky XMLHttpRequests chovají normálně.
Dynamicky vytvořené elementy skriptu Dynamicky vytvořené elementy skriptu, například při vytvoření pomocí příkazu innerHTML nebo metody document.createElement(), jsou ignorovány.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 232 Programování v jazycích HTML a JavaScript
Přístup ke třídám API aplikace AIR z jazyka JavaScript Kromě standardních a rozšířených elementů architektury Webkit má kód HTML a JavaScript přístup také k hostitelským třídám, které poskytuje běhový modul. Tyto třídy umožňují přístup k pokročilým funkcím, které jsou k dispozici v aplikaci AIR, k nimž patří:
• Přístup k systému souborů • Použití lokálních databází SQL • Řízení nabídek aplikace a okna • Přístup k socketům pro práci v síti • Použití vlastních tříd a objektů • Možnosti zvuku Rozhraní API souboru AIR například zahrnuje třídu File obsaženou v balíčku flash.filesystem. V jazyce JavaScript lze vytvořit objekt File následujícím způsobem: var myFile = new window.runtime.flash.filesystem.File();
Objekt runtime je speciální objekt jazyka JavaScript, který je k dispozici pro obsah HTML spuštěný v aplikační karanténě aplikace AIR. Umožňuje přístup ke třídám runtime z jazyka JavaScript. Vlastnost flash objektu runtime poskytuje přístup k balíčku flash. Vlastnost flash.filesystem objektu runtime zase poskytuje přístup k balíčku flash.filesystem (a tento balíček zahrnuje třídu File). Balíčky představují způsob uspořádání tříd použitých v jazyce ActionScript. Poznámka: Vlastnost runtime se nepřidává automaticky k objektům oken stránek načtených do elementu frame nebo iframe. Dokud je však podřízený dokument v aplikační karanténě, má přístup k vlastnosti runtime nadřazeného dokumentu. Vhledem k tomu, že struktura balíčku tříd runtime by vyžadovala, aby vývojáři zadávali dlouhé řetězce kódu JavaScript za účelem získání přístupu k jednotlivým třídám (jako v příkazu window.runtime.flash.desktop.NativeApplication), obsahuje sada SDK aplikace AIR soubor AIRAliases.js, který umožňuje mnohem snazší přístup k třídám runtime (například jednoduchým zadáním air.NativeApplication). Třídy API aplikace AIR jsou projednávány v celé této příručce. Ostatní třídy API aplikace Flash Player, které mohou být pro vývojáře HTML důležité, jsou popsány v Referenční příručce jazyka Adobe AIR pro vývojáře HTML. ActionScript je jazyk používaný v obsahu SWF (Flash Player). Syntaxe jazyků JavaScript a ActionScript je však podobná. (Oba jsou založeny na verzích jazyka ECMAScript.) Všechny vestavěné třídy jsou k dispozici v obou jazycích, JavaScript (obsah HTML) i ActionScript (obsah SWF). Poznámka: Kód JavaScript nemůže používat třídy Dictionary, XML a XMLList, které jsou k dispozici v jazyce ActionScript.
Použití souboru AIRAliases.js Třídy runtime jsou uspořádány do struktury balíčku, jako zde:
•
window.runtime.flash.desktop.NativeApplication
•
window.runtime.flash.desktop.ClipboardManager
•
window.runtime.flash.filesystem.FileStream
•
window.runtime.flash.data.SQLDatabase
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 233 Programování v jazycích HTML a JavaScript
Sada SDK aplikace AIR obsahuje soubor AIRAliases.js, který poskytuje definice „alias“ umožňující přístup ke třídám runtime bez psaní složitých příkazů. K výše uvedeným třídám lze například získat přístup jednoduchým zadáním:
•
air.NativeApplication
•
air.Clipboard
•
air.FileStream
•
air.SQLDatabase
Tento seznam je jen malou podmnožinou tříd v souboru AIRAliases.js. Kompletní seznam tříd a funkcí na úrovni balíčku naleznete v Referenční příručce jazyka Adobe AIR pro vývojáře HTML. Kromě běžně používaných tříd runtime obsahuje soubor AIRAliases.js také alias pro běžně používané funkce na úrovni balíčku: window.runtime.trace(), window.runtime.flash.net.navigateToURL() a window.runtime.flash.net.sendToURL(), jež mají alias air.trace(), air.navigateToURL() a air.sendToURL(). Chcete-li použít soubor AIRAliases.js, začleňte do stránky HTML následující odkaz script: <script src="AIRAliases.js">
Podle potřeby upravte cestu v odkazu src. Důležité: Není-li uvedeno jinak, vzorový kód JavaScript v této dokumentaci předpokládá, že byl do stránky HTML začleněn soubor AIRAliases.js.
Popis URL v aplikaci AIR V obsahu HTML spuštěném v aplikaci AIR lze použít kterékoliv z následujících schémat URL při definování atributů src pro tagy img, frame, iframe a script, v atributu href tagu link či kdekoliv jinde, kde lze poskytnout URL. Schéma URL
Popis
Příklad
file
Cesta vztahující se ke kořenu systému souborů.
file:///c:/AIR Test/test.txt
app
Cesta vztahující se ke kořenovému adresáři instalované aplikace.
app:/images
app-storage
Cesta vztahující se k odkládacímu adresáři aplikace. Aplikace AIR definuje pro každou instalovanou aplikaci jedinečný odkládací adresář aplikace, který je užitečný při ukládání dat specifických pro danou aplikaci.
app-storage:/settings/prefs.xml
http
Standardní požadavek HTTP.
http://www.adobe.com
https
Standardní požadavek HTTPS.
https://secure.example.com
Další informace týkající se použití schémat URL v aplikaci AIR naleznete v sekci „Používání schémat URL AIR v adresách URL“ na stránce 296. Řada rozhraní API aplikace AIR, včetně tříd File, Loader, URLStream a Sound, používá objekt URLRequest místo řetězce obsahujícího URL. Samotný objekt URLRequest se inicializuje řetězcem, který může používat kterékoliv ze stejných schémat URL. Následující příkaz například vytvoří objekt URLRequest, který lze použít v požadavku na domovskou stránku společnosti Adobe: var urlReq = new air.URLRequest("http://www.adobe.com/");
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 234 Programování v jazycích HTML a JavaScript
Informace o objektech URLRequest naleznete v sekci „Požadavky URL a práce v síti“ na stránce 295.
Zpřístupňování objektů ActionScript pro JavaScript JavaScript na stránce HTML načtené pomocí objektu HTMLLoader může volat třídy, objekty a funkce definované v kontextu provádění jazyka ActionScript pomocí vlastností window.runtime, window.htmlLoader a window.nativeWindow stránky HTML. Objekty a funkce jazyka ActionScript lze rovněž zpřístupnit pro jazyk JavaScript vytvořením odkazů na ně v kontextu provádění jazyka JavaScript.
Jednoduchý příklad přístupu k objektům JavaScript z jazyka ActionScript Následující příklad ilustruje, jakým způsobem lze do globálního objektu window stránky HTML přidat vlastnosti odkazující na objekty ActionScript: var html:HTMLLoader = new HTMLLoader(); var foo:String = "Hello from container SWF." function helloFromJS(message:String):void { trace("JavaScript says:", message); } var urlReq:URLRequest = new URLRequest("test.html"); html.addEventListener(Event.COMPLETE, loaded); html.load(urlReq); function loaded(e:Event):void{ html.window.foo = foo; html.window.helloFromJS = helloFromJS; }
Obsah HTML (v souboru s názvem test.html) načtený do objektu HTMLLoader v předchozím příkladu má přístup k vlastnosti foo a k metodě helloFromJS() definované v nadřazeném souboru SWF: <script> function alertFoo() { alert(foo); }
Při přistupování ke kontextu jazyka JavaScript načítaného dokumentu lze pomocí události htmlDOMInitialize vytvářet objekty v sekvenci tvorby stránky dostatečně brzy, aby k nim měly přístup všechny skripty definované na stránce. Jestliže budete čekat až na událost complete, budou mít k přidaným objektům přístup jen ty skripty na stránce, které se spustí až po události load stránky.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 235 Programování v jazycích HTML a JavaScript
Zpřístupňování definic tříd pro JavaScript Pokud chcete, aby třídy ActionScript vlastní aplikace byly přístupné pro jazyk JavaScript, můžete načtený obsah HTML přiřadit k aplikační doméně obsahující definice tříd. Aplikační doménu kontextu provádění jazyka JavaScript lze nastavit pomocí vlastnosti runtimeApplicationDomain objektu HTMLLoader. Chcete-li aplikační doménu například nastavit na primární aplikační doménu, nastavte vlastnost runtimeApplicationDomain na ApplicationDomain.currentDomain, jak je znázorněno v následujícím kódu: html.runtimeApplicationDomain = ApplicationDomain.currentDomain;
Po nastavení vlastnosti runtimeApplicationDomain bude kontext jazyka JavaScript sdílet definice tříd s přiřazenou doménou. Jestliže chcete v jazyce JavaScript vytvořit instanci vlastní třídy, vytvořte odkaz na definici třídy pomocí vlastnosti window.runtime a použijte operátor new: var customClassObject = new window.runtime.CustomClass();
Obsah HTML musí pocházet z kompatibilní domény zabezpečení. Bude-li obsah HTML z jiné domény zabezpečení, než je přiřazená aplikační doména, stránka místo ní použije výchozí aplikační doménu. Například při načtení vzdálené stránky z Internetu nelze přiřadit ApplicationDomain.currentDomain jako aplikační doménu stránky.
Odstranění posluchačů událostí Když přidáte posluchače událostí JavaScript do objektů mimo aktuální stránku, včetně objektů runtime, objektů v načteném obsahu SWF nebo i objektů JavaScript spuštěných v jiných stránkách, je vhodné po zrušení zavedení stránky tyto posluchače událostí vždy odstranit. V opačném případě bude posluchač událostí odesílat událost do funkce zpracování, která již neexistuje. Pokud k tomu dojde, zobrazí se následující chybová zpráva: „Aplikace se pokusila vytvořit odkaz na objekt JavaScript na stránce HTML, která již neexistuje“. Po odstranění nepotřebných posluchačů událostí může aplikace AIR rovněž znovu získat s tím související paměť. Další informace naleznete v sekci „Odstranění posluchačů událostí ve stránkách HTML, které navigují“ na stránce 249.
Přístup k objektovému modelu dokumentu HTML a objektům JavaScript z jazyka ActionScript Jakmile objekt HTMLLoader odešle událost complete, lze přistupovat ke všem objektům v objektovém modelu dokumentu (DOM) HTML pro danou stránku. K přístupným objektům patří elementy zobrazení (např. objekty div a p ve stránce), jakož i proměnné a funkce jazyka JavaScript. Událost complete odpovídá události load stránky jazyka JavaScript. Dokud nebude odeslána událost complete, nemusí být elementy DOM, proměnné a funkce analyzovány či vytvořeny. Pokud je to možné, počkejte na událost complete a teprve potom přistupujte k DOM HTML. Zvažte například následující stránku HTML: <script> foo = 333; function test() { return "OK."; }
Hi.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 236 Programování v jazycích HTML a JavaScript
Tato jednoduchá stránka HTML definuje proměnnou jazyka JavaScript s názvem foo a funkci jazyka JavaScript s názvem test(). Obě jsou vlastnostmi globálního objektu window této stránky. Kromě toho objekt window.document zahrnuje element s názvem P (s ID p1), k němuž lze získat přístup pomocí metody getElementById(). Po načtení stránky (jakmile objekt HTMLLoader odešle událost complete) lze ke každému z těchto objektů přistoupit z jazyka ActionScript, jak znázorňuje následující kód ActionScript: var html:HTMLLoader = new HTMLLoader(); html.width = 300; html.height = 300; html.addEventListener(Event.COMPLETE, completeHandler); var xhtml:XML = <script> foo = 333; function test() { return "OK."; }
Hi.
; html.loadString(xhtml.toString()); function completeHandler(e:Event):void { trace(html.window.foo); // 333 trace(html.window.document.getElementById("p1").innerHTML); // Hi. trace(html.window.test()); // OK. }
Chcete-li získat přístup k obsahu elementu HTML, použijte vlastnost innerHTML. Předchozí kód například používá příkaz html.window.document.getElementById("p1").innerHTML k získání obsahu elementu HTML s názvem p1. Z jazyka ActionScript je rovněž možné nastavit vlastnosti stránky HTML. Následující příklad například nastavuje obsah elementu p1 a hodnotu proměnné jazyka JavaScript foo na stránce pomocí odkazu na objekt HTMLLoader, který ji obsahuje: html.window.document.getElementById("p1").innerHTML = "Goodbye"; html.window.foo = 66;
Vložení obsahu SWF do HTML Obsah SWF lze v aplikaci AIR vložit do obsahu HTML stejným způsobem jako v prohlížeči. K vložení obsahu SWF použijte tag object, tag embed nebo oba dva. Poznámka: Při vývoji webu se obvykle používají oba tagy object i embed k zobrazení obsahu SWF na stránce HTML. V aplikaci AIR nemá tato metoda žádný význam. V obsahu, který má být zobrazen v aplikaci AIR, lze použít samotný tag object standardní pro W3C. Současně je možné dále používat tagy object a embed společně, pokud je to zapotřebí, pro obsah HTML, který se má rovněž zobrazovat v prohlížeči. Následující příklad ilustruje zobrazení souboru SWF v obsahu HTML pomocí tagu object HTML. Soubor SWF se načte z adresáře aplikace, lze však použít libovolné schéma URL podporované aplikací AIR. (Místo, odkud se načte soubor SWF, určí karanténu zabezpečení, do níž aplikace AIR vloží obsah.)
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 237 Programování v jazycích HTML a JavaScript
Obsah je rovněž možné načíst dynamicky pomocí skriptu. Následující příklad vytvoří uzel object k zobrazení souboru SWF určeného v parametru urlString. Uzel se přidá jako podřízený element stránky s ID určeným parametrem elementID: <script> function showSWF(urlString, elementID){ var displayContainer = document.getElementById(elementID); displayContainer.appendChild(createSWFObject(urlString,650,650)); } function createSWFObject(urlString, width, height){ var SWFObject = document.createElement("object"); SWFObject.setAttribute("type","application/x-shockwave-flash"); SWFObject.setAttribute("width","100%"); SWFObject.setAttribute("height","100%"); var movieParam = document.createElement("param"); movieParam.setAttribute("name","movie"); movieParam.setAttribute("value",urlString); SWFObject.appendChild(movieParam); return SWFObject; }
Použití knihoven jazyka ActionScript na stránce HTML Aplikace AIR rozšiřuje element script HTML, aby stránka mohla importovat třídy ActionScript do zkompilovaného souboru SWF. Chcete-li například importovat knihovnu s názvem myClasses.swf umístěnou v podadresáři lib kořenové složky aplikace, vložte do souboru HTML následující tag script: <script src="lib/myClasses.swf" type="application/x-shockwave-flash">
Důležité: Atribut type musí být type="application/x-shockwave-flash", aby byla knihovna správně načtena. Pokud je obsah SWF kompilovaný jako formát SWF verzí Flash Player 10 nebo AIR 1.5, musíte nastavit jmenný prostor XML souboru deskriptoru aplikace na jmenný prostor AIR 1.5. Další informace viz „Definování vlastností v souboru deskriptoru aplikace“ na stránce 44. Při balení souboru AIR je rovněž potřeba zahrnout adresář lib a soubor myClasses.swf. K importovaným třídám získáte přístup pomocí vlastnosti runtime objektu Window jazyka JavaScript: var libraryObject = new window.runtime.LibraryClass();
Jsou-li třídy v souboru SWF uspořádány do balíčků, je třeba zahrnout také název balíčku. Kdyby například byla definice LibraryClass umístěna v balíčku s názvem utilities, bylo by zapotřebí vytvořit instanci této třídy pomocí následujícího příkazu: var libraryObject = new window.runtime.utilities.LibraryClass();
Poznámka: Ke kompilaci knihovny ActionScript SWF, jež má být součástí stránky HTML v aplikaci AIR, použijte kompilátor acompc. Utilita acompc je součástí sady Flex 3 SDK a je popsána v dokumentaci Flex 3 SDK.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 238 Programování v jazycích HTML a JavaScript
Přístup k DOM HTML a objektům JavaScript z importovaného souboru ActionScript Jestliže chcete k objektům na stránce HTML přistupovat z jazyka ActionScript v souboru SWF importovaného do stránky pomocí tagu <script>, předejte odkaz na objekt JavaScript, např. window nebo document, do funkce definované v kódu ActionScript. Pomocí odkazu ve funkci získáte přístup k objektu JavaScript (nebo k jiným objektům dostupným prostřednictvím předaného odkazu). Zvažte například následující stránku HTML: <script src="ASLibrary.swf" type="application/x-shockwave-flash"> <script> num = 254; function getStatus() { return "OK."; } function runASFunction(window){ var obj = new runtime.ASClass(); obj.accessDOM(window); }
Body text.
Tato jednoduchá stránka HTML má proměnnou jazyka JavaScript s názvem num a funkci jazyka JavaScript s názvem getStatus(). Obě jsou vlastnostmi objektu window této stránky. Kromě toho objekt window.document zahrnuje element s názvem P (s ID p1). Stránka načte soubor ActionScript „ASLibrary.swf“ obsahující třídu ASClass. Třída ASClass definuje funkci s názvem accessDOM(), která jednoduše sleduje hodnoty těchto objektů JavaScript. Metoda accessDOM() bere objekt Window jazyka JavaScript jako argument. Pomocí tohoto odkazu Window má přístup k ostatním objektům na stránce, včetně proměnných, funkcí a elementů DOM, jak ilustruje následující definice: public class ASClass{ public function accessDOM(window:*):void { trace(window.num); // 254 trace(window.document.getElementById("p1").innerHTML); // Body text.. trace(window.getStatus()); // OK. } }
Z importované třídy ActionScript lze získat i nastavovat vlastnosti stránky HTML. Následující funkce například nastaví obsah elementu p1 na stránce a nastaví hodnotu proměnné foo jazyka JavaScript na stránce: public function modifyDOM(window:*):void { window.document.getElementById("p1").innerHTML = "Bye"; window.foo = 66;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 239 Programování v jazycích HTML a JavaScript
Převádění objektů Date a RegExp Oba jazyky JavaScript i ActionScript definují třídy Date a RegExp, ale objekty těchto typů se nepřevádějí automaticky mezi oběma kontexty provádění. Objekty Date a RegExp je nezbytné převést na ekvivalentní typ, než je bude možné použít k nastavení vlastností nebo parametrů funkcí v alternativním kontextu provádění. Například následující kód ActionScript převádí objekt Date jazyka JavaScript s názvem jsDate na objekt Date jazyka ActionScript: var asDate:Date = new Date(jsDate.getMilliseconds());
Následující kód ActionScript převádí objekt RegExp jazyka JavaScript s názvem jsRegExp na objekt RegExp jazyka ActionScript: var flags:String = ""; if (jsRegExp.dotAll) flags += "s"; if (jsRegExp.extended) flags += "x"; if (jsRegExp.global) flags += "g"; if (jsRegExp.ignoreCase) flags += "i"; if (jsRegExp.multiline) flags += "m"; var asRegExp:RegExp = new RegExp(jsRegExp.source, flags);
Práce se seznamem stylů HTML z jazyka ActionScript Jakmile objekt HTMLLoader odešle událost complete, lze kontrolovat a zpracovávat styly CSS na stránce. Zvažte například následující jednoduchý dokument HTML: <style> .style1A { font-family:Arial; font-size:12px } .style1B { font-family:Arial; font-size:24px } <style> .style2 { font-family:Arial; font-size:12px }
Style 1A
Style 1B
Style 2
Potom co objekt HTMLLoader načte tento obsah, můžete pracovat se styly CSS na stránce pomocí pole cssRules pole window.document.styleSheets, jak je znázorněno zde:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 240 Programování v jazycích HTML a JavaScript
var html:HTMLLoader = new HTMLLoader( ); var urlReq:URLRequest = new URLRequest("test.html"); html.load(urlReq); html.addEventListener(Event.COMPLETE, completeHandler); function completeHandler(event:Event):void { var styleSheet0:Object = html.window.document.styleSheets[0]; styleSheet0.cssRules[0].style.fontSize = "32px"; styleSheet0.cssRules[1].style.color = "#FF0000"; var styleSheet1:Object = html.window.document.styleSheets[1]; styleSheet1.cssRules[0].style.color = "blue"; styleSheet1.cssRules[0].style.font-family = "Monaco"; }
Tento kód upraví styly CSS tak, aby výsledný dokument HTML vypadal takto:
Mějte na paměti, že kód může přidat styly na stránku až poté, co objekt HTMLLoader odešle událost complete.
Vytváření křížových skriptů pro obsah v různých karanténách zabezpečení Model zabezpečení za běhu izoluje kód pocházející z různých zdrojů. Vytvořením křížových skriptů pro obsah v různých karanténách zabezpečení lze obsahu v jedné karanténě umožnit přístup k vybraným vlastnostem a metodám v jiné karanténě.
Karantény zabezpečení aplikace AIR a kód JavaScript Aplikace AIR prosazuje zásadu stejného původu, která brání kódu v jedné doméně v interakci s obsahem v jiné doméně. Všechny soubory jsou umístěny do karantény v závislosti na jejich původu. Obsah v aplikační karanténě obvykle nemůže porušit princip stejného původu a vytvořit křížové skripty pro obsah načtený z místa mimo instalační adresář aplikace. Aplikace AIR však poskytuje několik metod umožňujících vytvoření křížových skriptů pro neaplikační obsah. Jedna z těchto metod mapuje aplikační obsah do jiné karantény zabezpečení pomocí elementů frame nebo iframe. Stránky načtené z oblasti karantény aplikace se chovají, jako by byly načteny ze vzdálené domény. Například při mapování aplikačního obsahu do domény example.com může tento obsah vytvořit křížové skripty se stránkami načtenými z domény example.com. Vzhledem k tomu, že tato metoda umístí aplikační obsah do jiné karantény, nebudou se již na kód uvnitř tohoto obsahu vztahovat omezení týkající se provádění kódu ve vyhodnocených řetězcích. Pomocí této metody mapování karantény lze zmírnit tato omezení i v případě, že není zapotřebí vytvářet křížové skripty pro vzdálený obsah. Mapování obsahu tímto způsobem může být užitečné zejména při práci s jedním z mnoha rámců jazyka JavaScript nebo s existujícím kódem, který se spoléhá na vyhodnocení řetězců. Je však vhodné zvážit riziko, že při spuštění kódu mimo aplikační karanténu by mohlo dojít k vložení a provedení nedůvěryhodného kódu, a zajistit zvláštní ochranu.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 241 Programování v jazycích HTML a JavaScript
Aplikační obsah mapovaný do jiné karantény zároveň ztratí přístup k rozhraním API aplikace AIR, takže metodu mapování karantény nelze použít ke zpřístupnění funkčnosti aplikace AIR pro kód prováděný mimo aplikační karanténu. Další metoda vytváření křížových skriptů umožňuje vytvoření rozhraní zvaného most karantény mezi obsahem v neaplikační karanténě a jeho nadřazeným dokumentem v aplikační karanténě. Pomocí tohoto mostu získá podřízený obsah přístup k vlastnostem a metodám definovaným nadřazeným obsahem, nebo nadřazený obsah získá přístup k vlastnostem a metodám definovaným podřízeným obsahem, případně obojí. A konečně lze také z aplikační karantény, a případně i z jiných karantén, provést požadavek XMLHttpRequests napříč doménami. Další informace naleznete v sekcích „Elementy HTML frame a iframe“ na stránce 220, „Zabezpečení HTML“ na stránce 29 a „Objekt XMLHttpRequest“ na stránce 214.
Načtení aplikačního obsahu do neaplikační karantény Chcete-li aplikačnímu obsahu umožnit bezpečné vytváření křížových skriptů pro obsah načtený z místa mimo instalační adresář aplikace, můžete pomocí elementů frame nebo iframe načíst aplikační obsah do stejné karantény zabezpečení jako externí obsah. Jestliže není zapotřebí vytvářet křížové skripty pro vzdálený obsah, ale přesto chcete načíst stránku aplikace mimo aplikační karanténu, můžete použít stejnou metodu a jako původní doménu zadat http://localhost/ či jinou neškodnou hodnotu. Aplikace AIR přidává k elementu frame nové atributy sandboxRoot a documentRoot, pomocí nichž lze určit, zda se má aplikační soubor načtený do elementu frame mapovat do neaplikační domény. Soubory, které použijí cestu pod adresou URL sandboxRoot, se místo toho načtou z adresáře documentRoot. Z bezpečnostních důvodů se aplikační obsah načtený tímto způsobem zpracovává, jako by byl ve skutečnosti načten z adresy URL sandboxRoot. Vlastnost sandboxRoot definuje, která adresa URL se má použít pro určení karantény a domény, do níž má být umístěn obsah elementu frame. Je třeba použít schéma URL file:, http: nebo https:. Pokud určíte relativní URL, zůstane obsah v aplikační karanténě. Vlastnost documentRoot určuje, ze kterého adresáře se má načíst obsah elementu frame. Je třeba použít schéma URL file:, app: nebo app-storage:.
Následující příklad mapuje obsah instalovaný v podadresáři sandbox aplikace pro spuštění ve vzdálené karanténě a doméně www.example.com: <iframe src="http://www.example.com/local/ui.html" sandboxRoot="http://www.example.com/local/" documentRoot="app:/sandbox/">
Stránka ui.html by mohla načíst soubor javascript z lokální složky sandbox pomocí následujícího tagu script: <script src="http://www.example.com/local/ui.js">
Rovněž by mohla načíst obsah z adresáře na vzdáleném serveru pomocí tagu script, jako je například tento: <script src="http://www.example.com/remote/remote.js">
Adresa URL sandboxRoot zamaskuje jakýkoliv obsah na stejné adrese URL na vzdáleném serveru. V předchozím příkladu by nebylo možné získat přístup ke vzdálenému obsahu na adrese www.example.com/local/ (ani v žádném z jejích podadresářů), neboť aplikace AIR přemapuje požadavek na lokální adresář aplikace. Požadavky se přemapují bez ohledu na to, zda jsou odvozeny z navigace stránky, z požadavku XMLHttpRequest nebo z jiného způsobu načtení obsahu.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 242 Programování v jazycích HTML a JavaScript
Vytvoření rozhraní mostu karantény Most karantény lze použít, když obsah v aplikační karanténě musí mít přístup k vlastnostem či metodám definovaným obsahem v neaplikační karanténě nebo když neaplikační obsah musí mít přístup k vlastnostem či metodám definovaným obsahem v aplikační karanténě. K vytvoření mostu použijte vlastnosti childSandboxBridge a parentSandboxBridge objektu window libovolného podřízeného dokumentu.
Vytvoření podřízeného mostu karantény Pomocí vlastnosti childSandboxBridge může podřízený dokument zpřístupnit rozhraní pro obsah v nadřazeném dokumentu. Jestliže chcete rozhraní zpřístupnit, nastavte vlastnost childSandbox na funkci nebo objekt v podřízeném dokumentu. Potom budete mít k objektu nebo funkci přístup z obsahu v nadřazeném dokumentu. Následující příklad ilustruje, jakým způsobem může skript spuštěný v podřízeném dokumentu zpřístupnit objekt obsahující funkci a vlastnost pro nadřazený dokument: var interface = {}; interface.calculatePrice = function(){ return ".45 cents"; } interface.storeID = "abc" window.childSandboxBridge = interface;
Kdyby byl tento podřízený obsah načten do elementu iframe, který by měl přiřazeno ID „podřízený element“, bylo by možné přistoupit k rozhraní z nadřazeného obsahu čtením vlastnosti childSandboxBridge elementu frame: var childInterface = document.getElementById("child").contentWindow.childSandboxBridge; air.trace(childInterface.calculatePrice()); //traces ".45 cents" air.trace(childInterface.storeID)); //traces "abc"
Vytvoření nadřazeného mostu karantény Pomocí vlastnosti parentSandboxBridge může nadřazený dokument zpřístupnit rozhraní pro obsah v podřízeném dokumentu. Má-li být rozhraní zpřístupněno, nadřazený dokument nastaví vlastnost parentSandbox podřízeného dokumentu na funkci nebo objekt definovaný v nadřazeném dokumentu. Potom budete mít k objektu nebo funkci přístup z obsahu v podřízeném dokumentu. Následující příklad ilustruje, jakým způsobem může skript spuštěný v nadřazeném elementu frame zpřístupnit objekt obsahující funkci pro podřízený dokument: var interface = {}; interface.save = function(text){ var saveFile = air.File("app-storage:/save.txt"); //write text to file } document.getElementById("child").contentWindow.parentSandboxBridge = interface;
Pomocí tohoto rozhraní by podřízený element frame mohl uložit text do souboru s názvem save.txt, ale neměl by žádný jiný přístup k systému souborů. Podřízený obsah by mohl vyvolat funkci save následujícím způsobem: var textToSave = "A string."; window.parentSandboxBridge.save(textToSave);
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 243 Programování v jazycích HTML a JavaScript
Aplikační obsah by měl ostatním karanténám zpřístupňovat co nejužší rozhraní. Neaplikační obsah by měl být považován za přirozeně nedůvěryhodný, neboť může být vystaven náhodnému či zlovolnému vložení kódu. Je nezbytné zavést vhodnou ochranu, která zamezí zneužití rozhraní, jež se zpřístupňuje pomocí nadřazeného mostu karantény.
Přístup k nadřazenému mostu karantény během načítání stránky Aby měl skript v podřízeném dokumentu přístup k nadřazenému mostu karantény, musí být most vytvořen ještě před spuštěním skriptu. Objekty window, frame a iframe odešlou událost dominitialize, když se vytvoří nový DOM stránky, ale před tím, než se začnou analyzovat skripty nebo přidávat elementy DOM. Pomocí události dominitialize lze vytvořit most v sekvenci tvorby stránky dostatečně brzy, aby k němu měly přístup všechny skripty v podřízeném dokumentu. Následující příklad ilustruje postup při vytváření nadřazeného mostu karantény v odezvě na událost dominitialize vyvolanou z podřízeného elementu frame: <script> var bridgeInterface = {}; bridgeInterface.testProperty = "Bridge engaged"; function engageBridge(){ document.getElementById("sandbox").contentWindow.parentSandboxBridge = bridgeInterface; } <iframe id="sandbox" src="http://www.example.com/air/child.html" documentRoot="app:/" sandboxRoot="http://www.example.com/air/" ondominitialize="engageBridge()"/>
Následující dokument child.html ilustruje, jakým způsobem může podřízený obsah získat přístup k nadřazenému mostu karantény: <script> document.write(window.parentSandboxBridge.testProperty);
Chcete-li událost dominitialize poslouchat raději u podřízeného objektu window než u objektu frame, je třeba přidat posluchače do nového podřízeného objektu window vytvořeného pomocí funkce window.open(): var childWindow = window.open(); childWindow.addEventListener("dominitialize", engageBridge()); childWindow.document.location = "http://www.example.com/air/child.html";
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 244 Programování v jazycích HTML a JavaScript
V takovém případě není možné mapovat aplikační obsah do neaplikační karantény. Tato metoda je užitečná jen v případě, že se načítá child.html z místa mimo adresář aplikace. Aplikační obsah v objektu window lze stále mapovat do neaplikační karantény, ale nejprve je nutné načíst přechodnou stránku, která sama používá objekty frame k načtení podřízeného dokumentu a k jeho mapování do požadované karantény. Pokud vytvoříte okno pomocí funkce createRootWindow() třídy HTMLLoader, nebude nové okno podřízeným objektem dokumentu, z něhož byla funkce createRootWindow() zavolána. Proto nelze vytvořit most karantény z volajícího okna do neaplikačního obsahu načteného v tomto novém okně. Místo toho je zapotřebí načíst do tohoto nového okna přechodnou stránku, která sama používá objekty frame k načtení podřízeného dokumentu. Potom lze vytvořit most z nadřízeného dokumentu nového okna do podřízeného dokumentu načteného v objektu frame.
245
Kapitola 22: Zpracování událostí týkajících se HTML Systém zpracování událostí umožňuje programátorům pohodlným způsobem reagovat na vstup od uživatele a systémové události. Model událostí Adobe® AIR™ je nejen pohodlný, ale také vyhovuje normám. Model událostí s architekturou zpracování událostí založenou na specifikaci událostí objektového modelu dokumentu (DOM) 3. úrovně, odpovídající průmyslovým normám, poskytuje výkonný a přesto intuitivní nástroj zpracování událostí pro programátory.
Události HTMLLoader Objekt HTMLLoader odesílá následující události jazyka Adobe® ActionScript® 3.0: Událost
Popis
htmlDOMInitialize
Odeslaná při vytvoření dokumentu HTML, ale ještě před analýzou veškerých skriptů a před přidáním uzlů DOM na stránku.
complete
Odeslána po vytvoření DOM HTML v odpovědi na operaci načtení, ihned po události onload na stránce HTML.
htmlBoundsChanged
Odeslána při změně jedné nebo obou vlastností contentWidth a contentHeight.
locationChange
Odeslána při změně vlastnosti umístění třídy HTMLLoader.
scroll
Odeslána vždy, když modul HTML změní pozici rolování. Události rolování mohou být způsobeny navigací k odkazům kotev (odkazy #) na stránce nebo voláním metody window.scrollTo(). Také zadání textu do textového vstupu nebo textové oblasti může způsobit událost rolování.
uncaughtScriptException
Odeslána, když se vyskytne výjimka JavaScript v objektu HTMLLoader a když tato výjimka není zachycena v kódu JavaScript.
U události JavaScript můžete registrovat také funkci ActionScript (např. onClick). Podrobnosti viz „Zpracování událostí DOM pomocí jazyka ActionScript“ na stránce 245.
Zpracování událostí DOM pomocí jazyka ActionScript Můžete registrovat funkce ActionScript a použít je k reagování na kód JavaScript. Zvažte například následující obsah HTML: Click me.
Můžete registrovat funkci ActionScript jako manipulační program pro libovolnou událost na stránce. Například následující kód přidá funkci clickHandler() jako posluchač pro událost onclick na elementu testLink na stránce HTML:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 246 Zpracování událostí týkajících se HTML
var html:HTMLLoader = new HTMLLoader( ); var urlReq:URLRequest = new URLRequest("test.html"); html.load(urlReq); html.addEventListener(Event.COMPLETE, completeHandler); function completeHandler(event:Event):void { html.window.document.getElementById("testLink").onclick = clickHandler; } function clickHandler():void { trace("You clicked it!"); }
Pomocí metody addEventListener() můžete tyto události registrovat. Metodu completeHandler() v předcházejícím příkladu byste například mohli nahradit následujícím kódem: function completeHandler(event:Event):void { var testLink:Object = html.window.document.getElementById("testLink"); testLink.addEventListener("click", clickHandler); }
Když se posluchač odkazuje na určitý element DOM, je dobré s odesláním události complete před přidáním posluchačů události počkat na nadřazený objekt HTMLLoader. Stránky HTML často načítají více souborů a DOM HTML není plně vestavěný, dokud nejsou načteny a analyzovány všechny soubory. Objekt HTMLLoader odešle událost complete, jakmile jsou vytvořeny všechny elementy.
Reagování na nezachycené výjimky JavaScript Posuďte následující dokument HTML: <script> function throwError() { var x = 400 * melbaToast; } Click me.
Obsahuje funkci JavaScript, throwError(), která se odkazuje na neznámou proměnnou, melbaToast: var x = 400 * melbaToast;
Jakmile operace JavaScript narazí na neplatnou operaci, která není zachycená v kódu JavaScript se strukturou try/catch, objekt HTMLLoader obsahující tuto stránku odešle událost HTMLUncaughtScriptExceptionEvent. Můžete registrovat manipulační program pro tuto událost, jako v následujícím kódu:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 247 Zpracování událostí týkajících se HTML
var html:HTMLLoader = new HTMLLoader(); var urlReq:URLRequest = new URLRequest("test.html"); html.load(urlReq); html.width = container.width; html.height = container.height; container.addChild(html); html.addEventListener(HTMLUncaughtScriptExceptionEvent.UNCAUGHT_SCRIPT_EXCEPTION, htmlErrorHandler); function htmlErrorHandler(event:HTMLUncaughtJavaScriptExceptionEvent):void { event.preventDefault(); trace("exceptionValue:", event.exceptionValue) for (var i:int = 0; i < event.stackTrace.length; i++) { trace("sourceURL:", event.stackTrace[i].sourceURL); trace("line:", event.stackTrace[i].line); trace("function:", event.stackTrace[i].functionName); } }
V jazyku JavaScript můžete stejnou událost zpracovat pomocí vlastnosti window.htmlLoader: <script language="javascript" type="text/javascript" src="AIRAliases.js"> <script> function throwError() { var x = 400 * melbaToast; } function htmlErrorHandler(event) { event.preventDefault(); var message = "exceptionValue:" + event.exceptionValue + "\n"; for (var i = 0; i < event.stackTrace.length; i++){ message += "sourceURL:" + event.stackTrace[i].sourceURL +"\n"; message += "line:" + event.stackTrace[i].line +"\n"; message += "function:" + event.stackTrace[i].functionName + "\n"; } alert(message); } window.htmlLoader.addEventListener("uncaughtScriptException", htmlErrorHandler); Click me.
Manipulační program události htmlErrorHandler() zruší výchozí chování události (což je odeslání chybové zprávy JavaScript do výstupu sledování aplikace AIR) a vygeneruje svou vlastní zprávu pro výstup. Vygeneruje hodnotu exceptionValue objektu HTMLUncaughtScriptExceptionEvent. Výstupem budou vlastnosti jednotlivých objektů v poli stackTrace:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 248 Zpracování událostí týkajících se HTML
Zpracování událostí chodu programu pomocí jazyka JavaScript Třídy chodu programu podporují přidávání manipulačních programů událostí pomocí metody addEventListener(). Chcete-li přidat funkci manipulačního programu pro určitou událost, vyvolejte metodu addEventListener() objektu, který událost odesílá, přičemž poskytnete typ události a funkci zpracování. Například chcete-li poslouchat událost closing odeslanou, když uživatel klepne na zavírací tlačítko okna na titulkovém pásu, použijte následující příkaz: window.nativeWindow.addEventListener(air.NativeWindow.CLOSING, handleWindowClosing);
Vytváření funkcí manipulačního programu události Následující kód vytvoří jednoduchý soubor HTML, který zobrazuje informace o pozici hlavního okna. Funkce manipulačního programu moveHandler() poslouchá událost přesunutí (definovanou třídou NativeWindowBoundsEvent) hlavního okna.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 249 Zpracování událostí týkajících se HTML
<script src="AIRAliases.js" /> <script> function init() { writeValues(); window.nativeWindow.addEventListener(air.NativeWindowBoundsEvent.MOVE, moveHandler); } function writeValues() { document.getElementById("xText").value = window.nativeWindow.x; document.getElementById("yText").value = window.nativeWindow.y; } function moveHandler(event) { air.trace(event.type); // move writeValues(); }
Window X:
Window Y:
Když uživatel přesune okno, elementy textové oblasti zobrazí aktualizované souřadnice X a Y polohy okna. Všimněte si, že objekt události je předaný jako argument metodymoveHandler(). Parametr události umožňuje, aby vaše funkce manipulačního programu zkontrolovala objekt události. V tomto příkladu je použita vlastnost type objektu události k oznámení, že daná událost je událost move.
Odstraňování posluchačů událostí Metodu removeEventListener() můžete použít k odstranění posluchače událostí, který již nepotřebujete. Je dobré odstranit všechny posluchače, které se již nebudou používat. Vyžadované parametry zahrnují parametry eventName a listener, které jsou stejné jako vyžadované parametry pro metodu addEventListener().
Odstranění posluchačů událostí ve stránkách HTML, které navigují Když obsah HTML naviguje nebo když je vyřazen, protože okno, které jej obsahuje, je zavřené, posluchače událostí, které se odkazují na objekty na nenačtených stránkách, nebudou odstraněny automaticky. Když nějaký objekt odešle událost do manipulačního programu, který již byl odstraněn z paměti, zobrazí se následující chybová zpráva: „Aplikace se pokusila o odkaz na objekt JavaScript ve stránce HTML, který již není zavedený v paměti“. Chcete-li se této chybě vyhnout, odstraňte posluchače událostí JavaScript ve stránce HTML, než se ztratí. V případě navigace stránky (s objektem HTMLLoader) odstraňte posluchač události během události unload objektu window. Například následující kód JavaScript odstraní posluchač události pro událost uncaughtScriptException:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 250 Zpracování událostí týkajících se HTML
Chcete-li zabránit výskytu chyb při zavírání oken obsahujících obsah HTML, vyvolejte funkci vyčištění v odpovědi na událost closing objektu NativeWindow (window.nativeWindow). Například následující kód JavaScript odstraní posluchač události pro událost uncaughtScriptException: window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup); function cleanup() { window.htmlLoader.removeEventListener('uncaughtScriptException', uncaughtScriptExceptionHandler); }
Výskytu této chyby můžete také zabránit odstraněním posluchače události ihned po jeho spuštění. Například následující kód JavaScript vytvoří okno HTML vyvoláním metody createRootWindow() třídy HTMLLoader a přidá posluchač události pro událost complete. Při vyvolání manipulačního programu události complete dojde k odstranění jeho vlastního posluchače události pomocí funkce removeEventListener(): var html = runtime.flash.html.HTMLLoader.createRootWindow(true); html.addEventListener('complete', htmlCompleteListener); function htmlCompleteListener() { html.removeEventListener(complete, arguments.callee) // handler code.. } html.load(new runtime.flash.net.URLRequest("second.html"));
Odstranění nepotřebných posluchačů událostí také umožní, aby systémový program na čištění uvolněné paměti získal zpět veškerou paměť přiřazenou těmto posluchačům.
Kontrola existujících posluchačů událostí Metoda hasEventListener() umožňuje prověřit existenci posluchače události na určitém objektu.
251
Kapitola 23: Skriptování kontejneru HTML Třída HTMLLoader slouží jako kontejner pro obsah HTML v Adobe® AIR™. Tato třída poskytuje mnoho vlastností a metod zděděných ze třídy Sprite pro ovládání chování a vzhledu objektu na seznamu zobrazení jazyka ActionScript® 3.0. Dále tato třída definuje vlastnosti a metody pro takové úlohy, jako je například načítání a interakce s obsahem HTML a správa historie. Třída HTMLHost definuje množinu výchozích chování pro HTMLLoader. Při vytvoření objektu HTMLLoader není poskytnuta žádná implementace HTMLHost. Proto když HTML spustí jedno z implicitních chování, například změnu umístění okna nebo titul okna, nic se nestane. Třídu HTMLHost můžete rozšířit a definovat tak chování požadovaná pro vaši aplikaci. Výchozí implementace HTMLHost je poskytnuta pro okna HTML vytvořená AIR. Výchozí implementaci HTMLHost můžete přiřadit jinému objektu HTMLLoader nastavením vlastnosti htmlHost objektu pomocí nového objektu HTMLHost vytvořeného pomocí parametru defaultBehavior nastaveného na true.
Vlastnosti zobrazení objektů HTMLLoader Objekt HTMLLoader dědí vlastnosti třídy přehrávače Adobe® Flash® Player Sprite. Můžete například změnit velikost, přesunout, skrýt a změnit barvu pozadí. Nebo můžete použít pokročilé efekty, například filtry, masky, změnu měřítka a rotaci. Při používání efektů vezměte v úvahu důsledky pro čitelnost. Obsah SWF a PDF načtený do stránky HTML nelze zobrazit, když jsou některé efekty použity. Okna HTML obsahují objekt HTMLLoader, který vykresluje obsah HTML. Tento objekt je vymezen v oblasti okna, takže změna rozměrů, polohy, rotace nebo faktory změny měřítka nevytvoří vždy požadované výsledky.
Základní vlastnosti zobrazení Základní vlastnosti zobrazení HTMLLoader vám umožňují umístit ovládání do nadřazeného objektu zobrazení, pro nastavení velikosti a zobrazení nebo skrytí ovládání. Tyto vlastnosti byste neměli změnit pro objekt HTMLLoader okna HTML. Mezi základní vlastnosti patří: Vlastnost
Poznámky
x, y
Umístěte objekt do jeho nadřazeného kontejneru.
width, height
Změní rozměry oblasti zobrazení.
visible
Ovládá viditelnost objektu a jakýkoliv obsah, který obsahuje.
Mimo okno HTML jsou vlastnosti width a height objektu HTMLLoader implicitně nastaveny na 0. Před tím, než lze načtený obsah HTML spatřit, musíte nastavit šířku a výšku. Obsah HTML je nakreslen na velikosti HTMLLoader, rozvržen podle vlastností HTML a CSS v obsahu. Změna velikosti objektu HTMLLoader změní tok obsahu.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 252 Skriptování kontejneru HTML
Při načítání obsahu do nového objektu HTMLLoader (kde je widthstále nastavena na 0), může být lákavé nastavitwidth a height zobrazení HTMLLoader pomocí vlastností contentWidth a contentHeight. Tato technika je funkční pro stránky, které mají při rozvržení podle pravidel hustoty HTML a CSS rozumnou minimální šířku. Nicméně některé stránky se bez rozumné šířky poskytnuté objektem HTMLLoader rozloží do dlouhého a úzkého rozvržení. Poznámka: Při změně šířky a výšky objektu HTMLLoader se hodnoty měřítka x a y narozdíl od většiny ostatních typů objektů zobrazení nezmění.
Průhlednost obsahu HTMLLoader Vlastnost paintsDefaultBackground objektu HTMLLoader, implicitně nastavená na true, určuje, zda objekt HTMLLoader vykreslí neprůhledné pozadí. Je-li paintsDefaultBackground nastavena na hodnotu false, je pozadí bez barvy. Kontejner objektu zobrazení nebo jiné objekty zobrazení pod objektem HTMLLoader jsou viditelné za vystupujícími prvky obsahu HTML. Jestliže prvek těla nebo jakýkoliv jiný prvek dokumentu HTML určuje barvu pozadí (například pomocí style="background-color:gray"), je pozadí dané části HTML neprůhledné a je vykresleno určenou barvou pozadí. Jestliže nastavíte vlastnost opaqueBackground objektu HTMLLoader a paintsDefaultBackground je false, bude barva nastavená pro opaqueBackground viditelná. Poznámka: Můžete použít průhlednou grafiku ve formátu PNG a poskytnout tak pozadí s prolnutím alfa pro element v dokumentu HTML. Nastavení stylu neprůhlednosti elementu HTML není podporováno.
Změna měřítka obsahu HTMLLoader Neměňte měřítko objektu HTMLLoader za faktor měřítka 1.0. Text v obsahu HTMLLoader je vykreslen při specifickém rozlišení a zobrazí se seskupeně, jestliže se zvětší měřítko objektu HTMLLoader. Pro zabránění změně měřítka objektu HTMLLoader i jeho obsahu při změně velikosti okna nastavte vlastnost scaleMode plochy na StageScaleMode.NO_SCALE.
Zohlednění při načítání obsahu SWF nebo PDF na stránce HTML Obsah SWF a PDF načtený do objektu HTMLLoader zmizí za následujících podmínek:
• Jestliže změníte velikost měřítka objektu HTMLLoader na faktor jiný než 1,0. • Jestliže nastavíte vlastnost alfa objektu HTMLLoader na hodnotu jinou než 1,0. • Jestliže otáčíte obsahem objektu HTMLLoader. Obsah se znovu objeví, jestliže odstraníte chybné nastavení vlastnosti a odstraníte aktivní filtry. Poznámka: Runtime nemůže zobrazit obsah SWF ani PDF v průhledných oknech. Další informace o načítaní těchto typů médií v objektu HTMLLoader naleznete v tématech „Vložení obsahu SWF do HTML“ na stránce 236 a „Přidávání obsahu PDF“ na stránce 265.
Další vlastnosti zobrazení Třída HTMLLoader dědí několik metod, které lze použít pro zvláštní efekty. Obecně mají tyto efekty omezení, jsou-li použity se zobrazením HTMLLoader, ale mohou být užitečné pro přechody nebo jiné dočasné efekty. Jestliže například zobrazíte dialogové okno pro získání vstupu uživatele, můžete rozostřit zobrazení hlavního okna, dokud uživatel dialogové okno nezavře. Podobně můžete nechat zobrazení zmizet při zavírání okna. Mezi další vlastnosti zobrazení patří:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 253 Skriptování kontejneru HTML
Vlastnost
Omezení
alpha
Může snížit čitelnost obsahu HTML
filters
V okně HTML jsou vnější efekty oříznuty okrajem okna.
graphics
Tvary nakreslené pomocí příkazů grafiky se zobrazí pod obsahem HTML, včetně výchozího pozadí. Vlastnost paintsDefaultBackground musí být nepravda, aby byly nakreslené tvary viditelné.
opaqueBackground
Nezmění barvu výchozího pozadí. Vlastnost paintsDefaultBackground musí být nepravda, aby byla barevná vrstva viditelná.
rotation
Rohy obdélníkové oblasti HTMLLoader lze oříznout okrajem okna. Obsah SWF a PDF načtený v obsahu HTML není zobrazen.
scaleX, scaleY
Vykreslené zobrazení se může jevit seskupeně, pokud jsou faktory měřítka větší než 1. Obsah SWF a PDF načtený v obsahu HTML není zobrazen.
transform
Může snížit čitelnost obsahu HTML. Zobrazení HTML lze oříznout okrajem okna. Obsah SWF a PDF načtený do obsahu HTML není zobrazen, jestliže transformace zahrnuje rotaci, změnu měřítka nebo zkosení.
Následující příklad ukazuje způsob nastavení pole filters pro rozostření celého zobrazení HTML: var html:HTMLLoader = new HTMLLoader(); var urlReq:URLRequest = new URLRequest("http://www.adobe.com/"); html.load(urlReq); html.width = 800; html.height = 600; var blur:BlurFilter = new BlurFilter(8); var filters:Array = [blur]; html.filters = filters;
Rolování obsahu HTML Třída HTMLLoader zahrnuje následující vlastnosti, které vám umožňují ovládat rolování obsahu HTML: Vlastnost
Popis
contentHeight
Výška obsahu HTML v obr. bodech.
contentWidth
Šířka obsahu HTML v obr. bodech.
scrollH
Poloha horizontálního posunutí obsahu HTML v objektu HTMLLoader.
scrollV
Poloha vertikálního posunutí obsahu HTML v objektu HTMLLoader.
Následující kód nastaví vlastnost scrollVtak, že je obsah HTML rolován až na konec stránky:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 254 Skriptování kontejneru HTML
var html:HTMLLoader = new HTMLLoader(); html.addEventListener(Event.HTML_BOUNDS_CHANGE, scrollHTML); const SIZE:Number = 600; html.width = SIZE; html.height = SIZE; var urlReq:URLRequest = new URLRequest("http://www.adobe.com"); html.load(urlReq); this.addChild(html); function scrollHTML(event:Event):void { html.scrollV = html.contentHeight - SIZE; }
HTMLLoader neobsahuje vodorovné a svislé lišty pro rolování. V jazyce ActionScript můžete implementovat lišty rolování. Můžete také použít metodu HTMLLoader.createRootWindow() pro vytvoření okna, které obsahuje objekt HTMLLoader s lištami rolování (viz „Vytváření oken s rolováním obsahu HTML“ na stránce 263).
Přístup k seznamu historie HTML Při načítání nových stran do objektu HTMLLoader spravuje runtime pro daný objekt seznam historie. Seznam historie odpovídá objektu window.history na stránce HTML. Třída HTMLLoader obsahuje následující vlastnosti a metody, které vám umožní pracovat se seznamem historie HTML: Člen třídy
Popis
historyLength
Celková délka seznamu historie včetně položek vpřed a zpět.
historyPosition
Aktuální pozice na seznamu historie. Položky historie před touto pozicí představují navigaci „zpět“ a položky za touto pozici představují navigaci „dopředu“.
getHistoryAt()
Vrátí objekt URLRequest odpovídající záznamu historie v určené pozici v seznamu historie.
historyBack()
Je-li to možné, naviguje zpět seznamem historie.
historyForward()
Je-li to možné, naviguje dopředu seznamem historie.
historyGo()
Naviguje určitý počet kroků v historii prohlížeče. Je-li kladné, naviguje vpřed, je-li záporné, naviguje zpět. Navigace na nulu znovu načte stránku. Určení pozice za koncem naviguje na konec seznamu.
Položky v seznamu historie jsou uloženy jako objekty typu HistoryListItem. Třída HistoryListItem má následující vlastnosti: Vlastnost
Popis
isPost
Nastavena na true, jestliže stránka HTML obsahuje data POST.
originalUrl
Původní URL stránky HTML před případným přesměrováním.
title
Název stránky HTML.
url
URL stránky HTML.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 255 Skriptování kontejneru HTML
Nastavení agenta uživatele použitého při načítání obsahu HTML Třída HTMLLoader má vlastnost userAgent, která vám umožňuje nastavit řetězec agenta uživatele použitý třídou HTMLLoader. Vlastnost userAgent objektu HTMLLoader nastavte před voláním metody load(). Jestliže nastavíte tuto vlastnost na instanci HTMLLoader, vlastnost userAgent URLRequest předaná metodě load() se nepoužije. Nastavením vlastnosti URLRequestDefaults.userAgent můžete nastavit výchozí řetězec agenta-uživatele, který budou používat všechny objekty HTMLLoader v doméně aplikace. Statické vlastnosti URLRequestDefaults se použijí jako výchozí pro všechny objekty URLRequest, nejen pro objekty URLRequests použité s metodou load() objektů HTMLLoader. Nastavení vlastnosti userAgent HTMLLoader potlačí výchozí nastavení URLRequestDefaults.userAgent. Jestliže buď pro vlastnost userAgent objektu HTMLLoader nebo pro vlastnost URLRequestDefaults.userAgent nenastavíte hodnotu agenta uživatele, bude použita výchozí hodnota agenta uživatele AIR. Výchozí hodnota se mění v závislosti na operačním systému v době běhu (například Mac OS nebo Windows), na jazyku v době běhu a na verzi v době běhu, jako v následujících dvou příkladech:
•
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) AdobeAIR/1.0"
•
"Mozilla/5.0 (Windows; U; en) AppleWebKit/420+ (KHTML, like Gecko) AdobeAIR/1.0"
Nastavení kódování znaků, které bude použito pro obsah HTML Stránka HTML může určit kódování znaků, které používá, zahrnutím tagu meta. Viz následující příklad: meta http-equiv="content-type" content="text/html" charset="ISO-8859-1";
Potlačte nastavení stránky a nastavením vlastnosti textEncodingOverride objektu HTMLLoader zajistěte, že je použito specifické kódování znaků: var html:HTMLLoader = new HTMLLoader(); html.textEncodingOverride = "ISO-8859-1";
Určete kódování znaku pro obsah HTMLLoader, které bude použito, pokud stránka HTML neurčuje nastavení pomocí vlastnosti textEncodingFallback objektu HTMLLoader: var html:HTMLLoader = new HTMLLoader(); html.textEncodingFallback = "ISO-8859-1";
Vlastnost textEncodingOverride potlačí nastavení stránky HTML. A vlastnost textEncodingOverride a nastavení na stránce HTML potlačí vlastnost textEncodingFallback. Před načtením obsahu HTML nastavte vlastnost textEncodingOverride nebo textEncodingFallback.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 256 Skriptování kontejneru HTML
Definování uživatelských rozhraní podobných prohlížeči pro obsah HTML Jazyk JavaScript poskytuje několik rozhranní API pro ovládání okna zobrazujícího obsah HTML. V aplikaci AIR jsou tato API potlačena implementací vlastní třídy HTMLHost.
O rozšiřování třídy HTMLHost Jestliže vaše aplikace například představuje více objektů HTMLLoader v rozhraní opatřeném tabulátorem, můžete si přát změnit tituly načtenými stránkami HTML pro změnu štítku záložky, nikoliv titulu hlavního okna. Podobně může váš kód odpovídat na volání window.moveTo() změnou polohy objektu HTMLLoader v jeho nadřazeném zobrazení přesunutím okna, které obsahuje objekt HTMLLoader, a to tím, že neprovede nic, nebo něco zcela jiného. Třída AIR HTMLHost ovládá následující vlastnosti a metody jazyka JavaScript:
•
window.status
•
window.document.title
•
window.location
•
window.blur()
•
window.close()
•
window.focus()
•
window.moveBy()
•
window.moveTo()
•
window.open()
•
window.resizeBy()
•
window.resizeTo()
Když vytvoříte objekt HTMLLoader pomocí new HTMLLoader(), nejsou uvedené vlastnosti nebo metody jazyka JavaScript aktivovány. Třída HTMLHost poskytuje výchozí, prohlížeči podobnou implementaci těchto rozhraní jazyka JavaScript. Třídu HTMLHost můžete také rozšířit a upravit tak její chování. Pro vytvoření objektu HTMLHost podporujícího výchozí chování nastavte parametr defaultBehaviors v konstruktoru HTMLHost na true: var defaultHost:HTMLHost = new HTMLHost(true);
Když vytvoříte okno HTML v aplikaci AIR s metodou třídy HTMLLoader createRootWindow(), je instance HTMLHost podporující výchozí chování přiřazena automaticky. Chování hostitelského objektu můžete změnit přiřazením odlišné implementace HTMLHost k vlastnosti htmlHost třídy HTMLLoader, nebo můžete přiřadit hodnotu null a úplně tak tyto funkce vypnout. Poznámka: AIR přiřadí výchozí objekt HTMLHost k úvodnímu oknu vytvořenému pro aplikaci AIR vycházející z HTML a k libovolným oknům vytvořeným výchozí implementací metody jazyka JavaScript window.open().
Příklad: rozšiřování třídy HTMLHost Následující příklad ukazuje, jak uživatelsky upravit způsob, jakým objekt HTMLLoader ovlivní uživatelské rozhraní, rozšířením třídy HTMLHost: 1 Vytvořte soubor Flash pro AIR. Nastavte jeho dokumentovou třídu na CustomHostExample a poté daný soubor
uložte jako CustomHostExample.fla.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 257 Skriptování kontejneru HTML
2 Vytvořte soubor jazyka ActionScript pojmenovaný CustomHost.as obsahující třídu, která rozšiřuje třídu
HTMLHost (podtřídu). Tato třída potlačí určité metody nové třídy pro zpracování změn v nastavení souvisejícím s uživatelským rozhraním. Například následující třída, CustomHost, definuje chování pro volání window.open() a provede změnu na window.document.title. Volání metodywindow.open() otevře stránku HTML v novém okně a provede změnuwindow.document.title (včetně nastavení elementu stránky HTML) pro změnu titulu okna. package { import import import import import import import import import import
public class CustomHost extends HTMLHost { public var statusField:TextField; public function CustomHost(defaultBehaviors:Boolean=true) { super(defaultBehaviors); } override public function windowClose():void { htmlLoader.stage.nativeWindow.close(); } override public function createWindow( windowCreateOptions:HTMLWindowCreateOptions ):HTMLLoader { var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); var bounds:Rectangle = new Rectangle(windowCreateOptions.x, windowCreateOptions.y, windowCreateOptions.width, windowCreateOptions.height); var htmlControl:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, windowCreateOptions.scrollBarsVisible, bounds); htmlControl.htmlHost = new HTMLHostImplementation(); if(windowCreateOptions.fullscreen){ htmlControl.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; } return htmlControl; } override public function updateLocation(locationURL:String):void { trace(locationURL); } override public function set windowRect(value:Rectangle):void { htmlLoader.stage.nativeWindow.bounds = value;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 258 Skriptování kontejneru HTML
} override public function updateStatus(status:String):void { statusField.text = status; trace(status); } override public function updateTitle(title:String):void { htmlLoader.stage.nativeWindow.title = title + "- Example Application"; } override public function windowBlur():void { htmlLoader.alpha = 0.5; } override public function windowFocus():void { htmlLoader.alpha = 1; } } }
3 Vytvořte jiný soubor jazyka ActionScript pojmenovaný CustomHostExample.as pro získání dokumentové třídy
aplikace. Tato třída vytvoří objekt HTMLLoader a nastaví jeho hostitelskou vlastnost na instanci třídy CustomHost definovanou v předešlém kroku:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 259 Skriptování kontejneru HTML
Zpracovávání změn vlastnosti window.location Potlačí metodu locationChange() pro zpracovávání změn URL stránky HTML. Metoda locationChange() je volána, když jazyk JavaScript na stránce změní hodnotu window.location. Následující příklad jednoduše načte požadovanou URL: override public function updateLocation(locationURL:String):void { htmlLoader.load(new URLRequest(locationURL)); }
Poznámka: Vlastnost htmlLoader objektu HTMLHost můžete použít pro odkázání na aktuální objekt HTMLLoader.
Zpracovávání volání jazyka JavaScript window.moveBy(), window.moveTo(), window.resizeTo(), window.resizeBy() Potlačí metodu set windowRect() pro zpracovávání změn v ohraničení obsahu HTML. Metoda set windowRect() je volána, když jazyk JavaScript na stránce volá window.moveBy(), window.moveTo(), window.resizeTo() nebowindow.resizeBy(). Následující příklad jednoduše načte ohraničení okna plochy: override public function set windowRect(value:Rectangle):void { htmlLoader.stage.nativeWindow.bounds = value; }
Zpracovávání volání jazyka JavaScript window.open() Potlačí metodu createWindow() pro zpracovávání volání jazyka JavaScript window.open(). Implementace metody createWindow() jsou odpovědné za vytvoření a vrácení nového objektu HTMLLoader. Obvykle byste HTMLLoader zobrazili v novém okně, ale vytvoření okna není vyžadováno.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 261 Skriptování kontejneru HTML
Následující příklad ukazuje způsob implementace funkce createWindow() pomocí HTMLLoader.createRootWindow() pro vytvoření okna i objektu HTMLLoader. Objekt NativeWindow můžete také vytvořit samostatně a přidat HTMLLoader na plochu okna. override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader{ var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); var bounds:Rectangle = new Rectangle(windowCreateOptions.x, windowCreateOptions.y, windowCreateOptions.width, windowCreateOptions.height); var htmlControl:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, windowCreateOptions.scrollBarsVisible, bounds); htmlControl.htmlHost = new HTMLHostImplementation(); if(windowCreateOptions.fullscreen){ htmlControl.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; } return htmlControl; }
Poznámka: Tento příklad přiřadí vlastní implementaci HTMLHost jakýmkoliv novým oknům vytvořeným pomocí window.open(). Můžete také použít různé implementace nebo nastavit vlastnost htmlHost na nulu pro nová okna. Objekt předaný jako parametr metodě createWindow() je objekt HTMLWindowCreateOptions. Třída HTMLWindowCreateOptions zahrnuje vlastnosti, které hlásí hodnoty nastavené v řetězci parametru features ve voláníwindow.open(): Vlastnost HTMLWindowCreateOptions
Odpovídající nastavení v řetězci vlastností ve volání jazyka JavaScript window.open()
fullscreen
fullscreen
height
height
locationBarVisible
location
menuBarVisible
menubar
resizeable
resizable
scrollBarsVisible
scrollbars
statusBarVisible
status
toolBarVisible
toolbar
width
width
x
left nebo screenX
y
top nebo screenY
Třída HTMLLoader neimplementuje všechny funkce, které lze určit v řetězci funkce. Vaše aplikace musí v případě potřeby poskytovat posuvníky, pruhy umístění, pruhy nabídek, stavové řádky a panely nástrojů. Další argumenty pro metodu jazyka JavaScript window.open() jsou zpracovány systémem. Implementace createWindow() by neměla načíst obsah v objektu HTMLLoader nebo nastavit titul okna.
Zpracovávání volání jazyka JavaScript window.close() Potlačí windowClose() pro zpracování volání jazyka JavaScript metody window.close(). Následující příklad zavře v případě volání metody window.close() okno pracovní plochy:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 262 Skriptování kontejneru HTML
override public function windowClose():void { htmlLoader.stage.nativeWindow.close(); }
Volání jazyka JavaScript window.close() nemusí zavřít obsahové okno. Můžete například odstranit HTMLLoader ze seznamu zobrazení a tím ponecháte okno (které může mít jiný obsah) otevřené, viz následující kód: override public function windowClose():void { htmlLoader.parent.removeChild(htmlLoader); }
Zpracovávání změn vlastnosti window.status Potlačí metodu updateStatus() pro zpracování změn jazyka JavaScript hodnoty window.status. Následující příklad sleduje hodnotu statutu: override public function updateStatus(status:String):void { trace(status); }
Požadovaný statut je předán jako řetězec metodě updateStatus(). Objekt HTMLLoader neposkytuje stavový řádek.
Zpracovávání změn vlastnosti window.document.title potlačí metodu updateTitle() pro zpracování změn jazyka JavaScript hodnoty window.document.title. Následující příklad změní titul okna a k přidá k titulu řetězec „ukázka“. override public function updateTitle(title:String):void { htmlLoader.stage.nativeWindow.title = title + " - Sample"; }
Jestliže je na stránce HTML nastavena vlastnost document.title, je požadovaný titul předán jako řetězec metodě updateTitle(). Změny document.title nemusí změnit titul okna obsahujícího objekt HTMLLoader. Mohli byste například změnit další prvek rozhraní, například textové pole.
Zpracovávání volání jazyka JavaScript k window.blur() a window.focus() Potlačí metody windowBlur() a windowFocus() pro zpracovávání volání jazyka JavaScript k window.blur() a window.focus(), viz následující příklad: override public function windowBlur():void { htmlLoader.alpha = 0.5; } override public function windowFocus():void { htmlLoader.alpha = 1.0; NativeApplication.nativeApplication.activate(htmlLoader.stage.nativeWindow); }
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 263 Skriptování kontejneru HTML
Poznámka: AIR neposkytuje rozhraní API pro deaktivaci okna nebo aplikace.
Vytváření oken s rolováním obsahu HTML Třída HTMLLoader obsahuje statickou metodu HTMLLoader.createRootWindow(), která vám umožňuje otevřít nové okno (reprezentované objektem NativeWindow), které obsahuje objekt HTMLLoader a definuje některé nastavení uživatelského rozhraní pro dané okno. Tato metoda přebírá čtyři parametry, které vám umožňují definovat uživatelské rozhraní: Parametr
Popis
visible
Booleovská hodnota, která určuje, zda je okno zpočátku viditelné (true) nebo nikoliv (false).
windowInitOptions
Objekt NativeWindowInitOptions. Třída NativeWindowInitOptions definuje volby inicializace pro objekt NativeWindow, včetně následujících: zda lze okno minimalizovat, maximalizovat nebo změnit jeho velikost, zda má okno systémový chróm nebo uživatelský chróm, zda je okno průhledné nebo nikoliv (pro okna, která nepoužívají systémový chróm) a typ okna.
scrollBarsVisible
Zda jsou k dispozici posuvníky(true) nebo nikoliv (false).
bounds
Objekt Rectangle definující polohu a velikost nového okna.
Například následující kód používá metodu HTMLLoader.createRootWindow() pro vytvoření okna s obsahem HTMLLoader, který používá posuvníky: var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); var bounds:Rectangle = new Rectangle(10, 10, 600, 400); var html2:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, true, bounds); var urlReq2:URLRequest = new URLRequest("http://www.example.com"); html2.load(urlReq2); html2.stage.nativeWindow.activate();
Poznámka: Okna vytvořená voláním createRootWindow() přímo v jazyce JavaScript zůstávají nezávislá na úvodním okně HTML. Například vlastnosti okna jazyka JavaScript opener a parent mají hodnotu null. Jestliže nicméně voláte createRootWindow() nepřímo potlačením metody HTMLHost createWindow() pro volání createRootWindow(), poté vlastnosti opener a parent odkazují na úvodní okno HTML.
Vytváření podtříd třídy HTMLLoader Můžete vytvořit podtřídu třídy HTMLLoader pro vytvoření nových chování. Můžete například vytvořit podtřídu, která definuje výchozí posluchače události pro události HTMLLoader (například události odeslané při vykreslení HTML nebo když uživatel klepne na odkaz). Následující příklad rozšíří třídu HTMLHost pro zajištění chování normal v případě volání metody jazyka JavaScript window.open(). Příklad poté definuje podtřídu HTMLLoader, která používá vlastní třídu implementace HTMLHost:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 264 Skriptování kontejneru HTML
package { import flash.html.HTMLLoader; public class MyHTMLHost extends HTMLHost { public function MyHTMLHost() { super(false); } override public function createWindow(opts:HTMLWindowCreateOptions):void { var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); var bounds:Rectangle = new Rectangle(opts.x, opts.y, opts.width, opts.height); var html:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, opts.scrollBarsVisible, bounds); html.stage.nativeWindow.orderToFront(); return html } }
Níže je definována podtřída třídy HTMLLoader, která přiřadí objekt MyHTMLHost jeho vlastnosti htmlHost: package { import flash.html.HTMLLoader; import MyHTMLHost; import HTMLLoader; public class MyHTML extends HTMLLoader { public function MyHTML() { super(); htmlHost = new MyHTMLHost(); } } }
Podrobnosti o třídě HTMLHost a metoděHTMLLoader.createRootWindow() použité v tomto příkladě naleznete v tématu „Definování uživatelských rozhraní podobných prohlížeči pro obsah HTML“ na stránce 256.
265
Kapitola 24: Přidávání obsahu PDF Aplikace běžící v prostředí Adobe® AIR™ dokáží vykreslit nejen obsah SWF a HTML, ale také obsah PDF. Aplikace AIR vykreslují obsah PDF pomocí třídy HTMLLoader, modulu WebKit a zásuvného modulu prohlížeče Adobe® Reader®. V aplikaci AIR může být obsah PDF roztažen na celou výšku a šířku vaší aplikace nebo může být zobrazen jako část rozhraní. Zásuvný modul prohlížeče Adobe Reader ovládá zobrazení souborů PDF v aplikaci AIR, takže úpravy rozhraní panelu nástrojů (např. nástrojů nastavení pozice, ukotvení a viditelnosti) zůstávají u postupného zobrazování souborů PDF v aplikacích AIR i prohlížeči. Důležité: Pro vykreslení obsahu PDF v aplikaci AIR musí mít uživatel instalovanou aplikaci Adobe Reader nebo Adobe® Acrobat® verze 8.1 nebo vyšší.
Zjišťování schopností PDF Nemá-li uživatel instalovanou aplikaci Adobe Reader nebo Adobe Acrobat ve verzi 8.1 nebo vyšší, obsah PDF se v aplikaci AIR nezobrazí. Chcete-li zjistit, jestli uživatel může vykreslit obsah PDF, nejprve zkontrolujte vlastnost HTMLLoader.pdfCapability. Tato vlastnost je nastavena na jednu z následujících konstant třídy: Konstanta
Popis
HTMLPDFCapability.STATUS_OK
Byla zjištěna postačující verze (8.1 nebo vyšší) aplikace Adobe Reader a obsah PDF může být načten do objektu HTMLLoader.
Nebyla zjištěna žádná verze aplikace Adobe Reader. Objekt HTMLLoader nemůže zobrazit obsah PDF.
HTMLPDFCapability.ERROR_INSTALLED_READER_TOO_OLD
Byla zjištěna aplikace Adobe Reader, ale její verze je příliš stará. Objekt HTMLLoader nemůže zobrazit obsah PDF.
HTMLPDFCapability.ERROR_PREFERRED_READER_TOO_OLD
Byla zjištěna dostatečná verze aplikace Adobe Reader (8.1 nebo pozdější), ale verze aplikace Adobe Reader nastavená na zpracování obsahu PDF je starší než Reader 8.1. Objekt HTMLLoader nemůže zobrazit obsah PDF.
Windows: pokud v uživatelském systému běží aplikace Acrobat nebo Adobe Reader verze 7.x nebo pozdější, bude tato verze použita, i když je instalována pozdější verze, která podporuje načtení načteného PDF. Má-li v tomto případě vlastnost pdfCampability hodnotu HTMLPDFCapability.STATUS_OK, když se aplikace AIR pokouší načíst obsah PDF, starší verze aplikace Acrobat nebo Reader zobrazí upozornění (a v aplikaci AIR nebude vrácena žádná výjimka). Může-li u vašich koncových uživatelů nastat takováto situace, zvažte, zda jim nedoporučíte zavřít aplikaci Acrobat před spuštěním vaší aplikace. Možná budete potřebovat zobrazit tyto pokyny, jestliže se obsah PDF nenačte během přijatelného časového rámce. V systému Linux vyhledává prostředí AIR prohlížeč Adobe Reader v cestě (PATH) exportované uživatelem (zjišťuje, zda obsahuje příkaz acroread) a v adresáři /opt/Adobe/Reader. Následující kód zjistí, zda uživatel může zobrazit obsah PDF v aplikaci AIR a pokud ne, bude sledovat chybový kód odpovídající chybovému objektu HTMLPDFCapability.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 266 Přidávání obsahu PDF
if(HTMLLoader.pdfCapability == HTMLPDFCapability.STATUS_OK) { trace("PDF content can be displayed"); } else { trace("PDF cannot be displayed. Error code:", HTMLLoader.pdfCapability); }
Načítání obsahu PDF PDF můžete do aplikace AIR přidat vytvořením instance HTMLLoader, nastavením jejích rozměrů a načtením cesty PDF. V následujícím příkladu je načten soubor PDF z externího webu. Nahraďte URLRequest za cestu k dostupnému externímu PDF. var request:URLRequest = new URLRequest("http://www.example.com/test.pdf"); pdf = new HTMLLoader(); pdf.height = 800; pdf.width = 600; pdf.load(request); container.addChild(pdf);
Můžete také načíst obsah z URL souboru a schémat URL pro konkrétní aplikaci AIR, např. app a app-storage. Například následující kód načte soubor test.pdf do podadresáře PDF adresáře aplikace: app:/js_api_reference.pdf Další informace o schématech URL AIR viz „Používání schémat URL AIR v adresách URL“ na stránce 296.
Skriptování obsahu PDF Pomocí kódu JavaScript můžete ovládat obsah PDF stejně jako v případě webové stránky v prohlížeči. Rozšíření jazyka JavaScript na Acrobat poskytují mimo jiné následující funkce:
• Ovládání navigace v obsahu stránky a jeho zvětšení • Zpracování formulářů v rámci dokumentu • Ovládání multimediálních událostí Veškeré podrobnosti o rozšířeních jazyka JavaScript pro Adobe Acrobat jsou uvedena v příručce k Adobe Acrobat Developer Connection na adrese http://www.adobe.com/devnet/acrobat/javascript.html.
Základy komunikace HTML-PDF Kód JavaScript ve stránce HTML může posílat zprávy kódu JavaScript v obsahu PDF vyvoláním metody postMessage() objektu DOM zastupujícího obsah PDF. Posuďte například následující vložený obsah PDF:
Následující kód JavaScript v obsahujícím obsahu HTML posílá zprávu kódu JavaScript v souboru PDF: pdfObject = document.getElementById("PDFObj"); pdfObject.postMessage(["testMsg", "hello"]);
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 267 Přidávání obsahu PDF
Soubor PDF může obsahovat kód JavaScript pro přijmutí této zprávy. Kód JavaScript můžete přidávat k obsahu PDF v některých kontextech, včetně kontextu na úrovni dokumentu, složky, stránky, pole a dávky. Zde je probrán pouze kontext na úrovni dokumentu, který definuje skripty, které se vyhodnocují při otevření dokumentu PDF. Soubor PDF může přidat vlastnost messageHandler k objektu hostContainer. Vlastnost messageHandler je objektem, který definuje funkce manipulačního programu pro reagování na zprávy. Například následující kód definuje funkci pro zpracování zpráv přijatých souborem PDF z hostitelského kontejneru (jímž je obsah HTML obsahující vložený soubor PDF): this.hostContainer.messageHandler = {onMessage: myOnMessage}; function myOnMessage(aMessage) { if(aMessage[0] == "testMsg") { app.alert("Test message: " + aMessage[1]); } else { app.alert("Error"); } }
Kód JavaScript ve stránce HTML může vyvolat metodu postMessage() objektu PDF obsaženého ve stránce. Při vyvolání této metody se odešle zpráva ("Hello from HTML") do kódu JavaScript na úrovni dokumentu v souboru PDF: PDF Test <script> function init() { pdfObject = document.getElementById("PDFObj"); try { pdfObject.postMessage(["alert", "Hello from HTML"]); } catch (e) { alert( "Error: \n name = " + e.name + "\n message = " + e.message ); } }
Další pokročilé příklady a informace o přidávání kódu JavaScript do souboru PDF pomocí aplikace Acrobat 8 viz Vytváření křížových skriptů obsahu PDF v aplikaci Adobe AIR.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 268 Přidávání obsahu PDF
Skriptování obsahu PDF z kódu ActionScript Kód ActionScript (v obsahu SWF) nedokáže komunikovat přímo s obsahem JavaScript v obsahu PDF. Kód ActionScript však může komunikovat s kódem JavaScript ve stránce HTML načtené v objektu HTMLLoader, který načítá obsah PDF, a tento kód JavaScript může komunikovat s kódem JavaScript v načteném souboru PDF. Další informace viz „Programování v jazycích HTML a JavaScript“ na stránce 226.
Známá omezení obsahu PDF v aplikaci AIR Obsah PDF v aplikaci Adobe AIR má následující omezení:
• Obsah PDF se nezobrazuje v okně (objekt NativeWindow), které je průhledné (kde je vlastnost transparent nastavena na hodnotu true).
• Pořadí zobrazení souboru PDF funguje jinak než jiné objekty zobrazení v aplikaci AIR. I když je podle pořadí zobrazení HTML obsah PDF správně ořezán, v pořadí zobrazení aplikace AIR bude vždy posazen před obsahem.
• Obsah PDF se nezobrazuje v okně v režimu přes celou obrazovku (když je vlastnost displayState vymezené plochy nastavena na hodnotu StageDisplayState.FULL_SCREEN nebo StageDisplayState.FULL_SCREEN_INTERACTIVE).
• Pokud jsou změněny určité vizuální vlastnosti objektu HTMLLoader, který obsahuje dokument PDF, stane se tento dokument PDF neviditelným. Mezi tyto vlastnosti patří vlastnosti filters, alpha, rotation a scaling. Pokud tyto vlastnosti změníte, stane se soubor PDF až do obnovení těchto vlastností neviditelným. To platí i v případě, změníte-li tyto vlastnosti u kontejnerů objektů zobrazení, které tento objekt HTMLLoader obsahují.
• Obsah PDF je viditelný, pouze když je vlastnost scaleMode objektu Stage objektu NativeWindow obsahujícího obsah PDF nastavena na hodnotu StageScaleMode.NO_SCALE. Je-li nastavena na jakoukoli jinou hodnotu, není obsah PDF viditelný.
• Klepnutím na odkazy vedoucí k obsahu v rámci souboru PDF se aktualizuje pozice rolování obsahu PDF. Klepnutím na odkazy vedoucí k obsahu mimo soubor PDF se přesměruje objekt HTMLLoader, který obsahuje PDF (i když je cíl odkazu nové okno).
• Pracovní postupy vkládání komentářů do PDF v prostředí AIR nefungují.
269
Kapitola 25: Použití správy digitálních práv Server Adobe® Flash® Media Rights Management Server (FMRMS) zajišťuje vydavatelům médií schopnost šířit obsah, zejména soubory FLV a MP4, a získat zpět výrobní náklady prostřednictvím přímé (zaplacené uživateli) nebo nepřímé (zaplacené reklamou) úhrady od zákazníků. Vydavatelé šíří média jako zašifrované soubory FLV, které lze stahovat a přehrávat pomocí přehrávače Adobe® Media Player™ nebo libovolné aplikace AIR, jež využívá rozhraní API pro správu digitálních práv (DRM). Se serverem FMRMS mohou poskytovatelé obsahu používat licence založené na identitě k ochraně obsahu pomocí uživatelských oprávnění. Řekněme například, že uživatel chce shlédnout televizní program, ale nechce sledovat s ním spojené reklamy. Aby se sledování reklam vyhnul, zaregistruje se a zaplatí vydavateli obsahu určitou odměnu. Pak může pomocí svých autorizačních oprávnění získat přístup k programu a přehrát si ho bez reklam. Další uživatel může chtít sledovat obsah v režimu offline, zatímco cestuje bez přístupu k Internetu. Po zaregistrování a zaplacení vydavateli obsahu za tuto nadstandardní službu mu autorizační oprávnění umožní přístup k programu, který si může stáhnout z webového místa vydavatele. Uživatel pak může shlédnout daný obsah v režimu offline v povoleném období. Obsah je rovněž chráněn pomocí uživatelských oprávnění a nelze ho sdílet s jinými uživateli. Když se uživatel pokusí přehrát soubor s šifrováním DRM, aplikace se spojí se serverem FMRMS, který se zase spojí se systémem vydavatele obsahu prostřednictvím jeho servisního rozhraní (SPI) za účelem autorizace uživatele a získání licence, tedy povolení, které určuje, zda má uživatel povolen přístup k obsahu, a pokud ano, tak na jak dlouho. Toto povolení rovněž určuje, zda má uživatel k obsahu přístup v režimu offline, a pokud ano, na jak dlouho. Uživatelská oprávnění jsou tedy nezbytná pro určení přístupu k zašifrovanému obsahu. Licence založené na identitě rovněž podporují anonymní přístup. Anonymní přístup může například použít poskytovatel k šíření obsahu podporovaného reklamou nebo k zajištění volného přístupu k aktuálnímu obsahu po určitý počet dní. Archivní materiál lze považovat za nadstandardní obsah, který je nezbytné zaplatit a který vyžaduje uživatelská oprávnění. Poskytovatel obsahu může rovněž určit a vymezit typ a verzi přehrávače potřebného k přehrávání daného obsahu. V této sekci je popsáno, jak lze v aplikaci AIR umožnit přehrávání obsahu chráněného šifrováním pomocí správy digitálních práv. Není nutné vědět, jak se šifruje obsah pomocí DRM, ale předpokládá se, že máte přístup k obsahu s šifrováním DRM a komunikujete se serverem FMRMS, aby bylo možné uživatele autorizovat a získat povolení. Obecné informace o serveru FMRMS, včetně vytváření pravidel, naleznete v dokumentaci přiložené k FMRMS. Informace týkající se přehrávače Adobe Media Player naleznete v nápovědě, která je k dispozici v přehrávači Adobe Media Player.
Další informace o správě digitálních práv online Více informací týkajících se správy digitálních práv naleznete v následujících zdrojích: Referenční příručka jazyka • AuthenticationMethod
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 270 Použití správy digitálních práv
• DRMAuthenticateEvent • DRMContentData • DRMErrorEvent • DRMManager • DRMPlaybackTimeWindow • DRMStatusEvent • DRMVoucher • LoadVoucherSetting • NetStream Články a ukázky aplikace Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (hledat „digital rights management“ nebo „drm“)
Popis toku operací při zpracování zašifrovaných souborů FLV Existují čtyři typy událostí: StatusEvent. DRMAuthenticateEvent, DRMErrorEvent a DRMStatusEvent, jež mohou být odeslány při pokusu aplikace AIR o přehrávání souboru s šifrováním DRM. Pokud mají být tyto soubory podporovány, aplikace by měla přidat posluchače událostí pro zpracování událostí DRM. V následující části je popsán tok operací při načítání a přehrávání obsahu chráněného šifrováním DRM v aplikaci AIR: 1 Aplikace se pomocí objektu NetStream pokusí přehrát soubor FLV nebo MP4. Je-li jeho obsah zašifrovaný, odešle
se událost events.StatusEvent s kódem DRM.encryptedFLV, který značí, že soubor FLV je zašifrovaný. Poznámka: Pokud aplikace nechce soubor s šifrováním DRM přehrávat, může poslouchat událost Status, která se odešle, když aplikace narazí na zašifrovaný obsah, potom uživateli oznámit, že soubor není podporován, a ukončit spojení. 2 Jestliže se jedná o soubor s anonymním šifrováním, což znamená, že jeho obsah mohou prohlížet všichni uživatelé,
aniž by bylo nutné zadávat autorizační oprávnění, přejde aplikace AIR k poslednímu kroku v tomto toku operací. Pokud však soubor vyžaduje licenci založenou na identitě, což znamená, že je vyžadováno uživatelské oprávnění, objekt NetStream odešle objekt DRMAuthenticateEvent. Uživatel musí nejprve poskytnout své autorizační oprávnění a teprve potom bude možné zahájit přehrávání. 3 Aplikace AIR musí zajistit mechanismus pro sběr potřebných autorizačních oprávnění. Pomocí vlastností usernamePrompt, passwordPrompt a urlPrompt třídy DRMAuthenticationEvent, jež poskytuje server obsahu, lze koncovému uživateli sdělit informace o požadovaných datech. Tyto vlastnosti lze použít při tvorbě uživatelského rozhraní pro načítání potřebných uživatelských oprávnění. Například řetězec hodnoty usernamePrompt může udávat, že uživatelské jméno musí být ve formě e-mailové adresy.
Poznámka: Aplikace AIR neposkytuje výchozí uživatelské rozhraní pro sběr autorizačních oprávnění. Napsat uživatelské rozhraní a zpracovat události DRMAuthenticateEvent je úkolem vývojář aplikace. Pokud aplikace nezajistí posluchače událostí pro objekty DRMAuthenticateEvent, zůstane objekt s šifrováním DRM ve stavu „čekání na oprávnění“ a obsah tudíž nebude k dispozici.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 271 Použití správy digitálních práv
4 Jakmile aplikace obdrží uživatelská oprávnění, předá je pomocí metody setDRMAuthenticationCredentials()
do objektu NetStream. To dá objektu NetStream pokyn, že má při nejbližší možné příležitosti zkusit uživatele autorizovat. Aplikace AIR pak předá oprávnění serveru FMRMS kvůli autorizaci. Byl-li uživatel autorizován, aplikace přejde k následujícímu kroku. V případě neúspěšné autorizace odešle objekt NetStream nový objekt DRMAuthenticateEvent a aplikace se vrátí ke 3. kroku. Tento proces se opakuje donekonečna. Aplikace by měla zajistit mechanismus pro zpracování a omezení opakovaných pokusů o autorizaci. Mohla by uživateli například umožnit zrušení pokusu, který může ukončit spojení s objektem NetStream. 5 Po autorizaci uživatele nebo v případě použití anonymního šifrování pak podsystém DRM načte povolení. Toto
povolení slouží ke kontrole, zda je uživatel oprávněn prohlížet obsah. Informace v povolení může platit pro autorizované i anonymní uživatele. Autorizovaní i anonymní uživatelé například mohou mít přístup k obsahu po stanovenou dobu, než vyprší platnost obsahu, nebo nemusí mít k obsahu přístup kvůli tomu, že poskytovatel obsahu nepodporuje verzi zobrazovací aplikace. Jestliže nenastala chyba a uživatel byl úspěšně oprávněn k prohlížení obsahu, odešle objekt NetStream objekt DRMStatusEvent a aplikace AIR zahájí přehrávání. Objekt DRMStatusEvent uchovává informace z příslušného povolení, které určují pravidla a práva uživatele. Například uchovává informace o tom, zda lze obsah zpřístupnit v režimu offline nebo kdy skončí platnost povolení a obsah již nebude možné prohlížet. Pomocí těchto dat může aplikace informovat uživatele o stavu jeho pravidel. Aplikace může například na stavovém řádku zobrazovat zbývající počet dní, kdy může uživatel obsah prohlížet. Pokud má uživatel povolen přístup v režimu offline, povolení se uloží do vyrovnávací paměti a zašifrovaný obsah se stáhne do počítače uživatele a bude přístupný po dobu definovanou v době platnosti offline. Vlastnost detail v události obsahuje údaj „DRM.voucherObtained“. Aplikace rozhodne, kam má být obsah lokálně uložen, aby byl přístupný offline. V prostředí AIR 1.5 lze také povolení pomocí třídy DRMManager načítat předem. Každá chyba týkající se DRM vede k tomu, že aplikace odešle objekt události DRMErrorEvent. Prostředí AIR zpracovává chyby ověření, ke kterým dochází při použití metody setDRMAuthenticationCredentials(), opětovným odesláním objektu DRMAuthenticationEvent. Všechny ostatní události chyb by měla výlučně zpracovávat aplikace. To platí i pro případy, když uživatel zadá platná oprávnění, ale povolení, které zašifrovaný obsah chrání, omezí přístup k obsahu. Autorizovaný uživatel například nemusí mít zatím přístup k obsahu, neboť práva dosud nebyla zaplacena. To může nastat také v případě, kdy dva uživatelé, oba členové registrovaní u stejného vydavatele médií, budou chtít sdílet obsah, za který zaplatil jen jeden z nich. Aplikace by měla uživatele informovat o vzniku chyby, například omezení přístupu k obsahu, a také nabídnout alternativní řešení, například pokyny, jak se zaregistrovat a zaplatit za prohlížení obsahu.
Předběžné načítání povolení pro přehrávání offline Povolení, která jsou potřeba k přehrávání obsahu chráněného systémem DRM, lze načíst předem. Předběžně načtená povolení umožňují, aby uživatelé zobrazovali obsah bez ohledu na to, zda mají aktivní připojení k Internetu. (Samotný proces předběžného načtení přirozeně připojení k internetu vyžaduje.) K předběžnému načítání povolení slouží metoda preloadEmbeddedMetadata() třídy NetStream a třída DRMManager prostředí AIR 1.5. Následující kroky popisují pracovní postup předběžného načtení povolení pro soubor médií chráněný systémem DRM: 1 Soubor médií stáhněte a uložte. (Metadata DRM lze předběžně načítat pouze z místně uložených souborů.) 2 Vytvořte objekty NetConnection a NetStream a dodejte implementace zpětně volané funkce onDRMContentData() a onPlayStatus() klientského objektu NetStream.
3 Vytvořte objekt NetStreamPlayOptions a nastavte vlastnost stream na URL místního souboru médií. 4 Volejte NetStream preloadEmbeddedMetadata() a předejte objekt NetStreamPlayOptions, který identifikuje
soubor médií k analýze.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 272 Použití správy digitálních práv
5 Pokud soubor médií obsahuje metadata DRM, pak je vyvolána zpětně volaná funkce onDRMContentData().
Metadata jsou této funkci předána jako objekt DRMContentData. 6 Objekt DRMContentData použijte pomocí metody DRMManager loadVoucher() k získání povolení.
Pokud má vlastnost authenticationMethod objektu DRMContentData hodnotu userNameAndPassword, pak je třeba před načtením povolení uživatele ověřit na serveru pro správu mediálních práv. Vlastnosti serverURL a domain objektu DRMContentData lze společně s oprávněním uživatele předat metodě DRMManager authenticate(). 7 Když je analýza souboru dokončena, je vyvolána zpětně volaná funkce onPlayStatus(). Pokud nebyla volána
funkce onDRMContentData(), pak soubor neobsahuje metadata, která jsou potřeba k získání povolení (a nemusí být chráněný systémem DRM). Následující ukázkový kód předvádí způsob předběžného načtení povolení DRM z místního souboru médií: package { import flash.display.Sprite; import flash.events.DRMAuthenticationCompleteEvent; import flash.events.DRMAuthenticationErrorEvent; import flash.events.DRMErrorEvent; import flash.ev ents.DRMStatusEvent; import flash.events.NetStatusEvent; import flash.net.NetConnection; import flash.net.NetStream; import flash.net.NetStreamPlayOptions; import flash.net.drm.AuthenticationMethod; import flash.net.drm.DRMContentData; import flash.net.drm.DRMManager; import flash.net.drm.LoadVoucherSetting; public class DRMPreloader extends Sprite { private var videoURL:String = "app-storage:/video.flv"; private var userName:String = "user"; private var password:String = "password"; private var preloadConnection:NetConnection; private var preloadStream:NetStream; private var drmManager:DRMManager = DRMManager.getDRMManager(); private var drmContentData:DRMContentData; public function DRMPreloader():void { drmManager.addEventListener( DRMAuthenticationCompleteEvent.AUTHENTICATION_COMPLETE, onAuthenticationComplete ); drmManager.addEventListener( DRMAuthenticationErrorEvent.AUTHENTICATION_ERROR,onAuthenticationError ); drmManager.addEventListener(DRMStatusEvent.DRM_STATUS, onDRMStatus); drmManager.addEventListener(DRMErrorEvent.DRM_ERROR, onDRMError); preloadConnection = new NetConnection(); preloadConnection.addEventListener(NetStatusEvent.NET_STATUS, onConnect); preloadConnection.connect(null); } private function onConnect( event:NetStatusEvent ):void { preloadMetadata(); } private function preloadMetadata():void {
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 273 Použití správy digitálních práv
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 274 Použití správy digitálních práv
Členové související se systémem DRM a události třídy NetStream Třída NetStream poskytuje jednosměrné streamované připojení mezi aplikací Flash Player nebo aplikací AIR a serverem Flash Media Server nebo místním systémem souborů. (Třída NetStream rovněž podporuje postupné stahování.) Objekt NetStream je kanálem v objektu NetConnection. V aplikaci AIR odesílá třída NetStream čtyři události související se systémem DRM: Událost
Popis
drmAuthenticate
Tato událost je definována ve třídě DRMAuthenticateEvent a odešle se při pokusu objektu NetStream o přehrávání obsahu zašifrovaného pomocí správy digitálních práv (DRM), který před přehráváním vyžaduje uživatelské oprávnění k autorizaci. K vlastnostem této události patří header, usernamePrompt, passwordPrompt a urlPrompt, které lze použít k získání a nastavení oprávnění uživatele. K této události dochází opakovaně, dokud objekt NetStream přijímá platná uživatelská oprávnění.
drmError
Je definována ve třídě DRMErrorEvent a odešle se, když se objekt NetStream při pokusu o přehrávání souboru zašifrovaného pomocí správy digitálních práv (DRM) setká s chybou související s DRM. Objekt události chyby DRM se například odešle při neúspěšné autorizaci uživatele. Může to být proto, že si uživatel nezaplatit práva k prohlížení obsahu nebo že poskytovatel obsahu nepodporuje zobrazovací aplikaci.
drmStatus
Je definována ve třídě DRMStatusEvent a odešle se, když se obsah zašifrovaný pomocí správy digitálních práv (DRM) začne přehrávat (když je uživatel autorizován a oprávněn přehrávat obsah). Objekt DRMStatusEvent obsahuje informace související s povolením, například zda lze obsah zpřístupnit offline nebo kdy skončí platnost povolení a obsah již nebude možné prohlížet.
status
Je definována ve třídě events.StatusEvent a odešle se pouze v případě, že se aplikace pokusí přehrát obsah zašifrovaný pomocí správy digitálních práv (DRM), vyvoláním metody NetStream.play(). Hodnota vlastnosti stavového kódu je „DRM.encryptedFLV“.
Třída NetStream zahrnuje následující metody specifické pro DRM: Metoda
Popis
resetDRMVouchers()
Vymaže z místní vyrovnávací paměti všechna data povolení správy digitálních práv (DRM). Aplikace musí povolení znovu stáhnout, aby měl uživatel přístup k zašifrovanému obsahu. Následující kód například z vyrovnávací paměti odstraní všechna povolení: NetStream.resetDRMVouchers();
setDRMAuthenticationCredentials()
Předává do objektu NetStream sadu autorizačních oprávnění, tj. uživatelské jméno, heslo a typ autorizace, k autorizaci. Platné typy autorizace jsou "drm" a "proxy". U typu autorizace "drm" se poskytnutá oprávnění ověřují se serverem FMRMS. U typu autorizace "proxy" se oprávnění ověřují s proxy serverem a musí odpovídat oprávněním, jež požaduje proxy server. Možnost „proxy“ například umožňuje aplikaci provést ověření se serverem proxy, když podnik takový krok vyžaduje předtím, než může uživatel přistupovat na Internet. Pokud není použita anonymní autorizace, po ověření serverem proxy se musí uživatel autorizovat u serveru FMRMS a získat tak povolení k přehrávání obsahu. Metodu setDRMAuthenticationcredentials() lze použít podruhé s možností "drm" a ověřením u serveru FMRMS.
preloadEmbeddedMetadata()
Analýzou zjišťuje, zda místní soubor médií neobsahuje vložená metadata. Jsou-li nalezena metadata související se systémem DRM, volá aplikace AIR zpětně volanou funkci onDRMContentData() .
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 275 Použití správy digitálních práv
Objekt NetStream navíc vyvolá zpětně volané funkce onDRMContentData() a onPlayStatus() jako výsledek volání metody preloadEmbeddedMetaData(). Funkce onDRMContentData() je volána, když se v souboru médií vyskytnou metadata DRM. Funkce onPlayStatus() je volána, když byl soubor zcela analyzován. Funkce onDRMContentData() a onPlayStatus() je třeba definovat na objektu client, který je přiřazený instanci NetStream. Pokud ten samý objekt NetStream používáte k předběžnému načtení povolení i k přehrávání obsahu, je třeba před spuštěním přehrávání vyčkat na volání onPlayStatus() vygenerované metodou preloadEmbeddedMetaData(). V následujícím kódu je pro autorizaci uživatele nastaveno uživatelské jméno („administrator“), heslo („password“) a typ autorizace „drm“. Metoda setDRMAuthenticationCredentials() musí zajistit oprávnění, která budou odpovídat oprávněním, jež zná a přijímá poskytovatel obsahu (stejná uživatelská oprávnění, která zajistila povolení prohlížet obsah). Tento příklad nezahrnuje kód pro přehrávání videa a zajištění úspěšného připojení ke streamu videa. var connection:NetConnection = new NetConnection(); connection.connect(null); var videoStream:NetStream = new NetStream(connection); videoStream.addEventListener(DRMAuthenticateEvent.DRM_AUTHENTICATE, drmAuthenticateEventHandler) private function drmAuthenticateEventHandler(event:DRMAuthenticateEvent):void { videoStream.setDRMAuthenticationCredentials("administrator", "password", "drm"); }
Použití třídy DRMStatusEvent Objekt NetStream odesílá objekt DRMStatusEvent, když se obsah chráněný pomocí správy digitálních práv (DRM) začne úspěšně přehrávat (když je ověřeno povolení a když je uživatel autorizován a oprávněn přehrávat obsah. Událost DRMStatusEvent se rovněž odesílá pro anonymní uživatele, pokud mají povolen přístup. Kontrolou povolení se zjistí, zda anonymní uživatelé, u nichž není vyžadována autorizace, mají povolen přístup k přehrávání obsahu. Anonymním uživatelům může být zamítnut přístup z několika důvodů. Anonymní uživatelé například nemusí mít k obsahu přístup, protože uplynula jeho platnost. Objekt DRMStatusEvent obsahuje informace související s povolením, například zda lze obsah zpřístupnit offline nebo kdy skončí platnost povolení a obsah již nebude možné prohlížet. Aplikace může pomocí těchto dat sdělit stav pravidel a práv uživatele.
Vlastnosti třídy DRMStatusEvent Třída DRMStatusEvent zahrnuje následující vlastnosti: Vlastnost
Popis
contentData
Objekt DRMContentData obsahující metadata DRM vložená v obsahu.
detail
Řetězec vysvětlující kontext události stavu. Ve verzi DRM 1.0 je jedinou platnou hodnotou DRM.voucherObtained.
isAnonymous
Označuje, zda je obsah chráněný šifrováním DRM dostupný bez toho, aby uživatel musel zadat své přihlašovací údaje (true), či nikoliv (false). Hodnota „false“ znamená, že uživatel musí zadat uživatelské jméno a heslo, jež se bude shodovat s tím, které zná a očekává poskytovatel obsahu.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 276 Použití správy digitálních práv
Vlastnost
Popis
isAvailableOffline
Značí, zda lze obsah chráněný šifrováním DRM zpřístupnit offline (true) či nikoliv (false). Má-li být digitálně chráněný obsah zpřístupněn offline, musí být jeho povolení uloženo do vyrovnávací paměti lokálního počítače uživatele.
isLocal
Určuje, zda je povolení potřebné k přehrávání obsahu v místní vyrovnávací paměti.
offlineLeasePeriod
Zbývající počet dní, po který může být obsah sledovaný v režimu offline.
policies
Vlastní objekt, který může obsahovat vlastní vlastnosti DRM.
voucher
Povolení DRM.
voucherEndDate
Konečné datum, kdy uplyne platnost povolení a obsah již nebude možné prohlížet.
Vytváření zpracování události DRMStatusEvent V následujícím příklad se vytvoří zpracování události, jež vygeneruje informace o stavu obsahu DRM pro objekt NetStream, který událost spustil. Přidejte tohoto posluchače událostí k objektu NetStream, který míří k obsahu s šifrováním DRM. function drmStatusEventHandler(event:DRMStatusEvent):void { trace(event); } function drmStatusEventHandler(event:DRMStatusEvent):void { trace(event); }
Použití třídy DRMAuthenticateEvent Objekt DRMAuthenticateEvent se odešle při pokusu objektu NetStream o přehrávání obsahu zašifrovaného pomocí správy digitálních práv (DRM), který před přehráváním vyžaduje uživatelské oprávnění k autorizaci. Zpracování události DRMAuthenticateEvent je odpovědné za získávání potřebných oprávnění (jméno uživatele, heslo a typ) a předávání těchto hodnot do metody NetStream.setDRMAuthenticationCredentials() k ověření. Každá aplikace AIR musí poskytnout jistý mechanismu k získání osobních přihlašovacích údajů uživatele. Aplikace může například uživateli poskytnout jednoduché rozhraní k zadání uživatelského jména a hesla a volitelně i typové hodnoty. Aplikace AIR by rovněž měla zajistit mechanismus pro zpracování a omezení opakovaných pokusů o autorizaci.
Vlastnosti třídy DRMAuthenticateEvent Třída DRMAuthenticateEvent zahrnuje následující vlastnosti:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 277 Použití správy digitálních práv
Vlastnost
Popis
authenticationType
Značí, zda jsou poskytnutá oprávnění určena k ověření se serverem FMRMS („drm“) nebo s proxy serverem („proxy“). Možnost „proxy“ například umožňuje aplikaci provést ověření se serverem proxy, když podnik takový krok vyžaduje předtím, než může uživatel přistupovat na Internet. Pokud není použita anonymní autorizace, po ověření serverem proxy se musí uživatel autorizovat u serveru FMRMS a získat tak povolení k přehrávání obsahu. Metodu setDRMAuthenticationcredentials() lze použít podruhé s možností „drm“ a ověřením u serveru FMRMS.
header
Záhlaví souboru se zašifrovaným obsahem, poskytnuté serverem. Obsahuje informace o kontextu zašifrovaného obsahu.
netstream
Objekt NetStream, který inicializoval tuto událost.
passwordPrompt
Výzva k zadání hesla uživatele, poskytnutá serverem. Řetězec může zahrnovat pokyn pro typ vyžadovaného hesla.
urlPrompt
Výzva pro řetězec adresy URL, poskytnutá serverem. Řetězec může poskytnout umístění, kam se odešle uživatelské jméno a heslo.
usernamePrompt
Výzva k zadání uživatelského jména, poskytnutá serverem. Řetězec může zahrnovat pokyn pro typ vyžadovaného uživatelského jména. Poskytovatel obsahu může například jako uživatelské jméno vyžadovat emailovou adresu.
Vytváření zpracování události DRMAuthenticateEvent V následujícím příklad se vytvoří zpracování události, jež předá naprogramovaná autorizační oprávnění do objektu NetStream, který událost spustil. (Tento příklad nezahrnuje kód pro přehrávání videa a zajištění úspěšného připojení ke streamu videa.) var connection:NetConnection = new NetConnection(); connection.connect(null); var videoStream:NetStream = new NetStream(connection); videoStream.addEventListener(DRMAuthenticateEvent.DRM_AUTHENTICATE, drmAuthenticateEventHandler) private function drmAuthenticateEventHandler(event:DRMAuthenticateEvent):void { videoStream.setDRMAuthenticationCredentials("administrator", "password", "drm"); }
Vytvoření rozhraní pro načítání uživatelských oprávnění V případech, kdy obsah DRM vyžaduje autorizaci uživatele, aplikace AIR obvykle potřebuje načíst autorizační oprávnění uživatele prostřednictvím uživatelského rozhraní.
Použití třídy DRMErrorEvent Aplikace AIR odešle objekt DRMErrorEvent, když se objekt NetStream při pokusu o přehrávání souboru zašifrovaného pomocí správy digitálních práv (DRM) setká s chybou související s DRM. V případě neplatných oprávnění uživatele bude objekt DRMAuthenticateEvent zpracovávat chybu opakovaným odesíláním, dokud uživatel nezadá platné přihlašovací údaje nebo dokud aplikace AIR neodmítne další pokusy. Aplikace by měla poslouchat všechny další události chyb DRM a tak zjišťovat, identifikovat a zpracovávat chyby související s DRM.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 278 Použití správy digitálních práv
Přestože uživatel zadá platná oprávnění, nemusí mu být v závislosti na podmínkách povolení DRM dovoleno prohlížet zašifrovaný obsah. Například když se uživatel pokusí prohlížet obsah v neautorizované aplikaci, tedy v aplikaci, jež není ověřena vydavatelem zašifrovaného obsahu. V takovém případě bude odeslán objekt DRMErrorEvent. Události chyb se rovněž může spustit, pokud je obsah poškozený nebo pokud verze aplikace neodpovídá údajům obsaženým v povolení. Aplikace musí zajistit vhodný mechanismus pro zpracování chyb.
Vlastnosti třídy DRMErrorEvent V následující tabulce jsou uvedeny chyby hlášené objektem DRMErrorEvent: Kód závažné chyby
Kód drobné chyby
Podrobnosti chyby
1001
nepoužívá se
Ověření uživatele se nezdařilo.
1002
nepoužívá se
Flash Media Rights Management Server (FMRMS) nepodporuje protokol SSL (Secure Sockets Layer).
1003
nepoužívá se
Platnost obsahu uplynula a obsah již není možné prohlížet.
1004
nepoužívá se
Chyba ověření uživatele. Může nastat například v případě, že si uživatel obsah nekoupil a nemá tedy práva k jeho prohlížení.
1005
nepoužívá se
1006
nepoužívá se
Vyžaduje se aktualizace klienta, tzn. server Flash Media Rights Management Server (FMRMS) vyžaduje nový stroj správy digitálních práv (DRM).
1007
nepoužívá se
Obecná interní chyba.
1008
Podrobný kód chyby dešifrování
Nesprávný licenční klíč.
1009
nepoužívá se
Obsah FLV je poškozený.
1010
nepoužívá se
1011
nepoužívá se
Verze aplikace neodpovídá verzi specifikované pravidly.
1012
nepoužívá se
Ověření povolení přiřazeného k zašifrovanému obsahu se nezdařilo; existuje možnost, že obsah je poškozen.
1013
nepoužívá se
Povolení přiřazené k zašifrovanému obsahu nebylo možné uložit.
1014
nepoužívá se
Ověření integrity záhlaví souboru FLV se nezdařilo; existuje možnost, že obsah je poškozen.
Server URL
publisherID:applicationID
Popis
Nelze se připojit k serveru.
ID zobrazovací aplikace neodpovídá platnému ID podporovanému vydavatelem obsahu.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 279 Použití správy digitálních práv
Kód závažné chyby
ID drobné chyby
Podrobnosti chyby
3300
Kód chyby serveru Adobe Policy Server
Aplikace zjistila neplatné povolení přiřazené k obsahu.
3301
nepoužívá se
Ověření uživatele se nezdařilo.
3302
nepoužívá se
Protokol SSL (Secure Sockets Layer) není serverem správy oprávnění Flash Media Rights Management Server (FMRMS) podporován.
3303
nepoužívá se
Platnost obsahu uplynula a obsah již není možné prohlížet.
3304
nepoužívá se
Chyba ověření uživatele. K tomu může dojít i v případě, že je uživatel ověřen, například pokud si uživatel nezakoupil oprávnění k zobrazení obsahu.
3305
nepoužívá se
3306
nepoužívá se
Vyžaduje se aktualizace klienta; server Flash Media Rights Management Server (FMRMS) vyžaduje nový stroj správy digitálních práv klienta.
3307
nepoužívá se
Obecná interní porucha správy digitálních práv.
3308
Podrobný kód chyby dešifrování
Nesprávný licenční klíč.
3309
nepoužívá se
Obsah videa Flash je poškozený.
3310
nepoužívá se
publisherID:applicationID
ID zobrazovací aplikace neodpovídá platnému ID podporovanému vydavatelem obsahu. Jinými slovy, zobrazovací aplikace není podporována vydavatelem obsahu.
3311
nepoužívá se
min=x:max=y
Verze aplikace neodpovídá údajům obsaženým v povolení.
3312
nepoužívá se
Ověření povolení přiřazeného k zašifrovanému obsahu se nezdařilo; existuje možnost, že obsah je poškozen.
3313
nepoužívá se
Povolení přiřazené k zašifrovanému obsahu nebylo možné uložit do aplikace Microsafe.
3314
nepoužívá se
Ověření integrity záhlaví souboru FLV se nezdařilo; existuje možnost, že obsah je poškozen.
3315
nepoužívá se
Vzdálené přehrávání obsahu chráněného DRM není povoleno.
3316
nepoužívá se
Chybějící modul AdobeCP.
3317
nepoužívá se
Načtení modulu AdobeCP selhalo.
3318
nepoužívá se
Nalezena nekompatibilní verze modulu AdobeCP.
3319
nepoužívá se
Chybějící vstupní bod rozhraní modulu AdobeCP.
3320
nepoužívá se
Modul AdobeCP není ověřen.
Server URL
Popis
Nelze se připojit k serveru.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 280 Použití správy digitálních práv
Vytváření zpracování události DRMErrorEvent V následujícím příklad se vytvoří zpracování události pro objekt NetStream, který událost spustil. To se vyvolá, když objekt NetStream narazí při pokusu o přehrávání obsahu s šifrováním DRM na chybu. Obvykle, když aplikace narazí na chybu, provede libovolný počet úloh pro vyčištění, informuje uživatele o chybě a nabídne možnosti pro vyřešení daného problému. private function drmErrorEventHandler(event:DRMErrorEvent):void { trace(event.toString()); }
Použití třídy DRMManager Třída DRMManager slouží v aplikaci AIR ke správě povolení a ke správě relací serverů práv médií. Třída DRMManager je dostupná od verze AIR 1.5 nebo novější. Správa povolení Kdykoli uživatel přehrává soubor médií chráněný DRM online, aplikace AIR získává a umisťuje do vyrovnávací paměti licenční povolení, které je k zobrazení tohoto obsahu potřeba. Pokud aplikace soubor uloží místně, umožňuje povolení přehrávání offline. Uživatel pak může zobrazovat obsah dokonce i tehdy, když není připojení k serveru práv médií dostupné. Povolení můžete předběžně načíst pomocí metody preloadEmbeddedMetadata() tříd DRMManager a NetStream, takže aplikace nebude muset k získání licence, která bude k zobrazení obsahu potřeba, iniciovat přehrávání. Aplikace by například mohla stáhnout soubor médií a pak získat povolení, dokud je uživatel stále online. Chcete-li předběžně načíst povolení, získejte pomocí metody preloadEmbeddedMetadata() objekt DRMContentData. Objekt DRMContentData obsahuje URL a doménu serveru práv médií, který může poskytovat licenci, a popisuje, zda je třeba ověření uživatele. Máte-li tyto informace, můžete voláním metody loadVoucher() třídy DRMManager získat povolení a umístit ho do vyrovnávací paměti. Pracovnímu postupu předběžného načítání povolení je podrobněji věnována část „Předběžné načítání povolení pro přehrávání offline“ na stránce 271. Správa relace Třída DRMManager také slouží k ověření uživatele na serveru práv médií a ke správě trvalých relací. Chcete-li ustavit relaci se serverem práv médií, volejte metodu DRMManager authenticate(). Je-li ověření úspěšně dokončeno, odešle třída DRMManager objekt DRMAuthenticationCompleteEvent. Tento objekt obsahuje token relace. Tento token můžete uložit, takže uživatel nemusí pro ustavení budoucích relací poskytovat oprávnění účtu. Chcete-li ustavit novou relaci ověřování, předejte tento token metodě setAuthenticationToken(). (Vypršení platnosti tokenu a další atributy jsou určeny nastaveními serveru, který tento token vygeneruje. Struktura dat tokenu není určena k interpretaci kódem aplikace AIR a v budoucích aktualizacích aplikace AIR může být změněna.) Ověřovací tokeny lze přenášet do jiných počítačů. Chcete-li tokeny chránit, uložte je do šifrovaného místního úložiště aplikace AIR. Další informace viz část „Ukládání šifrovaných dat“ na stránce 208.
Události DRMStatus Třída DRMManager odesílá objekt DRMStatusEvent po úspěšném dokončení volání metody loadVoucher(). Pokud je získáno povolení, bude mít vlastnost „detail“ objektu události hodnotu „DRM.voucherObtained“ a vlastnost voucher bude obsahovat objekt DRMVoucher.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 281 Použití správy digitálních práv
Pokud povolení získáno není, bude mít sice vlastnost detail stále hodnotu „DRM.voucherObtained“, vlastnost voucher bude ale mít hodnotu null. Povolení například není možné získat, pokud používáte v nastavení LoadVoucherSetting hodnotu localOnly a v místní vyrovnávací paměti žádné povolení není. Pokud není volání loadVoucher() úspěšně dokončeno (například z důvodu chyby ověřování nebo komunikace), pak místo toho odešle třída DRMManager objekt DRMErrorEvent.
Události DRMAuthenticationComplete Když je uživatel úspěšně ověřen pomocí volání metody authenticate(), odesílá třída DRMManager objekt DRMAuthenticationCompleteEvent. V aplikaci AIR 1.5 obsahuje objekt DRMAuthenticationCompleteEvent opakovaně použitelný token, který slouží k trvalému ověření uživatele v rámci několika relací aplikace. Chcete-li znovu ustavit relaci, předejte tento token metodě DRMManager setAuthenticationToken(). (Atributy tokenu, například vypršení platnosti, nastavuje tvůrce tokenu. Aplikace AIR neposkytuje pro prozkoumání atributů tokenu žádné rozhraní API.)
Události DRMAuthenticationError Když nemůže být uživatel úspěšně ověřen pomocí volání metod authenticate() nebo setAuthenticationToken(), odesílá třída DRMManager objekt DRMAuthenticationErrorEvent.
Použití třídy DRMContentData Objekt DRMContentData obsahuje vlastnosti metadat souboru médií chráněného DRM. Vlastnosti objektu DRMContentData obsahují informace, které jsou potřeba k získání licenčního povolení pro zobrazování obsahu.
282
Kapitola 26: Možnosti spuštění a ukončení aplikací V této sekci jsou vysvětleny možnosti a pokyny pro spuštění nainstalované aplikace Adobe® AIR™, jakož i možnosti a pokyny pro ukončení spuštěné aplikace.
Vyvolání aplikací Aplikace AIR se vyvolá, když uživatel (nebo operační systém):
• vyvolá aplikaci z tvůrce prostředí; • použije aplikaci jako příkaz v interpretu příkazového řádku; • otevře typ souboru, pro který je aplikace výchozí aplikací pro otevření; • (Mac OS X) klepne na ikonu aplikace na hlavním panelu ukotvení (bez ohledu na to, zda je aplikace v danou chvíli spuštěna či nikoliv);
• spustí aplikaci z instalátoru (buď na konci nového instalačního procesu, nebo poklepáním na soubor AIR u již nainstalované aplikace);
• zahájí aktualizaci aplikace AIR, když nainstalovaná verze signalizuje, že sama zpracovává aktualizace aplikace (začleněním deklarace <customUpdateUI>true do souboru deskriptoru aplikace);
• navštíví webovou stránku hostující identifikátor Flash nebo aplikaci, která vyvolá metodu com.adobe.air.AIR launchApplication() určující identifikační informace pro aplikaci AIR. (Deskriptor aplikace musí rovněž zahrnovat deklaraci true, aby vyvolání prohlížeče bylo úspěšné.) Viz sekce „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 308.
Při každém vyvolání aplikace AIR odešle aplikace AIR objekt InvokeEvent typu invoke prostřednictvím jediné instance objektu NativeApplication. Aby aplikace měla čas se inicializovat a zaregistrovat posluchače událostí, umístí se události invoke do fronty místo toho, aby byly vyřazeny. Po zaregistrování posluchače jsou všechny události ve frontě doručeny. Poznámka: Jestliže je aplikace vyvolána pomocí funkce vyvolání z prohlížeče, odešle objekt NativeApplication událost invoke jen v případě, že aplikace dosud není spuštěna. Viz sekce „Spuštění nainstalované aplikace AIR z prohlížeče“ na
stránce 308. Chcete-li přijmout události invoke, vyvolejte metodu addEventListener() objektu NativeApplication (NativeApplication.nativeApplication). Když posluchač událostí zaregistruje událost invoke, obdrží také všechny události invoke, které nastaly před registrací. Události invoke umístěné ve frontě se odesílají po jedné v krátkém intervalu poté, co se vrátí vyvolání funkce addEventListener(). Pokud v průběhu tohoto procesu nastane nová událost invoke, může být odeslána dříve než jedna či více událostí ve frontě. Díky tomuto řazení událostí do fronty lze zpracovat všechny události invoke, k nimž došlo před provedením inicializačního kódu. Mějte na paměti, že pokud přidáte posluchače událostí později během provádění (po inicializaci aplikace), přesto obdrží všechny události invoke, které nastaly od spuštění aplikace. Spouští se jen jedna instance aplikace AIR. Jestliže bude již spuštěná aplikace znovu vyvolána, aplikace AIR odešle novou událost invoke do spuštěné instance. Úkolem aplikace AIR je reagovat na událost invoke a provést odpovídající akci (např. otevřít nové okno s dokumentem).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 283 Možnosti spuštění a ukončení aplikací
Objekt InvokeEvent obsahuje všechny argumenty předané do aplikace, jakož i adresář, z něhož byla aplikace vyvolána. Byla-li aplikace vyvolána kvůli přiřazení k typu souboru, bude do argumentů příkazového řádku zahrnuta úplná cesta k tomuto souboru. Stejně tak pokud byla aplikace vyvolána z důvodu aktualizace aplikace, bude poskytnuta úplná cesta k aktualizačnímu souboru aplikace AIR. Když je v jedné operaci otevřeno více souborů, je v systému Mac OS X odeslán jediný objekt InvokeEvent. Všechny soubory jsou zahrnuty do pole arguments. V systémech Windows i Linux je pro každý soubor odeslán samostatný objekt InvokeEvent. Aplikace může události invoke zpracovávat zaregistrováním posluchače pomocí objektu NativeApplication: NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvokeEvent); air.NativeApplication.nativeApplication.addEventListener(air.InvokeEvent.INVOKE, onInvokeEvent);
A definováním posluchače událostí: var arguments:Array; var currentDir:File; public function onInvokeEvent(invocation:InvokeEvent):void { arguments = invocation.arguments; currentDir = invocation.currentDirectory; }
Zachycení argumentů příkazového řádku Argumenty příkazového řádku spojené s vyvoláním aplikace AIR jsou doručeny v události invoke odeslané objektem NativeApplication. Vlastnost InvokeEvent.arguments obsahuje pole argumentů předávaných operačním systémem při vyvolání aplikace AIR. Jestliže argumenty obsahují relativní cesty k souborům, obvykle je možné cesty rozlišit pomocí vlastnosti currentDirectory. S argumenty předanými do programu aplikace AIR se zachází jako s řetězci oddělenými prázdnými místy (mezerami), pokud nejsou uzavřeny v uvozovkách. Argumenty
Array
tick tock
{tick,tock}
tick "tick tock"
{tick,tick tock}
"tick" “tock”
{tick,tock}
\"tick\" \"tock\"
{"tick","tock"}
Vlastnost InvokeEvent.currentDirectory obsahuje objekt File představující adresář, z něhož byla spuštěna aplikace. Při vyvolání aplikace následkem otevření typu souboru zaregistrovaného aplikací bude do argumentů příkazového řádku zahrnuta nativní cesta k souboru ve formě řetězce. (Úkolem aplikace je soubor otevřít nebo s ním provést zamýšlenou operaci.) Stejně tak když je aplikace naprogramována tak, aby se sama aktualizovala (místo toho, aby se spoléhala na standardní uživatelské rozhraní pro aktualizaci aplikace AIR), a uživatel poklepe na soubor AIR obsahující aplikaci s odpovídajícím ID aplikace, bude zahrnuta nativní cesta k souboru AIR. K souboru lze získat přístup pomocí metody resolve() objektu File currentDirectory:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 284 Možnosti spuštění a ukončení aplikací
Rovněž je vhodné ověřit, že argument je skutečně cestou k souboru.
Příklad: Záznam událostí vyvolání Následující příklad znázorňuje způsob registrace posluchačů a zpracování události invoke. V tomto příkladu se zaznamenají všechny přijaté události vyvolání a zobrazí se aktuální adresář a argumenty příkazového řádku. Poznámka: Chcete-li vytvořit následující příklad pomocí aplikace Adobe® Flash® CS3 Professional nebo Adobe® Flash® CS4 Professional, vytvořte nejprve soubor Flash (Adobe AIR). V panelu nastavení jazyka ActionScript 3.0 (Soubor > Nastavení publikování... > tlačítko Nastavení) zadejte do pole třídy Document název InvokeEventLogExample. Uložete soubor FLA s názvem InvokeEventLogExample.fla. Potom ve stejné složce vytvořte soubor ActionScript. Zadejte do souboru ActionScript následující kód a soubor uložte s názvem InvokeEventLogExample.as. package { import import import import
public class InvokeEventLogExample extends Sprite { public var log:TextField; public function InvokeEventLogExample() { log = new TextField(); log.x = 15; log.y = 15; log.width = 520; log.height = 370; log.background = true; addChild(log); NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke); } public function onInvoke(invokeEvent:InvokeEvent):void { var now:String = new Date().toTimeString(); logEvent("Invoke event received: " + now); if (invokeEvent.currentDirectory != null) { logEvent("Current directory=" + invokeEvent.currentDirectory.nativePath); } else {
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 285 Možnosti spuštění a ukončení aplikací
logEvent("--no directory information available--"); } if (invokeEvent.arguments.length > 0) { logEvent("Arguments: " + invokeEvent.arguments.toString()); } else { logEvent("--no arguments--"); } } public function logEvent(entry:String):void { log.appendText(entry + "\n"); trace(entry); } } }
Spuštění při přihlášení Aplikaci AIR lze nastavit na automatické spuštění při přihlášení aktuálního uživatele nastavením možnosti NativeApplication.nativeApplication.startAtLogin=true. Po provedení tohoto nastavení se aplikace automaticky spustí pokaždé, když se uživatel přihlásí. Spouštění při startu bude probíhat, dokud nebude nastavení změněno na hodnotu false, dokud uživatel ručně nezmění nastavení prostřednictvím operačního systému nebo dokud aplikace nebude odinstalována. Spuštění při přihlášení je nastavení prováděné za běhu. Poznámka: Aplikace se nespusí při startu počítačového systému. Spustí se po přihlášení uživatele. Toto nastavení platí pouze pro aktuálního uživatele. Kromě toho musí být aplikace nainstalovaná, aby bylo možné úspěšně nastavit vlastnost startAtLogin na hodnotu true. Pokud bude tato vlastnost nastavena bez toho, aby byla aplikace nainstalovaná (například při spuštění pomocí ADL), bude vrácena chyba.
Vyvolání z prohlížeče Pomocí funkce vyvolání z prohlížeče může webové místo spustit instalovanou aplikaci AIR, jež má být spuštěna z prohlížeče. Spuštění z prohlížeče je povoleno jen tehdy, když soubor deskriptoru aplikace nastaví možnost allowBrowserInvocation na hodnotu true: true
Další informace o souboru deskriptoru aplikace naleznete v části „Nastavení vlastností aplikace AIR“ na stránce 43. Při vyvolání aplikace prostřednictvím prohlížeče bude objektem NativeApplication aplikace vyvolán objekt BrowserInvokeEvent.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 286 Možnosti spuštění a ukončení aplikací
Chcete-li přijmout události BrowserInvokeEvent, vyvolejte metodu addEventListener() objektu NativeApplication (NativeApplication.nativeApplication) v aplikaci AIR. Když posluchač událostí zaregistruje událost BrowserInvokeEvent, obdrží také všechny události BrowserInvokeEvent, které nastaly před registrací. Tyto události jsou odeslány poté, co je vráceno vyvolání metody addEventListener(), avšak nikoliv nutně před dalšími událostmi BrowserInvokeEvent, které by mohly být přijaty po registraci. To umožňuje zpracovat události BrowserInvokeEvent, které nastaly před provedením inicializačního kódu (například při původním vyvolání aplikace z prohlížeče). Mějte na paměti, že pokud přidáte posluchače událostí později během provádění (po inicializaci aplikace), přesto obdrží všechny události BrowserInvokeEvent, které nastaly od spuštění aplikace. Objekt BrowserInvokeEvent zahrnuje následující vlastnosti: Vlastnost
Popis
arguments
Pole argumentů (řetězců) pro předání aplikaci.
isHTTPS
Zda obsah v prohlížeči používá schéma URL https (true) či nikoliv (false).
isUserEvent
Zda vyvolání prohlížeče vedlo k uživatelské události (například klepnutí myší). V aplikaci AIR 1.0 je tato vlastnost vždy nastavena na hodnotu true; AIR vyžaduje, aby uživatel aktivoval vyvolání funkce vyvolání z prohlížeče.
sandboxType
Typ karantény pro obsah v prohlížeči. Platné hodnoty jsou definovány stejně jako hodnoty, které lze použít ve vlastnosti Security.sandboxType, a mohou být následující:
•
Security.APPLICATION – obsah je v aplikační karanténě zabezpečení.
•
Security.LOCAL_TRUSTED – obsah je v místní důvěryhodné karanténě zabezpečení.
•
Security.LOCAL_WITH_FILE – obsah je v místní důvěryhodné karanténě zabezpečení se souborovým
systémem.
securityDomain
•
Security.LOCAL_WITH_NETWORK – obsah je v místní důvěryhodné karanténě zabezpečení se sítí.
•
Security.REMOTE – obsah je ve vzdálené doméně.
Doména zabezpečení pro obsah v prohlížeči, například "www.adobe.com" nebo "www.example.org". Tato vlastnost se nastavuje pouze pro obsah ve vzdálené karanténě zabezpečení (pro obsah ze síťové domény). Pro obsah v místní nebo aplikační karanténě zabezpečení se nenastavuje.
Při použití funkce vyvolání z prohlížeče je vhodné dobře zvážit možné dopady na zabezpečení. Když webové místo spustí aplikaci AIR, může odesílat data prostřednictvím vlastnosti arguments objektu BrowserInvokeEvent. Buďte opatrní při použití těchto dat při citlivých operacích, například jako soubor nebo kód načítající rozhraní API. Míra rizika závisí na tom, co aplikace s daty provádí. Pokud očekáváte, že aplikaci vyvolá jen určité webové místo, měla by aplikace zkontrolovat vlastnost securityDomain objektu BrowserInvokeEvent. Rovněž lze požadovat, aby webové místo vyvolávající aplikaci používalo protokoly HTTP, což je možné ověřit při kontrole vlastnosti isHTTPS objektu BrowserInvokeEvent. Aplikace by měla ověřit data, která se do ní předávají. Jestliže aplikace například očekává, že do ní budou předány adresy URL k určité doméně, měla by ověřit, že skutečně směřují k dané doméně. Tím lze zabránit tomu, aby se aplikace nechala oklamat útočníkem a poslala mu citlivá data. Žádná aplikace by neměla používat argumenty BrowserInvokeEvent, které by mohly směřovat k místním zdrojům. Aplikace by například neměla vytvářet objekty File na základě cesty předané z prohlížeče. Pokud mají být z prohlížeče předávány vzdálené cesty, měla by aplikace zajistit, aby tyto cesty nepoužívaly protokol file:// místo vzdáleného protokolu. Podrobnosti týkající se spouštění aplikace z prohlížeče naleznete v sekci „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 308.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 287 Možnosti spuštění a ukončení aplikací
Ukončení aplikace Nejrychlejší způsob ukončení aplikace je vyvolat metodu NativeApplication.nativeApplication.exit(). Tento postup funguje dobře, když aplikace nemusí ukládat žádná data ani čistit žádné externí zdroje. Po vyvolání metody exit() se zavřou všechna okna a potom se ukončí aplikace. Aby však mohla okna či jiné komponenty v aplikaci proces ukončení přerušit, například kvůli uložení důležitých dat, je vhodné odeslat před vyvoláním metody exit() náležitá upozornění. Dále je pro zajištění správného ukončení aplikace vhodné zvážit poskytnutí jediné cesty pro provádění, bez ohledu na to, jakým způsobem bude proces vypnutí zahájen. Uživatel (nebo operační systém) může spustit ukončení aplikace následujícími způsoby:
• Zavřením posledního okna aplikace, když je možnost NativeApplication.nativeApplication.autoExit nastavena na hodnotu true.
• Zvolením příkazu ukončení aplikace z operačního systému, například když uživatel vybere příkaz ukončení aplikace z výchozí nabídky. K tomu dochází pouze u systému Mac OS; systémy Windows i Linux neposkytují příkaz ukončení aplikace prostřednictvím systémových prvků.
• Vypnutím počítače. Když se příkaz ukočení provede jedním z těchto způsobů prostřednictvím operačního systému, objekt NativeApplication vyvolá událost exiting. Pokud nebude událost exiting zrušena žádným posluchačem, zavřou se všechna otevřená okna. Každé okno odešle událost closing a potom událost close. Jestliže některé okno událost closing zruší, proces vypínání se zastaví. V případě, že v dané aplikaci záleží na pořadí zavírání oken, poslouchejte událost exiting z objektu NativeApplication a sami zavřete okna ve správném pořadí. To může nastat například u okna dokumentu s paletami nástrojů. Mohlo by to být nepraktické (nebo i horší), pokud by systém zavřel palety, ale uživatel by se rozhodl příkaz ukončení zrušit, aby mohl uložit nějaká data. V systému Windows nastane událost exiting jedině po zavření posledního okna (když je vlastnost autoExit objektu NativeApplication nastavena na hodnotu true). Chcete-li zachovat jednotné chování na všech platformách bez ohledu na to, zda bude proces ukončení vyvolán pomocí systémových prvků operačního systému, příkazů nabídky nebo logiky aplikace, dodržujte následující doporučené postupy pro ukončení aplikace: 1 Vždy odešlete událost exiting pomocí objektu NativeApplication před vyvoláním metody exit() v kódu aplikace
a zkontrolujte, že žádná jiná komponenta aplikace tuto událost nezruší. public function applicationExit():void { var exitingEvent:Event = new Event(Event.EXITING, false, true); NativeApplication.nativeApplication.dispatchEvent(exitingEvent); if (!exitingEvent.isDefaultPrevented()) { NativeApplication.nativeApplication.exit(); } }
2 Poslouchejte událost exiting aplikace z objektu NativeApplication.nativeApplication a ve zpracování
zavřete všechna okna (tak, že nejprve odešlete událost closing). Po zavření všech oken proveďte potřebné úlohy pro vyčištění, například uložení dat aplikace nebo odstranění dočasných souborů. Při čištění používejte jen synchronní metody, aby skončily ještě před zavřením aplikace. Jestliže nezáleží na pořadí zavírání oken, můžete vytvořit smyčku přes pole NativeApplication.nativeApplication.openedWindows a postupně jednotlivá okna zavřít. V případě, že na pořadí záleží, zajistěte metodu pro zavření oken ve správném pořadí.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 288 Možnosti spuštění a ukončení aplikací
private function onExiting(exitingEvent:Event):void { var winClosingEvent:Event; for each (var win:NativeWindow in NativeApplication.nativeApplication.openedWindows) { winClosingEvent = new Event(Event.CLOSING,false,true); win.dispatchEvent(winClosingEvent); if (!winClosingEvent.isDefaultPrevented()) { win.close(); } else { exitingEvent.preventDefault(); } } if (!exitingEvent.isDefaultPrevented()) { //perform cleanup } }
3 Okna by měla vždy provádět vlastní operace čištění posloucháním vlastních událostí closing. 4 Použijte v aplikaci jen jeden posluchač události exiting, neboť zpracování vyvolané dříve by nepoznalo, zda
pozdější zpracování událost exiting nezruší (a není moudré spoléhat jen na pořadí provádění).
Viz také „Nastavení vlastností aplikace AIR“ na stránce 43 „Představení vlastního uživatelského rozhraní pro aktualizaci aplikace“ na stránce 317
289
Kapitola 27: Čtení nastavení aplikace Za běhu můžete získat vlastnosti souboru deskriptoru aplikace i ID vydavatele aplikace. Tyto hodnoty jsou nastaveny ve vlastnostech applicationDescriptor a publisherID objektu NativeApplication.
Čtení souboru deskriptoru aplikace Soubor deskriptoru aplikace aktuálně spuštěné aplikace můžete číst jako objekt XML, a to získáním vlastnosti applicationDescriptor objektu NativeApplication. Viz následující příklad: var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
K datům desktriptoru aplikace můžete získat přístup jako k objektu XML (E4X), viz následující příklad: var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor; var ns:Namespace = appXml.namespace(); var appId = appXml.ns::id[0]; var appVersion = appXml.ns::version[0]; var appName = appXml.ns::filename[0]; air.trace("appId:", appId); air.trace("version:", appVersion); air.trace("filename:", appName); var xmlString = air.NativeApplication.nativeApplication.applicationDescriptor;
Více informací naleznete v tématu „Struktura souboru deskriptoru aplikace“ na stránce 43.
Získávání identifikátorů aplikace a vydavatele ID aplikace a vydavatele společně jedinečným způsobem identifikují aplikaci AIR. ID aplikace určíte v elementu deskriptoru aplikace. ID vydavatele je odvozeno od certifikátu použitého k podpisu balíku instalace AIR. ID aplikace lze číst z vlastnosti objektu NativeApplication id, viz následující kód: trace(NativeApplication.nativeApplication.applicationID);
ID vydavatele lze číst z vlastnosti objektu NativeApplication publisherID: trace(NativeApplication.nativeApplication.publisherID);
Poznámka: Když aplikace AIR běží s programem ADL, nemá ID vydavatele, pokud není ID přiřazeno přechodně pomocí příznaku -pubID na příkazovém řádku ADL. ID vydavatele pro nainstalovanou aplikaci lze nalézt v souboru META-INF/AIR/publisherid v instalačním adresáři aplikace. Více informací naleznete v tématu „O identifikátorech vydavatele AIR“ na stránce 311.
290
Kapitola 28: Práce s runtime a informacemi operačního systému Tato část se věnuje způsobům, kterými může aplikace AIR spravovat asociace souboru operačního systému, zjišťovat aktivitu uživatele a získávat informace o době běhu Adobe® AIR™.
Správa asociací souboru Asociace mezi vaší aplikací a typem souboru musí být deklarovány v deskriptoru aplikace. Během procesu instalace přiřadí instalátor aplikace AIR tuto aplikaci jako výchozí aplikaci otevření pro každý z deklarovaných typů souborů, pokud již není výchozí jiná aplikace. Proces instalace aplikace AIR nepotlačí stávající asociaci typu souboru. Pro přebrání asociace z jiné aplikace volejte v době běhu metodu NativeApplication.setAsDefaultApplication(). Při spuštění aplikace je dobrým postupem ověřit, zda jsou očekávané asociace souborů na svém místě. Důvodem je to, že instalátor aplikace AIR nepotlačí stávající asociace souboru, a že asociace souboru v systému uživatele se mohou kdykoliv změnit. Když má jiná aplikace aktuální asociaci souboru, je také dobrým postupem dotázat se uživatele před přebráním stávající asociace. Následující metody třídy NativeApplication umožňují aplikaci zpracovávání asociací souborů. Každá z metod přebírá příponu souboru jako parametr: Metoda
Popis
isSetAsDefaultApplication()
Vrátí hodnotu „true“, jestliže je aplikace AIR aktuálně asociována s určeným typem souboru.
setAsDefaultApplication()
Vytvoří asociaci mezi aplikací AIR a akcí otevření daného typu souboru.
removeAsDefaultApplication()
Odstraní asociaci mezi aplikací AIR a typem souboru.
getDefaultApplication()
Nahlásí cestu aplikace, která je aktuálně asociována s typem souboru.
Prostředí AIR může zpracovávat pouze asociace pro typy souborů původně deklarované v deskriptoru aplikace. Nemůžete získat informace o asociacích nedeklarovaného typu souboru, pokud uživatel ručně vytvořil asociaci mezi typem souboru a vaší aplikací. Volání jakékoliv metody pro zpracování asociací souboru s příponou typu souboru nedeklarovanou v deskriptoru aplikace způsobí, že aplikace vygeneruje výjimku v době běhu. Informace o deklarování typů souborů v deskriptoru aplikace naleznete v tématu „Deklarace asociací typů souborů“ na stránce 51.
Získávání verze runtime a úrovně dočasné opravy. Objekt NativeApplication má vlastnost runtimeVersion, která je verzí runtime, ve kterém aplikace běží (řetězec, například"1.0.5"). Objekt NativeApplication má také vlastnost runtimePatchLevel, která je úrovní dočasné opravy runtime (číslo, například 2960). Následující kód používá tyto vlastnosti: trace(NativeApplication.nativeApplication.runtimeVersion); trace(NativeApplication.nativeApplication.runtimePatchLevel);
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 291 Práce s runtime a informacemi operačního systému
Zjišťování možností AIR Pro soubor přibalený v aplikaci Adobe AIR je vlastnost Security.sandboxType nastavena na hodnotu definovanou konstantou Security.APPLICATION. Můžete načíst obsah (který může a nemusí obsahovat rozhraní API specifické pro aplikaci AIR) na základě toho, zda je v karanténě zabezpečení aplikace Adobe AIR soubor, viz následující kód: if (Security.sandboxType == Security.APPLICATION) { // Load SWF that contains AIR APIs } else { // Load SWF that does not contain AIR APIs }
Všechny zdroje, které nejsou instalovány s aplikací AIR, jsou přiřazeny ke stejným karanténám zabezpečení, jako by byly přiřazeny přehrávačem Adobe® Flash® Player ve webovém prohlížeči. Vzdálené zdroje jsou umístěny do karantén na základě jejich zdrojových domén a lokální zdroje jsou umístěny do karantén „local-with-networking“, „local-withfilesystem“ nebo „local-trusted sandbox“. Můžete zkontrolovat, zda je statická vlastnost Capabilities.playerType nastavena na "Desktop" a zjistit tak, zda je obsah prováděn v době běhu (a není spuštěn v přehrávači Flash Player, který běží v prohlížeči). Více informací naleznete v tématu „Zabezpečení aplikace AIR“ na stránce 23.
Sledování přítomnosti uživatele Objekt NativeApplication odešle dvě události, které vám pomohou zjistit, kdy uživatel aktivně používá počítač. Neníli v intervalu určeném vlastností NativeApplication.idleThreshold zjištěna žádná aktivita myši nebo klávesnice, NativeApplication odešle událost userIdle. Dojde-li ke vstupu klávesnice nebo myši, objekt NativeApplication odešle událost userPresent. Interval idleThreshold je měřen ve vteřinách a má výchozí hodnotu 300 (5 minut). Z vlastnosti NativeApplication.nativeApplication.lastUserInputsi můžete také zobrazit počet vteřin od posledního vstupu uživatele. Následující řádky kódu nastaví práh nečinnosti na 2 minuty a budou poslouchat pro událost userIdle i userPresent : NativeApplication.nativeApplication.idleThreshold = 120; NativeApplication.nativeApplication.addEventListener(Event.USER_IDLE, function(event:Event) { trace("Idle"); }); NativeApplication.nativeApplication.addEventListener(Event.USER_PRESENT, function(event:Event) { trace("Present"); });
Poznámka: Pouze jediná událost userIdle je odeslána mezi libovolnými dvěmi událostmi userPresent.
292
Kapitola 29: Sledování připojení k síti Adobe® AIR™ poskytuje prostředky ke zjišťování změn síťového připojení počítače, v němž je nainstalována aplikace AIR. Tyto informace jsou užitečné, pokud určitá aplikace používá data získaná ze sítě. Aplikace může také kontrolovat dostupnost síťové služby.
Zjišťování změn síťového připojení Aplikace AIR může být spouštěna v prostředích s nejistým a proměnlivým síťovým připojením. Aby prostředí Adobe AIR pomohlo aplikaci spravovat připojení k online prostředkům, odesílá událost změny sítě pokaždé, když připojení začne být dostupné nebo nedostupné. Událost změny sítě je odeslána prostřednictvím objektu NativeApplication aplikace. Na tuto událost reagujte přidáním posluchače: NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetworkChange);
A definujte funkci zpracování události: function onNetworkChange(event:Event) { //Check resource availability }
Událost Event.NETWORK_CHANGE neindikuje změnu v celé činnosti sítě, ale pouze skutečnost, že se změnilo síťové připojení. Prostředí AIR neprovede žádný pokus o výklad významu změny sítě. Počítač připojený k síti může mít mnoho skutečných a virtuálních připojení, takže ztráta připojení nemusí nutně znamenat ztrátu zdroje. Na druhou stranu ani nová připojení nemusí zaručovat zlepšení dostupnosti zdrojů. V některých případech může nové připojení dokonce blokovat přístup ke zdrojům, které byly dosud dostupné (například připojení k síti VPN). Obecně platí, že jediný způsob, jak může aplikace zjistit, zda se může připojit ke vzdálenému zdroji, je pokus o připojení. Za tímto účelem rámce v balíčku air.net, které sledují služby, poskytují aplikacím AIR prostředky založené na událostech pro reakce na změny v síťovém připojení k určenému hostiteli. Poznámka: Rámec pro sledování služeb zjišťuje, zda server odpoví na požadavek přijatelným způsobem. To nezaručuje plné připojení. Škálovatelné webové služby často používají ukládání do paměti a zařízení k vyvažování zatížení pro přesměrování provozu na cluster webových serverů. V takové situaci nabízejí poskytovatelé služeb pouze částečnou diagnózu síťového připojení.
Základní informace o sledování služeb Rámec pro sledování služeb je umístěn odděleně od rámce AIR v souboru servicemonitor.swc. Aby mohl soubor servicemonitor.swc používat rámec, musí být zahrnut v procesu sestavení. Důležité: Chcete-li používat tyto třídy v aplikaci Adobe® Flash® CS3 Professional, přetáhněte komponentu ServiceMonitorShim z panelu Komponenty do panelu Knihovna a pak přidejte následující příkaz import do vašeho kódu jazyka ActionScript 3.0: import air.net.*;
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 293 Sledování připojení k síti
Způsob použití těchto tříd v aplikaci Adobe® Flash® CS4 Professional: 1 Vyberte příkaz Soubor > Nastavení publikování. 2 Klepněte na tlačítko Nastavení pro možnost ActionScript 3.0. Vyberte položku Cesta knihovny. 3 Klepněte na tlačítko (Procházet k SWC) a přejděte do umístění Adobe Flash
CS4/AIK1.1/frameworks/libs/air/servicemoniter.swc. 4 Klepněte na tlačítko OK. 5 Přidejte do kódu jazyka ActionScript 3.0 následující příkaz import: import air.net.*;
Třída ServiceMonitor implementuje rámec pro sledování síťových služeb a poskytuje pro sledování služeb základní funkce. Ve výchozím nastavení odesílá události týkající se síťového připojení instance třídy ServiceMonitor. Objekt ServiceMonitor tyto události odesílá, když je vytvořena instance, a pokaždé, když Adobe AIR zjistí změnu sítě. Dále můžete nastavit vlastnost pollInterval instance třídy ServiceMonitor pro kontrolu připojení v intervalech určených v milisekundách bez ohledu na obecné události síťového připojení. Objekt ServiceMonitor připojení k síti nekontroluje, dokud není vyvolána metoda start(). Třída URLMonitor, která je podtřídou třídy ServiceMonitor, zjišťuje změny v připojení pomocí protokolu HTTP pro určený požadavek URLRequest. Třída SocketMonitor, rovněž podtřída třídy ServiceMonitor, zjišťuje změny v připojení k určenému hostiteli na určeném portu.
Zjišťování připojení pomocí protokolu HTTP Třída URLMonitor určuje, zda je možné vytvořit požadavky HTTP na určenou adresu na portu 80 (obvyklý port pro komunikaci pomocí protokolu HTTP). Následující kód používá instanci třídy URLMonitor ke zjišťování změn připojení k webovému serveru Adobe: import air.net.URLMonitor; import flash.net.URLRequest; import flash.events.StatusEvent; var monitor:URLMonitor; monitor = new URLMonitor(new URLRequest('http://www.adobe.com')); monitor.addEventListener(StatusEvent.STATUS, announceStatus); monitor.start(); function announceStatus(e:StatusEvent):void { trace("Status change. Current status: " + monitor.available); }
Zjišťování soketového připojení Aplikace AIR mohou také používat soketová připojení pro připojení vynuceného typu. Brány firewall a síťové směrovače obvykle z bezpečnostních důvodů omezují komunikaci v síti na neautorizovaných portech. Proto musí vývojáři brát v úvahu, že uživatelé pravděpodobně neumí vytvářet soketová připojení. Podobně jako v příkladu s třídou URLMonitor používá následující kód instanci třídy SocketMonitor ke zjišťování změn v soketovém připojení na portu 6667, který je obvyklý pro službu IRC:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 294 Sledování připojení k síti
import air.net.ServiceMonitor; import flash.events.StatusEvent; socketMonitor = new SocketMonitor('www.adobe.com',6667); socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange); socketMonitor.start(); function announceStatus(e:StatusEvent):void { trace("Status change. Current status: " + socketMonitor.available); }
295
Kapitola 30: Požadavky URL a práce v síti Nové funkce Adobe AIR týkající se zadávání požadavků URL nejsou dostupné pro obsah SWF běžící v prohlížeči. Tyto funkce jsou dostupné pouze pro obsah v karanténě zabezpečení aplikace. V této části jsou popsány funkce třídy URLRequest při běhu a je zde probráno síťové rozhraní API měnící obsah AIR. Další informace o používání síťových a komunikačních možností jazyka Adobe® ActionScript® 3.0 naleznete v dokumentu Programování v jazyce Adobe ActionScript 3.0.
Používání třídy URLRequest Třída URLRequest umožňuje definovat více než jen řetězec URL. Aplikace AIR přidává k třídě URLRequest některé nové vlastnosti, které jsou dostupné pouze pro obsah AIR běžící v karanténě zabezpečení aplikace. Obsah při běhu může definovat URL pomocí nových schémat URL (kromě standardních schémat jako file a http).
Vlastnosti třídy URLRequest Třída URLRequest zahrnuje následující vlastnosti, které jsou dostupné pro obsah pouze v karanténě zabezpečení aplikace: Vlastnost
Popis
followRedirects
Určuje, zda bude následováno přesměrování (true, výchozí hodnota) nebo ne (false). Toto je podporováno pouze při běhu.
manageCookies
Určuje, zda by měl zásobník protokolu HTTP pro tento požadavek spravovat cookies (true, výchozí hodnota) nebo ne (false). Toto je podporováno pouze při běhu.
authenticate
Určuje, zda by měl být pro tento požadavek zpracován požadavek na ověření (true) nebo ne (false). Toto je podporováno pouze při běhu. Výchozí nastavení je ověřovat požadavky – to může způsobit zobrazení dialogového okna ověření, jestliže server vyžaduje zobrazení oprávnění. Můžete také nastavit jméno uživatele a heslo – viz „Nastavení výchozích hodnot třídy URLRequest“ na stránce 296.
cacheResponse
Určuje, zda by pro tento požadavek mělo být provedeno uložení dat úspěšné odezvy do vyrovnávací paměti. Toto je podporováno pouze při běhu. Výchozí nastavení je uložit odpověď do vyrovnávací paměti (true).
useCache
Určuje, zda by měl být před zachycením dat objektem URLRequest brán ohled na místní vyrovnávací paměť. Toto je podporováno pouze při běhu. Pro výchozí nastavení (true) lze použít verzi s místní vyrovnávací pamětí, je-li k dispozici.
userAgent
Specifikuje řetězec uživatel-agent, který se má použít v požadavku HTTP.
Následující vlastnosti objektu URLRequest je možno nastavit pomocí obsahu v libovolné karanténě (nejen v karanténě zabezpečení aplikace AIR): Vlastnost
Popis
contentType
Typ obsahu MIME libovolných dat odeslaných s požadavkem URL.
data
Objekt obsahující data, která se mají přenášet s požadavkem URL.
digest
Bezpečný „digest“ ze souboru uloženého do vyrovnávací paměti ke sledování vyrovnávací paměti přehrávače Adobe® Flash® Player.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 296 Požadavky URL a práce v síti
Vlastnost
Popis
metoda
Ovládá metodu požadavku HTTP, např. operace GET nebo POST. (Obsah běžící v doméně zabezpečení aplikace AIR může určovat jiné řetězce než "GET" nebo "POST" jako vlastnost method. Povoleno je libovolné sloveso HTTP a výchozí metoda je "GET". Viz „Zabezpečení aplikace AIR“ na stránce 23 .)
requestHeaders
Pole hlaviček požadavků HTTP přidávaných do požadavku HTTP.
URL
Určuje adresu URL, na kterou se směřuje požadavek.
Poznámka: Třída HTMLLoader má příbuzné vlastnosti pro nastavení týkající se obsahu načteného objektem HTMLLoader. Podrobnosti viz „Popis třídy HTMLLoader“ na stránce 226.
Nastavení výchozích hodnot třídy URLRequest Třída URLRequestDefaults umožňuje definovat výchozí nastavení pro objekty URLRequest. Například následující kód nastaví výchozí hodnoty pro vlastnosti manageCookies a useCache: URLRequestDefaults.manageCookies = false; URLRequestDefaults.useCache = false; air.URLRequestDefaults.manageCookies = false; air.URLRequestDefaults.useCache = false;
Třída URLRequestDefaults obsahuje metodu setLoginCredentialsForHost(), která umožňuje určit výchozí jméno uživatele a heslo pro použití pro určitého hostitele. Hostitel, který je definován v parametru hostname této metody, může být doména, např. "www.example.com", nebo doména a číslo portu, např. "www.example.com:80". Všimněte si, že všechny domény "example.com", "www.example.com" a "sales.example.com" jsou považovány za unikátní hostitele. Tato oprávnění budou použita, pouze když si je server vyžádá. Jestliže byl uživatel již ověřen (např. pomocí dialogového okna ověření), nelze ověřeného uživatele změnit vyvoláním metody setLoginCredentialsForHost(). Například následující kód nastaví výchozí jméno uživatele a heslo pro použití s doménou www.example.com: URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); air.URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X");
Každá vlastnost nastavení třídy URLRequestDefaults platí pouze pro aplikační doménu obsahu nastavujícího danou vlastnost. Avšak metoda setLoginCredentialsForHost() platí pro obsah ve všech aplikačních doménách v rámci aplikace AIR. Tak se může aplikace přihlásit k hostiteli a mít veškerý obsah v rámci aplikace přihlášený pomocí zadaných oprávnění. Další informace viz třídu URLRequestDefaults v příručce Referenční příručka jazyka ActionScript 3.0 a jeho součástí (http://www.adobe.com/go/learn_air_aslr_cz).
Používání schémat URL AIR v adresách URL Standardní schémata URL, jako je následující, jsou dostupná při definování adres URL v libovolné karanténě zabezpečení v aplikaci AIR: http: a https: Použijte je tak, jako byste je použili ve webovém prohlížeči. file: Slouží k určení cesty vzhledem ke kořenu systému souborů. Například: file:///c:/AIR Test/test.txt
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 297 Požadavky URL a práce v síti
Při definování URL pro obsah běžící v karanténě zabezpečení aplikace můžete použít i následující schémata: app: Slouží k určení cesty vzhledem ke kořenovému adresáři instalované aplikace (adresář, který obsahuje soubor deskriptoru aplikace pro instalovanou aplikaci). Například následující cesta vede ke zdrojovému podadresáři adresáře instalované aplikace: app:/resources
Když zdrojový adresář aplikace běží v aplikaci ADL, je nastaven na adresář obsahující soubor deskriptoru aplikace. app-storage: Slouží k určení cesty vzhledem k ukládacímu adresáři aplikace. Pro každou instalovanou aplikaci definuje aplikace AIR jedinečný ukládací adresář aplikace pro jednotlivé uživatele, což je užitečné místo pro ukládání dat náležejících k dané aplikaci. Například následující cesta vede k souboru prefs.xml v podadresáři nastavení ukládacího adresáře aplikace. app-storage:/settings/prefs.xml
Umístění ukládacího adresáře aplikace je založeno na jménu uživatele, Id aplikace a Id vydavatele:
• U systému Mac OS v: /Users/jméno_uživatele/Library/Preferences/applicationID.publisherID/Local Store/
Například: /Users/babbage/Library/Preferences/com.example.TestApp.02D88EEED35F84C264A183921344EEA353 A629FD.1/Local Store
• U systému Windows—V adresáři Documents and Settings, v: jméno_uživatele/Application Data/applicationID.publisherID/Local Store/ Například: C:\Documents and Settings\babbage\Application Data\com.example.TestApp.02D88EEED35F84C264A183921344EEA353A629FD.1\Local Store
• U systému Linux v: /home/jméno_uživatele/.appdata/applicationID.publisherID/Local Store/
Například: /home/babbage/.appdata/com.example.TestApp.02D88EEED35F84C264A183921344EEA353A629FD.1\Loc al Store
URL (a vlastnost url) pro objekt File vytvořený pomocí vlastnosti File.applicationStorageDirectory používá schéma URL app-storage, jako v následujícím případě: var dir:File = File.applicationStorageDirectory; dir = dir.resolvePath("preferences"); trace(dir.url); // app-storage:/preferences var dir = air.File.applicationStorageDirectory; dir = dir.resolvePath("prefs.xml"); air.trace(dir.url); // app-storage:/preferences
mailto: Schéma mailto můžete použít v objektech URLRequest předaných funkci navigateToURL(). Viz část „Otevření URL ve výchozím systémovém webovém prohlížeči“ na stránce 298.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 298 Požadavky URL a práce v síti
Používání schémat URL v aplikaci AIR Můžete použít objekt URLRequest, který používá kterékoli z těchto schémat URL k definování požadavku URL pro několik různých objektů, např. objekt FileStream nebo Sound. Můžete tato schémata použít také v obsahu HTML běžícím v aplikaci AIR. Můžete je například použít v atributu src tagu img. Můžete však použít pouze tato schémata URL náležející k aplikaci AIR (app: a app-storage:) v obsahu v karanténě zabezpečení aplikace. Další informace viz „Zabezpečení aplikace AIR“ na stránce 23.
Zakázaná schémata URL Některá rozhraní API umožňují spustit obsah ve webovém prohlížeči. Z důvodů zabezpečení jsou některá schémata URL při použití těchto API v aplikaci AIR zakázána. Seznam zakázaných schémat závisí na karanténě zabezpečení kódu používajícího API. Podrobnosti viz „Otevření URL ve výchozím systémovém webovém prohlížeči“ na stránce 298.
Změny v třídě URLStream Třída URLStream poskytuje přístup nízké úrovně ke stahování dat z URL. Při běhu obsahuje třída URLStream novou událost: httpResponseStatus. Narozdíl od události httpStatus je událost httpResponseStatus doručena před veškerými daty odpovědi. Událost httpResponseStatus (definovaná v třídě HTTPStatusEvent) zahrnuje vlastnost responseURL, která je URL, ze které byla vrácena odpověď, a vlastnostresponseHeaders, která je pole objektů URLRequestHeader představující záhlaví odpovědi, která danou odpověď vrátila.
Otevření URL ve výchozím systémovém webovém prohlížeči URL můžete otevřít ve výchozím systémovém webovém prohlížeči pomocí funkce navigateToURL(). V případě objektu URLRequest, který předáváte jako parametr request této funkce, se používá pouze vlastnost url. var url = "http://www.adobe.com"; var urlReq = new air.URLRequest(url); air.navigateToURL(urlReq);
Poznámka: Při použití funkce navigateToURL() nakládá chod programu s objektem URLRequest, který používá metodu POST (metodu s vlastností method nastavenou na URLRequestMethod.POST), jako by se jednalo o použití metody GET. Při použití funkce navigateToURL() jsou povolena schémata URL na základě karantény zabezpečení kódu volajícího funkci navigateToURL(). Některá rozhraní API umožňují spustit obsah ve webovém prohlížeči. Z důvodů zabezpečení jsou některá schémata URL při použití těchto API v aplikaci AIR zakázána. Seznam zakázaných schémat závisí na karanténě zabezpečení kódu používajícího API. (Podrobnosti o karanténách zabezpečení viz „Zabezpečení aplikace AIR“ na stránce 23.) Karanténa aplikace Povolena jsou následující schémata. Použijte je tak, jako byste je použili ve webovém prohlížeči.
•
http:
•
https:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 299 Požadavky URL a práce v síti
•
file:
•
mailto: – aplikace AIR přesměruje tyto požadavky na registrovanou systémovou poštovní aplikaci
•
app:
•
app-storage:
Všechna ostatní schémata URL jsou zakázána. Vzdálená karanténa Povolena jsou následující schémata. Použijte je tak, jako byste je použili ve webovém prohlížeči.
•
http:
•
https:
•
mailto: – aplikace AIR přesměruje tyto požadavky na registrovanou systémovou poštovní aplikaci
Všechna ostatní schémata URL jsou zakázána. Místní karanténa se souborem Povolena jsou následující schémata. Použijte je tak, jako byste je použili ve webovém prohlížeči.
•
file:
•
mailto: – aplikace AIR přesměruje tyto požadavky na registrovanou systémovou poštovní aplikaci
Všechna ostatní schémata URL jsou zakázána. Místní karanténa se sítí Povolena jsou následující schémata. Použijte je tak, jako byste je použili ve webovém prohlížeči.
•
http:
• https: •
mailto: – aplikace AIR přesměruje tyto požadavky na registrovanou systémovou poštovní aplikaci
Všechna ostatní schémata URL jsou zakázána. Místní důvěryhodná karanténa Povolena jsou následující schémata. Použijte je tak, jako byste je použili ve webovém prohlížeči.
•
file:
•
http:
• https: •
mailto: – aplikace AIR přesměruje tyto požadavky na registrovanou systémovou poštovní aplikaci
Všechna ostatní schémata URL jsou zakázána.
300
Kapitola 31: Komunikace mezi aplikacemi Třída LocalConnection umožňuje komunikaci mezi aplikacemi Adobe® AIR™ i mezi aplikacemi AIR a obsahem SWF běžícím v prohlížeči. Metoda connect() třídy LocalConnection používá parametr connectionName k identifikaci aplikací. U obsahu běžícím v karanténě zabezpečení aplikace AIR (obsah instalovaný s aplikací AIR) používá aplikace AIR řetězec, který se skládá ze znaků app#, ID aplikace, tečky (.) a ID vydavatele pro aplikaci AIR (definovaného v souboru deskriptoru aplikace) místo domény používané obsahem SWF běžícím v prohlížeči. Například parametr connectionName pro aplikaci s ID aplikace com.example.air.MyApp, parametr connectionName a ID vydavatele B146A943FBD637B68C334022D304CEA226D129B4 dá výsledný řetězec"app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4:connectionName". (Další informace viz Definování základních informací aplikace a „Získávání identifikátorů aplikace a vydavatele“ na stránce 289.) Jakmile povolíte jiné aplikaci AIR komunikaci s vaší aplikací přes místní připojení, musíte vyvolat metodu allowDomain() objektu LocalConnection a předat název domény místního připojení. U aplikace AIR je tento název
domény vytvořen z ID aplikace a vydavatele stejným způsobem jako připojovací řetězec. Například má-li odesílající aplikace ID aplikace com.example.air.FriendlyApp a ID vydavatele 214649436BD677B62C33D02233043EA236D13934, tak řetězec domény, který by této aplikaci povolil připojení, je: app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934. Poznámka: Při spouštění vaší aplikace s ADL (nebo s vývojovým nástrojem, jako je Flash CS3, Flex Builder nebo Dreamweaver), má ID vydavatele hodnotu null a musí být z řetězce domény vypuštěno. Při instalaci a spouštění vaší aplikace musí být ID vydavatele zahrnuto v řetězci domény. Můžete přidělit dočasné ID vydavatele pomocí argumentů příkazového řádku ADL. Pomocí dočasného ID vydavatele ověřte, zda jsou připojovací řetězec a název domény správně naformátovány.
301
Kapitola 32: Distribuce, Instalace a Spuštění aplikací AIR Aplikace AIR jsou distribuovány jako jediný instalační soubor AIR, který obsahuje kód aplikace a všechny datové zdroje. Tento soubor můžete distribuovat za použití jakýchkoliv obvyklých prostředků, například stažením, odesláním e-mailem, nebo pomocí fyzických médií, například CD-ROM. Uživatelé mohou aplikaci nainstalovat poklepáním na soubor AIR. Můžete použít funkci hladká instalace, která umožňuje uživatelům nainstalovat aplikaci AIR (a dle potřeby Adobe® AIR™) klepnutím na jediný odkaz na webové stránce. Před tím, než lze instalační soubor AIR distribuovat, musí být zabalen a označen certifikátem podpisu kódu a osobním klíčem. Digitální podepsání instalačního souboru zajistí, že vaše aplikace nebude od podpisu upravena. Pokud byl navíc digitální certifikát vydán důvěryhodnou certifikační autoritou, mohou vaši uživatelé potvrdit vaši totožnost jako vydavatele a autora podpisu. Soubor AIR je podepsán, když je aplikace zabalena pomocí programu AIR Developer Tool (ADT). Více informací o způsobu zabalení aplikace do souboru AIR pomocí aktualizace AIR pro nástroj Flash naleznete v tématu „Vytváření souborů aplikace AIR a instalátoru“ na stránce 15. Více informací o způsobu zabalení aplikace do souboru AIR pomocí Adobe® AIR™ SDK naleznete v tématu „Zabalení instalačního souboru AIR pomocí programu AIR Developer Tool (ADT)“ na stránce 343.
Instalace a spuštění aplikace AIR z pracovní plochy Soubor AIR můžete jednoduše odeslat příjemci. Soubor AIR můžete například odeslat jako přílohu e-mailu nebo jako odkaz na webové stránce. Jakmile si uživatel stáhne aplikaci AIR, řídí se pro instalaci těmito pokyny: 1 Poklepejte na soubor AIR.
Program Adobe AIR musí již být na počítači nainstalován. 2 V okně instalace ponechte zvolené výchozí nastavení a klepněte na tlačítko Pokračovat.
V OS Windows provede AIR automaticky následující:
• Nainstaluje aplikaci do adresáře Program Files • Vytvoří pro aplikaci odkaz na pracovní ploše • Vytvoří odkaz v aplikaci Start • Přidá záznam pro aplikaci do ovládacího panelu Přidat / Odebrat programy V OS Mac je aplikace implicitně přidána do adresáře Aplikace. Jestliže je aplikace již nainstalovaná, umožní instalátor uživateli vybrat si mezi spuštěním stávající verze aplikace nebo aktualizací na verzi ve staženém souboru AIR. Instalátor určí aplikaci pomocí ID aplikace a ID vydavatele v souboru AIR. 3 Po dokončení instalace klepněte na možnost Dokončit.
V OS Mac potřebuje uživatel pro instalaci aktualizované verze aplikace odpovídající systémová oprávnění pro instalaci do adresáře aplikace. V systémech Windows a Linux potřebuje uživatel oprávnění správce.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 302 Distribuce, Instalace a Spuštění aplikací AIR
Aplikace může také nainstalovat novou verzi skrze jazyk ActionScript nebo JavaSript. Více informací naleznete v tématu „Aktualizace aplikací AIR“ na stránce 316. Jakmile je aplikace AIR nainstalována, uživatel jednoduše poklepe na ikonu aplikace pro její spuštění, jako v případě jakékoliv jiné aplikace pracovní plochy.
• V OS Windows poklepejte na ikonu aplikace (která je buď nainstalovaná na pracovní ploše nebo ve složce) nebo vyberte aplikaci z nabídky Start.
• V systému Linux poklepejte na ikonu aplikace (která je buď nainstalovaná na pracovní ploše nebo ve složce) nebo vyberte aplikaci z nabídky aplikací.
• V OS Mac poklepejte na aplikaci ve složce, do které byla nainstalovaná. Výchozím instalačním adresářem je adresář /Aplikace. Funkce AIR hladká instalace umožňuje uživateli nainstalovat aplikaci AIR klepnutím na odkaz na webové stránce. Funkce AIR iniciace prohlížečeumožňuje uživateli spustit nainstalovanou aplikaci AIR klepnutím na odkaz na webové stránce. Tyto funkce jsou popsány v následující části.
Instalace a spuštění aplikací AIR z webové stránky Funkce hladké instalace vám umožňuje vložit SWF soubor do webové stránky, která umožňuje uživateli instalovat aplikaci AIR z prohlížeče. Jestliže runtime není instalováno, instaluje funkce hladké instalace runtime. Funkce hladké instalace umožňuje uživateli instalovat aplikaci AIR bez uložení souborů AIR do počítače. Součástí sady AIR SDK je soubor badge.swf, který vám umožňuje snadno použít funkci hladké instalace. Podrobnosti naleznete v tématu „Použití souboru badge.swf k nainstalování aplikace AIR“ na stránce 303. Ukázku způsobu využití funkce hladké instalace naleznete v ukázkovém článku rychlého startu Distributing an AIR Application via the Web (Distribuce aplikace AIR prostřednictvím webu) (http://www.adobe.com/go/learn_air_qs_seamless_install_cz).
O uživatelském nastavení souboru badge.swf hladké instalace Vedle použití souboru badge.swf poskytnutého se sadou SDK můžete vytvořit svůj vlastní soubor, který použijete na stránce prohlížeče. Váš vlastní soubor SWF může vzájemně reagovat s runtime následujícími způsoby:
• Může nainstalovat aplikaci AIR. Viz „Instalace aplikace AIR z prohlížeče“ na stránce 307. • Může provést kontrolu a zjistit, jestli je nainstalovaná určitá aplikace AIR. Viz „Kontrola z webové stránky, zda je aplikace AIR nainstalována.“ na stránce 307.
• Může zkontrolovat, zda je runtime nainstalováno. Viz „Kontrola, zda je runtime nainstalováno“ na stránce 306. • Může spustit nainstalovanou aplikaci AIR v systému uživatele. Viz „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 308. Tyto možnosti jsou poskytnuty voláním rozhraní API v souboru SWF hostovaném na adobe.com: air.swf. Tato část popisuje způsob použití a uživatelského nastavení souboru badge.swf a způsob volání rozhraní API air.swf z vašeho vlastního souboru SWF. Dále může soubor SWF spuštěný v prohlížeči komunikovat se spuštěnou aplikací AIR pomocí třídy LocalConnection. Více informací naleznete v tématu „Komunikace mezi aplikacemi“ na stránce 300.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 303 Distribuce, Instalace a Spuštění aplikací AIR
Důležité: Funkce popsané v této části (a rozhraní API v souboru air.swf) vyžadují, aby měl koncový uživatel ve webovém prohlížeči v systému Windows nebo Mac OS nainstalovanou aktualizaci 3 přehrávače Adobe® Flash® Player 9. V systému Linux vyžaduje funkce hladké instalace přehrávač Flash Player 10 (verze 10.0.12.36 nebo novější). Můžete zapsat kód tak, abyste zkontrolovali nainstalovanou verzi přehrávače Flash Player a poskytnuli uživateli alternativní rozhraní, jestliže není požadovaná verze přehrávače Flash Player nainstalovaná. Jestliže je například nainstalována starší verze přehrávače Flash Player, můžete poskytnout obsah na verzi souboru AIR ke stažení (namísto použití rozhraní API souboru air.swf k nainstalování aplikace).
Použití souboru badge.swf k nainstalování aplikace AIR Součástí sady AIR SDK je soubor badge.swf, který vám umožňuje snadno použít funkci hladké instalace. Soubor badge.swf může nainstalovat runtime a aplikaci AIR z odkazu na webové stránce. Soubor badge.swf a jeho zdrojový kód jsou vám k distribuci poskytnuty na vaší webové stránce. Pokyny v této části nabízejí informace o nastavení parametrů souboru badge.swf poskytnutém společností Adobe. Máte také k dispozici zdrojový kód pro soubor badge.swf file, který si můžete libovolně nastavit. Vložení souboru badge.swf do webové stránky 1 Vyhledejte následující soubory umístěné v adresáři samples/badge AIR SDK a přidejte je do svého prohlížeče.
• badge.swf • default_badge.html • AC_RunActiveContent.js 2 Otevřete stránku default_badge.html v textovém editoru. 3 Na stránce default_badge.html ve funkci jazyka JavaScript AC_FL_RunContent() upravte definice parametru FlashVars pro následující: Parametr
Popis
appname
Název aplikace zobrazený souborem SWF, jestliže runtime není nainstalován.
appurl
(Vyžadovaný). URL souboru AIR, který má být stažen. Musíte použít absolutní, nikoliv relativní, URL.
airversion
(Vyžadovaný). Pro verzi 1.0 runtime jej nastavte na 1.0.
imageurl
URL obrazu (volitelné), která se zobrazí v symbolu.
buttoncolor
Barva tlačítka stahování (určená jako hexadecimální hodnota, například FFCC00).
messagecolor
Barva textové zprávy zobrazené pod tlačítkem, jestliže runtime není nainstalováno (určena jako hexadecimální hodnota, například FFCC00).
4 Minimální velikost souboru badge.swf je 217 obrazových bodů na šířku a 180 obrazových bodů na výšku. Upravte
hodnoty parametrů width a height funkce AC_FL_RunContent()tak, aby vám vyhovovaly. 5 Přejmenujte soubor default_badge.html a upravte jeho kód (nebo jej zahrňte do jiné HTML stránky) tak, aby vám
vyhovoval. Soubor badge.swf můžete také upravit a znovu kompilovat. Podrobnosti naleznete v tématu „Úprava souboru badge.swf“ na stránce 304.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 304 Distribuce, Instalace a Spuštění aplikací AIR
Instalace aplikace AIR z odkazu hladké instalace na webové stránce. Jakmile jste na stránku přidali odkaz hladké instalace, může uživatel instalovat aplikaci AIR klepnutím na odkaz v souboru SWF. 1 Přejděte na stránku HTML ve webovém prohlížeči, který má nainstalovaný přehrávač Flash Player (verze 9 s
aktualizací 3 v systémech Windows a Mac OS, nebo verze 10 v systému Linux). 2 Na webové stránce klepněte na odkaz na soubor badge.swf.
• Jestliže jste runtime nainstalovali, přejděte k následujícímu kroku. • Jestliže jste runtime nenainstalovali, zobrazí se dialogové okno, kde budete dotázáni, zda si přejete runtime nainstalovat nebo nikoliv. Instalujte runtime (viz „Instalace prostředí Adobe AIR“ na stránce 1) a pokračujte k následujícímu kroku. 3 V okně instalace ponechte zvolené výchozí nastavení a klepněte na tlačítko Pokračovat.
V počítači s OS Windows provede AIR automaticky následující:
• Instaluje aplikaci do umístění c:\Program Files\ • Vytvoří pro aplikaci odkaz na pracovní ploše • Vytvoří odkaz v nabídce Start • Přidá záznam pro aplikaci do ovládacího panelu Přidat/Odebrat programy V operačním systému Mac OS přidá instalátor aplikaci do adresáře Aplikace (například do adresáře /Aplikace v operačním sytému Mac OS). V počítači se systémem Linux provede aplikace AIR následující akce:
• Nainstaluje aplikaci do složky /opt. • Vytvoří pro aplikaci odkaz na pracovní ploše • Vytvoří odkaz v nabídce Start • Přidá do systémového správce balíčků položku pro aplikaci. 4 Vyberte požadované možnosti a klepněte na tlačítko Instalovat. 5 Po dokončení instalace klepněte na možnost Dokončit.
Úprava souboru badge.swf Sada SDK AIR poskytuje zdrojové soubory pro soubor badge.swf. Tyto soubory jsou zahrnuty ve složce samples/badge sady SDK: Zdrojové soubory
Popis
badge.fla
Zdrojový soubor Flash použitý pro kompilaci souboru badge.swf. Soubor badge.fla kompiluje do souboru SWF 9 (který lze načíst v přehrávači Flash Player).
AIRBadge.as
Třída ActionScript 3.0, která definuje základní třídu použitou v souboru basdge.fla.
Aplikaci Flash CS3 nebo Flash CS4 lze použít k novému navržení vizuálního rozhraní souboru badge.fla. Funkce konstruktoru AIRBadge() definovaná ve třídě AIRBadge načte soubor air.swf hostovaný na http://airdownload.adobe.com/air/browserapi/air.swf. Soubor air.swf obsahuje kód pro používání funkce hladké instalace. Metoda onInit()(ve třídě AIRBadge) je volána, když je soubor air.swf úspěšně načten:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 305 Distribuce, Instalace a Spuštění aplikací AIR
private function onInit(e:Event):void { _air = e.target.content; switch (_air.getStatus()) { case "installed" : root.statusMessage.text = ""; break; case "available" : if (_appName && _appName.length > 0) { root.statusMessage.htmlText = "
In order to run " + _appName + ", this installer will also set up Adobe® AIR™.
"; } else { root.statusMessage.htmlText = "
In order to run this application, " + "this installer will also set up Adobe® AIR™.
"; } break; case "unavailable" : root.statusMessage.htmlText = "
Adobe® AIR™ is not available for your system.
"; root.buttonBg_mc.enabled = false; break; } }
Kód nastaví globální proměnnou _air na hlavní třídu načteného souboru air.swf. Tato třída obsahuje následující veřejné metody, ke kterým soubor badge.swf získává přístup pro volání funkce hladké instalace: Metoda
Popis
getStatus()
Určuje, zda je runtime na počítači nainstalováno (nebo může být nainstalováno). Podrobnosti naleznete v tématu „Kontrola, zda je runtime nainstalováno“ na stránce 306.
installApplication() Nainstaluje určenou aplikaci na počítač uživatele. Podrobnosti naleznete v tématu „Instalace aplikace AIR z
prohlížeče“ na stránce 307.
•
url—Řetězec definující URL. Musíte použít absolutní, nikoliv relativní, cestu URL.
•
runtimeVersion—Řetězec určující verzi runtime (například "1.0.M6") vyžadovanou aplikací k instalaci.
•
arguments—Argumenty, které budou předané aplikaci, když je po instalaci spuštěna. Aplikace je spuštěna po instalaci, jestliže element allowBrowserInvocation je nastaven na true v souboru deskriptoru
aplikace. (Více informací o souboru deskriptoru aplikace naleznete v tématu „Nastavení vlastností aplikace AIR“ na stránce 43.) Jestliže je aplikace spuštěna jako výsledek hladké instalace z prohlížeče (když si uživatel zvolí spuštění aplikace po instalaci), objekt aplikace NativeApplication odešle objekt BrowserInvokeEvent pouze pokud jsou předány argumenty. Vezměte na vědomí důsledky pro zabezpečení dat, která předáte aplikaci. Podrobnosti naleznete v tématu „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 308.
Nastavení pro url a runtimeVersion jsou předána do souboru SWF prostřednictvím nastavení FlashVars na HTML stránce kontejneru. Jestliže se aplikace po instalaci spustí automaticky, může nainstalovaná aplikace díky komunikaci LocalConnection po iniciaci kontaktovat soubor badge.swf. Podrobnosti naleznete v tématu „Komunikace mezi aplikacemi“ na stránce 300. Můžete také volat metodu getApplicationVersion() souboru air.swf a zkontrolovat, jestli je aplikace nainstalována. Tuto metodu můžete volat buď před procesem instalace aplikace nebo po zahájení instalace. Podrobnosti naleznete v tématu „Kontrola z webové stránky, zda je aplikace AIR nainstalována.“ na stránce 307.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 306 Distribuce, Instalace a Spuštění aplikací AIR
Načtení souboru air.swf Můžete vytvořit svůj vlastní soubor SWF, který používá rozhraní API v souboru air.swf, pro interakci s runtime a aplikacemi AIR z webové stránky v prohlížeči. Soubor air.swf je hostován na http://airdownload.adobe.com/air/browserapi/air.swf. Pro odkazování rozhraní API souboru air.swf z vašeho souboru SWF načtěte soubor air.swf do stejné domény aplikace jako svůj soubor SWF. Následující kód ukazuje příklad načtení souboru air.swf do domény aplikace načítaného souboru SWF: var airSWF:Object; // This is the reference to the main class of air.swf var airSWFLoader:Loader = new Loader(); // Used to load the SWF var loaderContext:LoaderContext = new LoaderContext(); // Used to set the application domain loaderContext.applicationDomain = ApplicationDomain.currentDomain; airSWFLoader.contentLoaderInfo.addEventListener(Event.INIT, onInit); airSWFLoader.load(new URLRequest("http://airdownload.adobe.com/air/browserapi/air.swf"), loaderContext); function onInit(e:Event):void { airSWF = e.target.content; }
Jakmile je soubor air.swf načten (když objekt contentLoaderInfo objektu Loader odešle událost init), můžete volat libovolné z rozhraní API souboru air.swf. Tato rozhraní API jsou popsána v následujících částech:
• „Kontrola, zda je runtime nainstalováno“ na stránce 306 • „Kontrola z webové stránky, zda je aplikace AIR nainstalována.“ na stránce 307 • „Instalace aplikace AIR z prohlížeče“ na stránce 307 • „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 308 Poznámka: Soubor badge.swf dodaný se sadou SDK AIR automaticky načte soubor air.swf. Viz „Použití souboru badge.swf k nainstalování aplikace AIR“ na stránce 303. Pokyny v této části se vztahují k vytváření vlastního souboru SWF, který načte soubor air.swf.
Kontrola, zda je runtime nainstalováno Soubor SWF může zkontrolovat, zda je runtime nainstalováno voláním metody getStatus() v souboru air.swf načteném z http://airdownload.adobe.com/air/browserapi/air.swf. Podrobnosti naleznete v tématu „Načtení souboru air.swf“ na stránce 306. Jakmile je soubor air.swf načten, může soubor SWF volat metodu souboru air.swf getStatus(), viz. následující: var status:String = airSWF.getStatus();
Metoda getStatus() vrátí jednu z následujících hodnot řetězce, na základě statutu runtime na počítači: Hodnota řetězce
Popis
"available"
Runtime lze nainstalovat na tomto počítači, aktuálně ale nainstalován není.
"unavailable"
Runtime nemůže být na tomto počítači nainstalován.
"installed"
Runtime je na tomto počítači nainstalován.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 307 Distribuce, Instalace a Spuštění aplikací AIR
Metoda getStatus() vyvolá chybu, jestliže není v prohlížeči nainstalována požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3 v systémech Windows a Mac OS nebo verze 10 v systému Linux).
Kontrola z webové stránky, zda je aplikace AIR nainstalována. Soubor SWF může zkontrolovat, zda je aplikace AIR (s odpovídajícím ID aplikace a ID vydavatele) nainstalovaná voláním metody getApplicationVersion() v souboru air.swf načteném z http://airdownload.adobe.com/air/browserapi/air.swf. Podrobnosti naleznete v tématu „Načtení souboru air.swf“ na stránce 306. Jakmile je soubor air.swf načten, může soubor SWF volat metodu souboru air.swf getApplicationVersion(), viz. následující: var appID:String = "com.example.air.myTestApplication"; var pubID:String = "02D88EEED35F84C264A183921344EEA353A629FD.1"; airSWF.getApplicationVersion(appID, pubID, versionDetectCallback); function versionDetectCallback(version:String):void { if (version == null) { trace("Not installed."); // Take appropriate actions. For instance, present the user with // an option to install the application. } else { trace("Version", version, "installed."); // Take appropriate actions. For instance, enable the // user interface to launch the application. } }
Metoda getApplicationVersion() má následující parametry: Parametry
Popis
appID
ID aplikace pro danou aplikaci. Podrobnosti naleznete v tématu „Definování identity aplikace“ na stránce 46.
pubID
ID vydavatele pro danou aplikaci. Podrobnosti naleznete v tématu „O identifikátorech vydavatele AIR“ na stránce 311.
callback
Funkce zpětného volání, která slouží jako funkce zpracování. Metoda getApplicationVersion() operuje asynchronně a po zjištění nainstalované verze (nebo nepřítomnosti nainstalované verze), je tato metoda zpětného volání iniciována. Definice metody zpětného volání musí zahrnovat jeden parametr, řetězec, který je nastaven na řetězec verze nainstalované aplikace. Jestliže není aplikace nainstalovaná, bude funkci předána nulová hodnota, viz následující ukázka kódu.
Metoda getApplicationVersion() vyvolá chybu, jestliže není v prohlížeči nainstalována požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3 v systémech Windows a Mac OS nebo verze 10 v systému Linux).
Instalace aplikace AIR z prohlížeče Soubor SWF může nainstalovat aplikaci AIR voláním metody installApplication() v souboru air.swf načteném z http://airdownload.adobe.com/air/browserapi/air.swf. Podrobnosti naleznete v tématu „Načtení souboru air.swf“ na stránce 306.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 308 Distribuce, Instalace a Spuštění aplikací AIR
Jakmile je soubor air.swf načten, může soubor SWF volat metodu souboru air.swf installApplication(), viz. následující: var url:String = "http://www.example.com/myApplication.air"; var runtimeVersion:String = "1.0"; var arguments:Array = ["launchFromBrowser"]; // Optional airSWF.installApplication(url, runtimeVersion, arguments);
Metoda installApplication() nainstaluje určenou aplikaci na počítač uživatele. Tato metoda má následující parametry: Parametr
Popis
url
Řetězec definující URL souboru AIR k instalaci. Musíte použít absolutní, nikoliv relativní, cestu URL.
runtimeVersion
Řetězec určující verzi runtime (například „1.0“) vyžadovanou aplikací k instalaci.
arguments
Pole argumentů, které budou předány aplikaci, když je po instalaci spuštěna. Pro argumenty jsou rozpoznávány pouze alfanumerické znaky. Pokud potřebujete předat jiné hodnoty, doporučujeme použít schéma kódování. Aplikace je spuštěna po instalaci, jestliže element allowBrowserInvocation je nastaven na true v souboru deskriptoru aplikace. (Více informací o souboru deskriptoru aplikace naleznete v tématu „Nastavení vlastností aplikace AIR“ na stránce 43.) Jestliže je aplikace spuštěna jako výsledek hladké instalace z prohlížeče (když si uživatel zvolí spuštění aplikace po instalaci), objekt aplikace NativeApplication odešle objekt BrowserInvokeEvent pouze pokud byly předány argumenty. Podrobnosti naleznete v tématu „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 308.
Metoda installApplication() může operovat pouze je-li volána v objektu pro zpracování události pro událost uživatele, například klepnutí myší. Metoda installApplication() vyvolá chybu, jestliže není v prohlížeči nainstalována požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3 v systémech Windows a Mac OS nebo verze 10 v systému Linux). Pro instalaci aktualizované verze aplikace v OS Mac musí mít uživatel příslušná oprávnění pro nainstalování do adresáře aplikace (a oprávnění správce, jestliže aplikace aktualizuje runtime). V OS Windows potřebuje uživatel oprávnění správce. Můžete také volat metodu getApplicationVersion() souboru air.swf a zkontrolovat, zda je aplikace již nainstalována. Tuto metodu můžete volat buď před zahájením procesu instalace aplikace nebo po zahájení instalace. Podrobnosti naleznete v tématu „Kontrola z webové stránky, zda je aplikace AIR nainstalována.“ na stránce 307. Jakmile aplikace běží, může komunikovat s obsahem SWF v prohlížeči pomocí třídy LocalConnection. Podrobnosti naleznete v tématu „Komunikace mezi aplikacemi“ na stránce 300.
Spuštění nainstalované aplikace AIR z prohlížeče Pro použití funkce vyvolání prohlížeče (povolení, aby byla spuštěna z prohlížeče) musí soubor deskriptoru aplikace cílové aplikace zahrnovat následující nastavení: true
Více informací o souboru deskriptoru aplikace naleznete v tématu „Nastavení vlastností aplikace AIR“ na stránce 43. Soubor SWF v prohlížeči může spustit aplikaci AIR voláním metody launchApplication() v souboru air.swf načteném z http://airdownload.adobe.com/air/browserapi/air.swf. Podrobnosti naleznete v tématu „Načtení souboru air.swf“ na stránce 306. Jakmile je soubor air.swf načten, může soubor SWF volat metodu souboru air.swf launchApplication(), viz. následující kód:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 309 Distribuce, Instalace a Spuštění aplikací AIR
var appID:String = "com.example.air.myTestApplication"; var pubID:String = "02D88EEED35F84C264A183921344EEA353A629FD.1"; var arguments:Array = ["launchFromBrowser"]; // Optional airSWF.launchApplication(appID, pubID, arguments);
Metoda launchApplication() je definovaná na nejvyšší úrovni souboru air.swf (který je načten v doméně aplikace souboru SWF uživatelského rozhraní). Volání této metody způsobí, že aplikace AIR spustí určenou aplikaci (je-li instalována a je-li povolena inicializace prohlížeče prostřednictvím nastavení allowBrowserInvocation v souboru deskriptoru aplikace). Tato metoda má následující parametry: Parametr
Popis
appID
ID aplikace pro aplikaci, která má být spuštěna. Podrobnosti naleznete v tématu „Definování identity aplikace“ na stránce 46.
pubID
ID vydavatele pro aplikaci, která má být spuštěna. Podrobnosti naleznete v tématu „O identifikátorech vydavatele AIR“ na stránce 311.
arguments
Pole argumentů, které budou předány aplikaci. Objekt NativeApplication aplikace odešle událost BrowserInvokeEvent, která má vlastnost argumentů nastavenou na toto pole. Pro argumenty jsou rozpoznávány pouze alfanumerické znaky. Pokud potřebujete předat jiné hodnoty, doporučujeme použít schéma kódování.
Metoda launchApplication() může operovat pouze tehdy, je-li volána v objektu pro zpracování události pro událost uživatele, například klepnutí myší. Metoda launchApplication() vyvolá chybu, jestliže není v prohlížeči nainstalována požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3 v systémech Windows a Mac OS nebo verze 10 v systému Linux). Jestliže je element allowBrowserInvocation nastaven v souboru deskriptoru aplikace na false, volání metody launchApplication() nepřinese žádné výsledky.
Před poskytnutím uživateli rozhraní pro spuštění aplikace si můžete přát volat metodu getApplicationVersion() v souboru air.swf. Podrobnosti naleznete v tématu „Kontrola z webové stránky, zda je aplikace AIR nainstalována.“ na stránce 307. Je-li aplikace iniciována prostřednictvím funkce iniciace prohlížeče, objekt aplikace NativeApplication odešle objekt BrowserInvokeEvent. Podrobnosti naleznete v tématu „Vyvolání z prohlížeče“ na stránce 285. Jestliže používáte funkci iniciace prohlížeče, ujistěte se, že zohledníte implikace zabezpečení popsané v tématu „Vyvolání z prohlížeče“ na stránce 285. Jakmile aplikace běží, může komunikovat s obsahem SWF v prohlížeči pomocí třídy LocalConnection. Podrobnosti naleznete v tématu „Komunikace mezi aplikacemi“ na stránce 300.
Nasazení firmy IT správci mohou nainstalovat runtime Adobe AIR a aplikace AIR tiše pomocí standardních nástrojů nasazení plochy. IT správci mohou provést následující:
• Tiše nainstalovat runtime Adobe AIR pomocí nástrojů, například Microsoft SMS, IBM Tivoli, nebo jakýchkoliv nástrojů nasazení, které umožňují tiché instalace používající počáteční zavádění.
• Tiše nainstalovat aplikaci AIR pomocí stejných nástrojů použitých k nasazení runtime Více informací naleznete v tématu Příručky správce Adobe AIR (http://www.adobe.com/go/learn_air_admin_guide_cz).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 310 Distribuce, Instalace a Spuštění aplikací AIR
Digitální podepisování souboru AIR Digitální podpis vašich instalačních souborů AIR s certifikátem vydaným uznávanou certifikační autoritou (CA) poskytuje vašim uživatelům významnou záruku, že aplikace, kterou instalují, nebyla náhodně nebo úmyslně upravena a identifikuje vás jako autora podpisu (vydavatele). AIR zobrazí název vydavatele během instalace, pokud byla aplikace AIR podepsána s certifikátem, který je důvěryhodný, nebo který provede propojení na důvěryhodný certifikát v počítači instalace. V opačném případě je název vydavatele zobrazen jako „Neznámý“. Důležité: Podvodné entity by mohly falsifikovat soubor AIR s vaší totožností, jestliže nějakým způsobem získají váš soubor úložiště klíčů podpisu nebo zjistí váš osobní klíč.
Informace o certifikátech podpisu kódu Záruky zabezpečení, omezení a právní závazky týkající se použití certifikátů podpisu kódu jsou uvedeny v Prohlášení o postupech certifikátu (Certificate Practice Statements - CPS) a v ujednáních odběratele zveřejněných vydávající certifikační autoritou. Více informací o ujednáních pro certifikační autority, které aktuálně vydávají certifikáty pro podpis kódu aplikace AIR, naleznete na níže uvedených odkazech: ChosenSecurity (http://www.chosensecurity.com/products/tc_publisher_id_adobe_air.htm) http://www.chosensecurity.com/resource_center/repository.htm (http://www.chosensecurity.com/resource_center/repository.htm) GlobalSign (http://www.globalsign.com/developer/code-signing-certificate/index.htm) GlobalSign CPS (http://www.globalsign.com/repository/index.htm) Thawte CPS (http://www.thawte.com/cps/index.html) Dohoda o podepisování kódu vývojáře autority Thawte (http://www.thawte.com/ssl-digital-certificates/free-guideswhitepapers/pdf/develcertsign.pdf) VeriSign CPS (http://www.verisign.com/repository/CPS/) Smlouva předplatitele společnosti VeriSign (https://www.verisign.com/repository/subscriber/SUBAGR.html)
O podepisování kódu AIR Když je soubor AIR podepsán, je digitální podpis zahrnut v instalačním souboru. Podpis zahrnuje souhrn balíku, který je použit pro ověření, že soubor AIR nebyl od podepsání upraven a zahrnuje informace o certifikátu podpisu, který je použit pro ověření totožnosti vydavatele. AIR používá infrastrukturu veřejného klíče (PKI) podporovanou pomocí certifikátu operačního systému uloženého pro určení důvěryhodnosti certifikátu. Pro ověření informace vydavatele musí počítač, na kterém je aplikace AIR nainstalována, buď přímo důvěřovat certifikátu použitému pro podepsání aplikace AIR, nebo musí důvěřovat řetězci certifikátů propojujícímu certifikát s důvěryhodnou certifikační autoritou. Jestliže je soubor AIR podepsán s certifikátem, který neprovede propojení k jednomu z důvěryhodných kořenových certifikátů (a toto běžně zahrnuje všechny certifikáty s vlastním podpisem), nelze informace vydavatele ověřit. Zatímco AIR může určit, že balík AIR nebyl od jeho podepsání změněn, neexistuje způsob pro zjištění, kdo daný soubor vlastně vytvořil a podepsal.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 311 Distribuce, Instalace a Spuštění aplikací AIR
Poznámka: Uživatel si může zvolit důvěřovat certifikátu s vlastním podpisem a libovolná aplikace AIR podepsaná s certifikátem poté zobrazí hodnotu pole společného názvu v daném certifikátu jako název vydavatele. AIR neposkytuje uživatelům žádné prostředky k označení certifikátu jako důvěryhodného. Certifikát (neobsahující osobní klíč) musí být poskytnut uživateli samostatně a uživatel musí k importu certifikátu do příslušného umístění v systémovém úložišti certifikátu použít jeden z mechanismů poskytnutých operačním systémem nebo příslušným nástrojem.
O identifikátorech vydavatele AIR Jako součást procesu vytváření souboru AIR vygeneruje program AIR Developer Tool (ADT) ID vydavatele. Jedná se o identifikátor, který je jedinečný pro identifikátor použitý pro vytvoření souboru AIR. Jestliže znovu použijete stejný certifikát pro více aplikací AIR, budou mít tyto aplikace stejné ID vydavatele. ID vydavatele je použito k identifikaci aplikace AIR v komunikaci LocalConnection (Viz „Komunikace mezi aplikacemi“ na stránce 300). ID vydavatele nainstalované aplikace můžete určit načtením vlastnosti NativeApplication.nativeApplication.publisherID. Následující pole jsou použita pro vypočtení ID vydavatele: Name, CommonName, Surname, GivenName, Initials, GenerationQualifier, DNQualifier, CountryName, localityName, StateOrProvinceName, OrganizationName, OrganizationalUnitName, Title, Email, SerialNumber, DomainComponent, Pseudonym, BusinessCategory, StreetAddress, PostalCode, PostalAddress, DateOfBirth, PlaceOfBirth, Gender, CountryOfCitizenship, CountryOfResidence a NameAtBirth. Jestliže obnovíte certifikát vydaný certifikační autoritou nebo obnovíte certifikát s vlastním podpisem, musí tato pole být stejná, aby také ID vydavatele zůstalo stejné. Mimo to musí být stejný také kořenový certifikát CA a veřejný klíč certifikátu s vlastním podpisem.
O formátech certifikátu Podpisové nástroje AIR přijímají jakékoliv úložiště klíčů přístupné pomocí funkce Java Cryptography Architecture (JCA). Mezi ně patří úložiště klíčů vycházející ze souborů, například soubory s formátem PKCS12 (které obvykle používají koncovku souboru .pfx nebo .p12), soubory jazyka Java .keystore, úložiště klíčů hardware PKCS11 a systémová úložiště klíčů. Formáty úložiště klíčů, ke kterým může program ADT získat přístup, závisí na verzi a konfiguraci runtime jazyka Java použitého ke spuštění programu ADT. Přístup k některým typům úložišť klíčů, například k známkám hardware PKCS11, může vyžadovat instalaci a konfiguraci dalších ovladačů software a modulů JCA. K podepsání souborů AIR můžete použít stávající certifikát podpisu kódu nebo můžete získat nový certifikát vydaný výlučně za účelem podpisu aplikací AIR. Lze použít například libovolný z následujících typů certifikátů od společností VeriSign, Thawte, GlobalSign nebo ChosenSecurity:
• ChosenSecurity • Služba TC Publisher ID for Adobe AIR • GlobalSign • Služba ObjectSign Code Signing Certificate • Thawte: • AIR Developer Certificate • Apple Developer Certificate • JavaSoft Developer Certificate • Microsoft Authenticode Certificate • VeriSign: • Digitální identifikátor Adobe AIR • Microsoft Authenticode Digital ID
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 312 Distribuce, Instalace a Spuštění aplikací AIR
• Sun Java Signing Digital ID Poznámka: Certifikát musí být vytvořen pro podpis kódu. K podpisu souborů AIR nelze použít certifikát SSL nebo jiný typ certifikátů.
Časové známky Když podepíšete soubor AIR, nástroj balení pošle serveru dotaz ohledně autority časové známky pro získání nezávisle ověřitelného data a času podpisu. Získaná časová známka je vložena do souboru AIR. Pokud je certifikát podpisu platný v době podpisu, lze soubor AIR nainstalovat, i po vypršení certifikátu. Pokud ale není obdržena žádná časová známka, soubor AIR již nelze nainstalovat, pokud certifikát vyprší nebo je zrušen. Nástroje balení AIR implicitně získají časovou známku. Pokud ale chcete povolit zabalení aplikace, když je služba časových známek nedostupná, můžete získávání časových známek vypnout. Společnost Adobe doporučuje, aby všechny veřejně distribuované soubory AIR obsahovaly časovou známku. Výchozí autorita časových známek používaná nástroji balení AIR je Geotrust.
Získání certifikátu Pro získání certifikátu navštivte webové stránky certifikační autority a projděte procesem zprostředkování dané společnosti. Nástroje použité k vytvoření souboru úložiště klíčů potřebného nástroji AIR závisí na typu zakoupeného certifikátu, způsobu uložení certifikátu na počítači příjemce a někdy také na prohlížeči použitém k získání certifikátu. Chcete-li například získat a exportovat certifikát Adobe Developer od společnosti Thawte, musíte použít prohlížeč Mozilla Firefox. Certifikát lze poté exportovat jako soubor .p12 nebo .pfx přímo z uživatelského rozhraní prohlížeče Firefox. Certifikát s vlastním podpisem můžete vygenerovat pomocí programu Air Development Tool (ADT) používaného k balení instalačních souborů AIR. Lze také použít některé nástroje třetích stran. Pokyny pro vygenerování certifikátu s vlastním podpisem i pokyny pro podepsání souboru AIR naleznete v tématu „Zabalení instalačního souboru AIR pomocí programu AIR Developer Tool (ADT)“ na stránce 343. Soubory AIR můžete také exportovat a podepsat pomocí aplikací Flex Builder, Dreamweaver a aktualizace AIR pro nástroj Flash. Následující příklad popisuje způsob získání certifikátu vývojáře AIR od certifikační autority Thawte a přípravu tohoto certifikátu pro jeho použití s programem ADT.
Příklad: Získání certifikátu vývojáře AIR od autority Thawte Poznámka: Tento příklad ukazuje pouze jeden z mnoha způsobů získání a přípravy certifikátu podpisu kódu, který můžete použít. Každá certifikační autorita má vlastní zásady a postupy. Pro zakoupení certifikátu vývojáře AIR server autority Thawte vyžaduje použití prohlížeče Mozilla Firefox. Osobní klíč pro certifikát je uložen v úložišti klíčů prohlížeče. Ujistěte se, zda je úložiště klíčů Firefox zajištěno pomocí hlavního hesla, a že je samotný počítač fyzicky zabezpečen. (Jakmile je proces zprostředkování dokončen, můžete certifikát a osobní klíč z úložiště klíčů prohlížeče exportovat a odstranit.) Jako součást procesu přihlášení certifikátu je vygenerována dvojice osobního a veřejného klíče. Osobní klíč je automaticky uložen v úložišti klíčů aplikace Firefox. Pro vyžádání i načtení certifikátu ze serveru autority Thawte musíte použít stejný počítač a stejný prohlížeč. 1 Navštivte server autority Thawte a přejděte na Stránka produktů pro certifikáty podpisu kódu. 2 Ze seznamu certifikátů podpisu kódu vyberte Adobe AIR Developer Certificate.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 313 Distribuce, Instalace a Spuštění aplikací AIR
3 Absolvujte proces přihlášení zahrnující dva kroky. Je třeba poskytnout informace o organizaci a vaše kontaktní
údaje. Thawte poté provede proces ověření identity a může požádat o dodatečné informace. Po dokončení ověření vám autorita Thawte odešle e-mail s pokyny, jak načíst certifikát. Poznámka: Dodatečné informace o typu vyžadované dokumentace lze nalézt zde: https://www.thawte.com/ssldigital-certificates/free-guides-whitepapers/pdf/enroll_codesign_eng.pdf. 4 Načtěte vydaný certifikát ze serveru Thawte. Certifikát je automaticky uložen do úložiště klíčů aplikace Firefox. 5 Exportujte soubor úložiště klíčů obsahující osobní klíč a certifikát z úložiště klíčů Firefox pomocí následujících
kroků: Poznámka: Při exportu osobního klíče a certifikátu z aplikace Firefox je export proveden ve formátu .p12 (pfx), který může být použit programy ADT, Flex, Flash a Dreamweaver. a Otevřete dialogové okno aplikace Firefox Správce certifikátu: b V systému Windows: Otevřete položky Nástroje -> Možnosti -> Rozšířené -> Šifrování -> Certifikáty. c V systému Mac OS: Otevřete aplikaci Firefox -> Preference -> Rozšířené -> Šifrování -> Zobrazit certifikáty d V systému Linux: Otevřete položky Nástroje -> Možnosti -> Rozšířené -> Šifrování -> Certifikáty. e Ze seznamu certifikátů vyberte Adobe AIR Code Signing Certificate a klepněte na tlačítko Záloha. f
Zadejte název souboru a umístění, kam chcete soubor úložiště klíčů exportovat. Poté klepněte na možnost Uložit.
g Jestliže používáte hlavní heslo Firefox, budete požádání o zadání svého hesla pro zařízení k zabezpečení
software, abyste mohli soubor exportovat. (Toto heslo je použito pouze aplikací Firefox.) h V dialogovém okně Výběr hesla pro zálohování certifikátu vytvořte heslo pro soubor úložiště klíčů.
Důležité: Toto heslo chrání soubor úložiště klíčů a je vyžadováno, je-li soubor použit pro podpis aplikací AIR. Měli byste zvolit bezpečné heslo. i
Klepněte na tlačítko OK. Měli byste obdržet zprávu o úspěšném provedení zálohy hesla. Soubor úložiště klíčů obsahující osobní klíč a certifikát je uložen s příponou .p12 (ve formátu PKCS12)
6 Exportovaný soubor úložiště klíčů použijte s programy ADT, Flex Builder, Flash nebo Dreamweaver. Heslo
vytvořené pro tento soubor je vyžadováno při každém podpisu aplikace AIR. Důležité: Osobní klíč a certifikát jsou stále uloženy v úložišti klíčů aplikace Firefox. To vám nejen umožňuje exportovat další kopii souboru certifikátu, ale jedná se také o další bod přístupu, který musí být chráněn, aby bylo zajištěno zabezpečení vašeho certifikátu a osobního klíče.
Změna certifikátů Za některých okolností můžete potřebovat změnit certifikát, který používáte pro podpis aplikace AIR. Mezi takové okolnosti patří:
• Aktualizace z certifikátu s vlastním podpisem na certifikát vydaný certifikační autoritou. • Změna z certifikátu s vlastním podpisem, který za chvíli vyprší, na jiný • Změna z jednoho komerčního certifikátu na jiný, například při změně identity vaší společnosti. Vzhledem k tomu, že je certifikát podpisu jedním z prvků, které určují identitu aplikace AIR, nelze jednoduše podepsat aktualizaci vaší aplikace s odlišným certifikátem. Aby aplikace AIR rozpoznala soubor AIR jako aktualizaci, musíte podepsat původní i jakýkoliv aktualizovaný soubor AIR pomocí stejného certifikátu. V opačném případě nainstaluje AIR nový soubor AIR jako samostatnou aplikaci namísto aktualizace stávající aplikace.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 314 Distribuce, Instalace a Spuštění aplikací AIR
Stejně jako v případě AIR 1.1 můžete změnit certifikát podpisu aplikace pomocí podpisu přesunu. Podpis přesunu je druhým podpisem použitým na soubor AIR aktualizace. Podpis přesunu používá původní certifikát, který udává, že autor podpisu je původní vydavatel aplikace. Důležité: Certifikát musí být změněn před tím, než původní certifikát vyprší nebo je zrušen. Jestliže před vypršením svého certifikátu nevytvoříte aktualizaci podepsanou podpisem přesunu, budou uživatelé muset před instalací aktualizací nainstalovat své stávající verze vaší aplikace. Komerčně vydané certifikáty mohou být obvykle pro zamezení vypršení obnoveny. Certifikáty s vlastním podpisem obnovit nelze. Chcete-li změnit certifikáty: 1 Vytvořte aktualizaci své aplikace 2 Zabalte a podepište aktualizovaný soubor AIR pomocí certifikátu nový 3 Znovu podepište soubor AIR pomocí certifikátu původní (pomocí příkazu programu ADT -migrate)
Postup použití podpisu přesunu je popsán v tématu „Podepsání souboru AIR pro změnu certifikátu aplikace“ na stránce 352. Po instalaci aktualizovaného souboru AIR se identita aplikace změní. Tato změna identity má následující důsledky:
• ID vydavatele aplikace se změní, aby odpovídalo novému certifikátu. • Nová verze aplikace nemůže získat přístup k datům ve stávajícím kódovaném lokálním úložišti. • Umístění adresáře ukládání aplikace se změní. Data ve starém umístění nejsou zkopírována do nového adresáře. (Nicméně nová aplikace může najít původní adresář na základě starého ID vydavatele).
• Aplikace již nemůže otevřít místní připojení pomocí starého ID vydavatele. • Jestliže uživatel znovu nainstaluje soubor AIR před provedením přesunu, AIR jej nainstaluje jako samostatnou aplikaci pomocí původního ID vydavatele. Vaše aplikace je odpovědná za přesun jakýchkoliv dat mezi původní a novou verzí aplikace. Pro přesun dat v kódovaném lokálním úložišti (encrypted local store - ELS) musíte exportovat data před provedením změny certifikátu. Nová verze vaší aplikace nemůže načíst ELS staré verze. (Často je jednodušší data pouze znovu vytvořit namísto jejich přesunu.) Podpis přesunu byste měli i nadále použít na co nejvíce následujících aktualizací. V opačném případě budou muset uživatelé, kteří ještě neprovedli aktualizaci z původní aplikace, buď nainstalovat přechodnou verzi přesunu nebo odinstalovat svou aktuální verzi před tím, než mohou nainstalovat nejnovější aktualizaci. Původní certifikát může také samozřejmě vypršet a vy už nebudete moct použít podpis přesunu. (Nicméně dokud nevypnete získávání časových známek, soubory AIR dříve podepsané podpisem přesunu zůstanou platné. Podpis přesunu je opatřen časovou známkou a umožňuje AIR přijmout podpis i po vypršení certifikátu.) Soubor AIR s podpisem přesunu je v jiných ohledech běžným souborem AIR. Jestliže je aplikace v systému nainstalována bez původní verze, AIR nainstaluje novou verzi obvyklým způsobem. Poznámka: Obvykle není třeba přesunout certifikát při obnovení komerčně vydaného certifikátu. Obnovený certifikát si zachová stejnou identitu vydavatele jako certifikát původní, pokud nebyl změněn rozlišující název. Kompletní seznam atributů certifikátu, které jsou použity k určení rozlišujícího názvu, naleznete v tématu „O identifikátorech vydavatele AIR“ na stránce 311.
Terminologie Tato část poskytuje slovníček některých klíčových pojmů, kterým byste měli rozumět při rozhodování o způsobu podepsání své aplikace pro veřejnou distribuci.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 315 Distribuce, Instalace a Spuštění aplikací AIR
Pojem
Popis
Certifikační autorita (CA)
Objekt v síti infrastruktury veřejných klíčů, který slouží jako důvěryhodná třetí strana a certifikuje totožnost vlastníka veřejného klíče. CA obvykle vydává digitální certifikáty podepsané jejím vlastním osobním klíčem a označuje tak, že ověřila totožnost držitele certifikátu.
Prohlášení o postupech certifikátu (Certificate Practice Statement - CPS)
Stanovuje postupy a zásady certifikační autority při vydávání a ověřování certifikátů. CPS je součástí smlouvy mezi CA a jejími odběrateli a souvisejícími stranami. Udává také postupy pro ověření totožnosti a úroveň zaručení nabízenou certifikátem, který autorita poskytuje.
Seznam zrušených certifikátů (Certificate Revocation List - CRL)
Seznam vydaných certifikátů, které byly zrušeny a nelze již na ně spoléhat. AIR zkontroluje CRL při podpisu aplikace AIR a dále při instalaci aplikace, jestliže není přítomna žádná časová známka.
Řetězec certifikátu
Řetězec certifikátu je sekvence certifikátů, kde je každý certifikát v řetězci podepsán dalším certifikátem.
Digitální certifikát
Digitální dokument obsahující informace o totožnosti majitele, veřejném klíči majitele a totožnosti certifikátu jako takového. Certifikát vydaný certifikační autoritou je podepsán certifikátem patřícím vydávající CA.
Digitální podpis
Kódovaná zpráva nebo souhrn, který lze dekódovat pouze pomocí veřejného klíče, poloviny dvojice veřejného a osobního klíče. V infrastruktuře veřejného klíče obsahuje digitální podpis jeden nebo více digitálních certifikátů, které lze dosledovat k certifikační autoritě. Digitální podpis lze použít k ověření, zda zpráva (nebo soubor počítače) nebyla od podpisu pozměněna (v rámci omezení zajištění poskytovaného použitým kryptografickým algoritmem) a, za předpokladu, že důvěřujete vydávající certifikační autoritě, k ověření totožnosti autora podpisu.
Úložiště klíčů
Databáze obsahující digitální certifikáty a v některých případech související osobní klíče.
Java Cryptography Architecture (JCA)
Rozšířitelná architektura pro správu a získání přístupu k úložištím klíčům. Více informací naleznete v Referenční příručka Java Cryptography Architecture.
PKCS #11
Standard rozhraní kryptografické známky od RSA Laboratories. Úložiště klíčů založené na známce hardware.
PKCS #12
Standard syntaxe pro výměnu osobních informací od RSA Laboratories. Úložiště klíčů vycházející ze souboru obvykle obsahující osobní klíč a jeho asociovaný digitální certifikát.
Osobní klíč
Osobní polovina z dvoudílného asymetrického kryptografického systému veřejného a osobního klíče. Osobní klíč je nutné uchovat v tajnosti a nikdy jej nepřenášet sítí. Digitálně podepsané zprávy jsou kódovány pomocí osobního klíče autorem podpisu.
Veřejný klíč
Veřejná polovina z dvoudílného asymetrického kryptografického systému veřejného a osobního klíče. Veřejný klíč je volně dostupný a používá se k dekódování zpráv kódovaných pomocí osobního klíče.
Systém důvěry, kde certifikační autority ověřují totožnost majitelů veřejných klíčů. Klienti sítě se spoléhají na digitální certifikáty vydané důvěryhodnou CA pro ověření totožnosti autora podpisu digitální zprávy (nebo souboru).
Časová známka
Digitálně podepsaný údaj obsahující datum a čas, kdy došlo k události. ADT může do balíku AIR zahrnout časovou známku z časového serveru podléhajícího RFC 3161. Je-li časová známka k dispozici, použije ji AIR pro stanovení platnosti certifikátu v době podpisu. To umožňuje instalaci aplikace AIR po vypršení jejího certifikátu podpisu.
Autorita časové známky
Autorita, která vydává časové známky. Pro to, aby byla časová známka programem AIR rozpoznána, musí se shodovat s normou RFC 3161 a podpis časové známky musí provést zřetězení k důvěryhodnému kořenovému certifikátu v počítači instalace.
316
Kapitola 33: Aktualizace aplikací AIR Uživatelé mohou instalovat nebo aktualizovat aplikaci AIR poklepáním na soubor AIR v počítači nebo z prohlížeče (pomocí funkce hladké instalace). Správu instalace zajišťuje instalátor Adobe® AIR™, který upozorní uživatele, zda se chystá aktualizovat již existující aplikaci. (Viz „Distribuce, Instalace a Spuštění aplikací AIR“ na stránce 301.) Pomocí třídy Updater se však může instalovaná aplikace aktualizovat na novou verzi i sama. (Instalovaná aplikace umí zjistit, zda je dostupná nová verze ke stažení a instalaci.) Třída Updater zahrnuje metodu update(), která umožňuje vyhledat soubor AIR na počítači uživatele a aktualizovat jej na příslušnou verzi. ID aplikace i ID vydavatele aktualizačního souboru AIR se musí shodovat s aplikací, která má být aktualizována. ID vydavatele je odvozeno od podpisového certifikátu, což znamená, že aktualizace i aplikace, která má být aktualizována, musí být podepsány stejným certifikátem. Od verze AIR 1.1 a novější můžete migrovat aplikaci, chcete-li použít nový podpisový certifikát kódu. Migrování aplikace pro použití nového podpisu zahrnuje podepsání aktualizačního souboru AIR novým i původním certifikátem. Migrace certifikátu je nevratný proces. Po migraci budou jako aktualizace stávající instalace rozpoznány pouze soubory AIR podepsané novým certifikátem (nebo oběma certifikáty). Správa aktualizací aplikací může být složitá. Prostředí AIR 1.5 obsahuje nový aktualizační rámec pro aplikace Adobe® AIR™. Tento rámec poskytuje rozhraní API, pomocí kterých mohou vývojáři lépe zajišťovat dobré aktualizační možnosti v aplikacích AIR. Pomocí migrace certifikátu můžete změnit certifikát s vlastním podpisem na komerční podpisový certifikát kódu nebo změnit jeden certifikát s vlastním podpisem nebo komerční certifikát na jiný. Jestliže neprovedete migraci certifikátu, stávající uživatelé budou muset před instalací nové verze nejprve odebrat aktuální verzi vaší aplikace. Další informace viz „Změna certifikátů“ na stránce 313.
O aktualizaci aplikací Třída Updater (v balíčku flash.desktop) zahrnuje jednu metodu, update(), kterou můžete použít k aktualizaci aktuálně běžící aplikace s odlišnou verzí. Má-li například uživatel verzi souboru AIR („Sample_App_v2.air“) umístěnou na ploše, aplikaci aktualizuje následující kód: var updater:Updater = new Updater(); var airFile:File = File.desktopDirectory.resolvePath("Sample_App_v2.air"); var version:String = "2.01"; updater.update(airFile, version);
Než může aplikace třídu Updater použít, musí uživatel nebo aplikace stáhnout do počítače aktualizovanou verzi souboru AIR. Další informace viz „Stažení souboru AIR do počítače uživatele“ na stránce 318.
Výsledky volání metody Updater.update() Když aplikace při běhu vyvolá metodu update(), chod programu ukončí aplikaci a poté se pokusí instalovat novou verzi ze souboru AIR. Chod programu zkontroluje, zda se ID aplikace a ID vydavatele určená v souboru AIR shodují s ID aplikace a ID vydavatele pro volání metody update() dané aplikace. (Informace o ID aplikace a ID vydavatele viz „Nastavení vlastností aplikace AIR“ na stránce 43.) Také zkontroluje, zda se řetězec verze shoduje s řetězcem version předaným metodě update(). Je-li instalace úspěšně dokončena, otevře chod programu novou verzi aplikace. Jinak (pokud nebyla instalace dokončena) se znovu otevře stávající verze aplikace – ta, která byla na počítači před instalací.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 317 Aktualizace aplikací AIR
V systému Mac OS musí mít uživatel pro instalaci aktualizované verze aplikace odpovídající systémová práva k instalaci adresáře aplikace. V systémech Windows a Linux musí mít uživatel oprávnění správce. Pokud aktualizovaná verze aplikace požaduje aktualizovanou verzi modulu runtime, tato nová verze se nainstaluje. Pro aktualizaci chodu programu musí mít uživatel na daném počítači práva správce. Při testování aplikace pomocí ADL bude mít volání metody update() za následek výjimku běhu programu.
O řetězci verze Řetězec, který je zadán jako parametr version metody update() se musí shodovat s řetězcem v atributu version hlavního elementu application souboru deskriptoru aplikace pro soubor AIR, který má být instalován. Zadání parametru version je vyžadováno z důvodů zabezpečení. Požadováním, aby aplikace ověřovala číslo verze v souboru AIR, se zamezí, aby nebyla neúmyslně instalována starší verze, která by mohla obsahovat oslabení bezpečnosti, které již bylo v aktuálně instalované aplikaci opraveno. Aplikace by měla také porovnat řetězec verze v souboru AIR s řetězcem verze v instalované aplikaci, aby se zabránilo útokům nižší kategorie. Řetězec verze může mít libovolný formát. Může mít například podobu „2.01“ nebo „version 2“. Záleží na vývojáři aplikace, jaký formát řetězce použije. Chod programu řetězec verze neověřuje; tento řetězec by měl ověřit před aktualizací aplikace kód aplikace. Stahuje-li aplikace AIR soubor AIR přes web, je dobré mít nějaký mechanismus, pomocí kterého může webová služba ohlásit aplikaci Adobe AIR právě stahované verze. Aplikace pak může tento řetězec použít jako parametr version metody update(). Je-li soubor AIR získán nějakým jiným způsobem, při kterém je verze souboru AIR neznámá, aplikace AIR může soubor AIR prověřit, aby určila informace o verzi. (Soubor AIR je komprimovaným archívem ZIP a soubor deskriptoru aplikace je druhým záznamem v archívu.) Podrobnosti o souboru deskriptoru aplikace naleznete v části „Nastavení vlastností aplikace AIR“ na stránce 43.
Představení vlastního uživatelského rozhraní pro aktualizaci aplikace AIR zahrnuje výchozí rozhraní pro aktualizaci:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 318 Aktualizace aplikací AIR
Toto rozhraní je použito vždy, když uživatel poprvé instaluje na svém počítači nějakou verzi aplikace. Můžete však definovat své vlastní rozhraní pro použití pro následné instance. Pokud vaše aplikace definuje vlastní rozhraní pro aktualizaci, určete v souboru deskriptoru aplikace pro aktuálně instalovanou aplikaci element customUpdateUI: <customUpdateUI>true
Jakmile je aplikace instalována a uživatel otevře soubor AIR s ID aplikace a ID vydavatele, které se shodují s instalovanou aplikací, chod programu otevře aplikaci a ne výchozí instalátor aplikace AIR. Další informace viz „Poskytnutí zákaznického uživatelského rozhraní pro aktualizace aplikace“ na stránce 50. Aplikace může rozhodnout, když je spuštěna (když objekt NativeApplication.nativeApplication odešle událost load), zda provede aktualizaci aplikace (pomocí třídy Updater). Jestliže se rozhodne pro aktualizaci, může uživateli
předložit své vlastní instalační rozhraní (které se liší od standardního spuštěného rozhraní).
Stažení souboru AIR do počítače uživatele Chcete-li použít třídu Updater, musí uživatel nebo aplikace nejprve uložit soubor AIR místně do počítače uživatele. Poznámka: Prostředí AIR obsahuje aktualizační rámec, pomocí kterého mohou vývojáři v aplikacích AIR zajišťovat dobré aktualizační možnosti. Tento rámec můžete používat daleko jednodušeji, než když použijete přímo metodu update() třídy Update. Podrobnosti naleznete v části „Použití aktualizačního rámce“ na stránce 319. Následující kód načte soubor AIR z URL (http://example.com/air/updates/Sample_App_v2.air) a soubor AIR uloží do ukládacího adresáře aplikace: var urlString:String = "http://example.com/air/updates/Sample_App_v2.air"; var urlReq:URLRequest = new URLRequest(urlString); var urlStream:URLStream = new URLStream(); var fileData:ByteArray = new ByteArray(); urlStream.addEventListener(Event.COMPLETE, loaded); urlStream.load(urlReq); function loaded(event:Event):void { urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); writeAirFile(); } function writeAirFile():void { var file:File = File.applicationStorageDirectory.resolvePath("My App v2.air"); var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.WRITE); fileStream.writeBytes(fileData, 0, fileData.length); fileStream.close(); trace("The AIR file is written."); }
Další informace viz „Pracovní kroky při čtení a zápisu souborů“ na stránce 119.
Zjištění, zda je aplikace spuštěná poprvé Jakmile jste aktualizovali aplikaci, možná budete chtít poskytnout uživateli zprávu „začínáme“ nebo „vítejte“. Po spuštění aplikace zkontroluje, jestli je spuštěná poprvé, aby mohla určit, zda je třeba tuto zprávu zobrazit.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 319 Aktualizace aplikací AIR
Poznámka: Prostředí AIR obsahuje aktualizační rámec, pomocí kterého mohou vývojáři v aplikacích AIR zajišťovat dobré aktualizační možnosti. Tento rámec poskytuje metody, pomocí kterých lze snadno zkontrolovat, zda je verze aplikace spuštěna poprvé. Podrobnosti naleznete v části „Použití aktualizačního rámce“ na stránce 319. Jeden způsob, jak to udělat, je po inicializaci aplikace uložit soubor do ukládacího adresáře aplikace. Aplikace by při každém svém spuštění měla zkontrolovat existenci tohoto souboru. Pokud daný soubor neexistuje, znamená to, že aplikace je u aktuálního uživatele spuštěná poprvé. Pokud soubor existuje, aplikace již byla minimálně jednou spuštěná. Jestliže soubor existuje a obsahuje starší číslo verze, než je aktuální číslo verze, pak víte, že uživatel má novou verzi spuštěnou poprvé. Jestliže vaše aplikace ukládá data místně (např. do ukládacího adresáře aplikace), možná budete chtít při prvním spuštění prověřit veškerá dříve uložená data (z předcházejících verzí).
Použití aktualizačního rámce Správa aktualizací aplikací může být složitá. Aktualizační rámec pro aplikace AdobeAIR poskytuje rozhraní API, pomocí kterých mohou vývojáři lépe zajišťovat dobré aktualizační možnosti v aplikacích AIR. Funkce v aktualizačním rámci AIR pomáhají vývojářům v následujících oblastech:
• pravidelné kontroly aktualizací na základě intervalu nebo na vyžádání uživatelem; • stahování souborů AIR (aktualizací) z webového zdroje; • upozornění uživatele na první spuštění nově nainstalované verze; • potvrzení, že uživatel chce zkontrolovat aktualizace; • zobrazení informací o nové verzi aktualizace uživateli; • zobrazení informací o průběhu stahování nebo chybě uživateli. Aktualizační rámec AIR nabízí vlastní ukázkové rozhraní, které může vaše aplikace používat. Toto rozhraní uživateli poskytuje základní informace a možnosti, které souvisí s aktualizacemi aplikací. Vaše aplikace může také definovat vlastní uživatelské rozhraní, které bude používáno pro aktualizační rámec. Aktualizační rámec AIR umožňuje ukládat informace o verzi aktualizace aplikace AIR do jednoduchých konfiguračních souborů XML. Pokud nastavíte tyto konfigurační soubory a zahrnete některý základní kód, můžete u většiny aplikací poskytnout koncovému uživateli kvalitní aktualizační možnosti. Dokonce i když aktualizační rozhraní nepoužijete, zahrne prostředí Adobe AIR třídu Updater, kterou mohou aplikace AIR použít k aktualizaci na nové verze. Tato třída aplikacím umožňuje provést aktualizaci na verzi, která je obsažena v souboru AIR v počítači uživatele. Správa aktualizací však může obsahovat více možností, než je pouze nechat aplikaci aktualizovat na základě místně uloženého souboru AIR.
Soubory v aktualizačním rámci AIR Aktualizační rámec AIR obsahuje následující adresáře:
• doc – Dokumentace pro aktualizační rámec AIR, kterou právě čtete. • frameworks – Tento adresář obsahuje soubory SWC pro vývoj ve formátu Flex a soubory SWF pro vývoj ve formátu HTML. Další informace naleznete v těchto částech (které jsou ihned za touto částí):
• „Nastavení vývojového prostředí Flex“ na stránce 320 • „Zahrnutí souborů rámce do aplikací AIR založených na jazyce HTML“ na stránce 320
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 320 Aktualizace aplikací AIR
• samples – Tento adresář obsahuje ukázky založené na formátu Flex i HTML, které ukazují, jak lze používat aktualizační rámec aplikace. Tyto soubory můžete kompilovat a testovat stejně jako kteroukoli aplikaci AIR.
• templates – Tento adresář obsahuje ukázkové soubory deskriptoru aktualizace (jednoduché i lokalizované) a konfigurační soubory. (Další informace o těchto souborech viz části Nastavení vývojového prostředí Flex a „Základní příklad: Použití verze ApplicationUpdaterUI“ na stránce 321.)
Nastavení vývojového prostředí Flex Adresář aktualizačního rámce frameworks/flex obsahuje tyto soubory:
• ApplicationUpdater.swc – Definuje základní funkce aktualizační knihovny, neobsahuje žádné uživatelské rozhraní. • ApplicationUpdater_UI.swc – Definuje základní funkce aktualizační knihovny, obsahuje uživatelské rozhraní, které může vaše aplikace použít k zobrazení možností aktualizace. Soubory SWC definují třídy, které lze používat k vývoji v prostředí Flex. Chcete-li používat aktualizační rámec při kompilování pomocí sady Flex SDK, zahrňte do volání kompilátoru amxmlc buď soubor ApplicationUpdater.swc nebo ApplicationUpdater_UI.swc. V následujícím příkladě načítá kompilátor soubor ApplicationUpdater.swc do podadresáře lib adresáře sady Flex SDK: amxmlc -library-path+=lib/ApplicationUpdater.swc
-- myApp.mxml
V následujícím příkladě načítá kompilátor soubor ApplicationUpdater_UI.swc do podadresáře lib adresáře sady Flex SDK: amxmlc -library-path+=lib/ApplicationUpdater_UI.swc
-- myApp.mxml
Pokud při vývoji používáte aplikaci Flex Builder, přidejte soubor SWC v dialogovém okně vlastností do nastavení cesty sestavení Flex na záložce cesty knihovny. Nezapomeňte soubory SWC zkopírovat do adresáře, na který budete odkazovat v kompilátoru amxmlc (při použití sady Flex SDK) nebo aplikaci Flex Builder.
Zahrnutí souborů rámce do aplikací AIR založených na jazyce HTML Adresář aktualizačního rámce frameworks/html obsahuje tyto soubory:
• ApplicationUpdater.swf – Definuje základní funkce aktualizační knihovny, neobsahuje žádné uživatelské rozhraní. • ApplicationUpdater_UI.swf – Definuje základní funkce aktualizační knihovny, obsahuje uživatelské rozhraní, které může vaše aplikace použít k zobrazení možností aktualizace. Kód jazyka JavaScript v aplikacích AIR může používat třídy, které jsou definované v souborech SWF. Chcete-li používat aktualizační rámec, zahrňte buď soubor ApplicationUpdater.swf nebo ApplicationUpdater_UI.swf do adresáře (nebo podadresáře) aplikace. Potom do souboru HTML, který bude tento rámec používat, zahrňte tag script načítající tento soubor: <script src="applicationUpdater.swf" type="application/x-shockwave-flash"/>
Také můžete k načtení souboru ApplicationUpdater_UI.swf použít tento tag script: <script src="ApplicationUpdater_UI.swf" type="application/x-shockwave-flash"/>
Rozhraním API, která jsou definována v těchto dvou souborech, se věnuje zbývající část tohoto dokumentu.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 321 Aktualizace aplikací AIR
Základní příklad: Použití verze ApplicationUpdaterUI Verze ApplicationUpdaterUI aktualizačního rámce poskytuje základní rozhraní, které můžete snadno využívat ve své aplikaci. Následuje základní příklad. Nejdříve vytvořte aplikaci AIR, která volá aktualizační rámec: 1 Pokud je vaše aplikace AIR založena na jazyku HTML, načtěte soubor ApplicationUpdaterUI.js: <script src="ApplicationUpdater_UI.swf" type="application/x-shockwave-flash"/>
2 Konkretizujte v programové logice aplikace AIR objekt ApplicationUpdaterUI.
V jazyku ActionScript použijte následující kód: var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
V jazyku JavaScript použijte následující kód: var appUpdater = new runtime.air.update.ApplicationUpdaterUI();
Tento kód bude možná potřeba přidat do inicializační funkce, která se spouští při načtení aplikace. 3 Vytvořte textový soubor s názvem „updateConfig.xml“ a do tohoto souboru přidejte následující kód: http://example.com/updates/update.xml <delay>1
Upravte element URL souboru updateConfig.xml tak, aby odpovídal konečnému umístění souboru deskriptoru aktualizace na webovém serveru (viz následující postup). Hodnota delay představuje počet dnů, po které aplikace mezi kontrolami aktualizaci čeká. 4 Přidejte soubor updateConfig.xml do adresáře projektu aplikace AIR. 5 Objekt nástroje updater nechte odkazovat na soubor updateConfix.xml a volejte metodu initialize() objektu.
V jazyku JavaScript použijte následující kód: appUpdater.configurationFile = new File("app:/updateConfig.xml"); appUpdater.initialize();
V jazyku JavaScript použijte následující kód: appUpdater.configurationFile = new air.File("app:/updateConfig.xml"); appUpdater.initialize();
6 Vytvořte druhou verzi prostředí AIR, která má jinou verzi než první prostředí. (Verze je určena v souboru
deskriptoru aplikace v elementu version.) V dalším kroku přidejte tuto verzi aktualizace aplikace AIR na webový server: 1 Umístěte verzi aktualizace souboru AIR na webový server. 2 Vytvořte textový soubor s názvem „updateDescriptor.xml“ a do tohoto souboru přidejte následující obsah: 1.1http://example.com/updates/sample_1.1.air <description>This is the latest version of the Sample application.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 322 Aktualizace aplikací AIR
Upravte elementy version, URL a description souboru updateDescriptor.xml tak, aby odpovídaly souboru aktualizace AIR. 3 Přidejte soubor updateDescriptor.xml do stejného adresáře webového serveru, který obsahuje i soubor aktualizace AIR.
I když se jedná pouze o základní příklad, poskytuje základní funkce, které jsou pro většinu aplikací dostačující. Zbývající části tohoto dokumentu popisují, jak používat aktualizační rámec způsobem, který nejlépe vyhoví vašim potřebám. Máte-li zájem o další příklad použití aktualizačního rámce, viz následující ukázková aplikace na webu Adobe AIR Developer Center: Update Framework in a Flash-based Application (Aktualizační rámec v aplikaci založené na technologii Flash)(http://www.adobe.com/go/learn_air_qs_update_framework_flash_cz).
Definice souboru deskriptoru aktualizace a přidání souboru AIR na webový server Při používání aktualizačního rámce AIR definujete základní informace o dostupné aktualizaci v souboru deskriptoru aktualizace a tento soubor uložíte na webový server. Soubor deskriptoru aktualizace je jednoduchý soubor XML. Aktualizační rámec obsažený v aplikaci pomocí kontroly tohoto souboru zjišťuje, zda byla odeslána nová verze. Soubor deskriptoru aktualizace obsahuje následující data:
•
version – Nová verze aplikace AIR. Tento řetězec a řetězec, který je pro verzi použitý v novém souboru
deskriptoru prostředí AIR, se musí shodovat. Pokud verze v souboru deskriptoru aktualizace neodpovídá verzi souboru aktualizace AIR, vyvolá aktualizační rámec výjimku.
•
url – Umístění souboru aktualizace AIR. Toto je soubor, který obsahuje verzi aktualizace aplikace AIR.
•
description – Podrobný popis nové verze. Tyto informace je možné během procesu aktualizace zobrazit uživateli.
Elementy version a url jsou povinné. Element description je volitelný. Zde je ukázkový soubor deskriptoru aktualizace: 1.1a1http://example.com/updates/sample_1.1a1.air <description>This is the latest version of the Sample application.
Pokud chcete definovat tag description pomocí více jazyků, použijte více elementů text definujících atribut lang: 1.1a1http://example.com/updates/sample_1.1a1.air <description> English descriptionFrench descriptionRomanian description
Umístěte soubor deskriptoru aplikace i soubor aktualizace AIR na webový server. Adresář templates obsažený v deskriptoru aktualizace obsahuje ukázkové soubory deskriptoru aktualizace, které obsahují jednojazyčné i vícejazyčné verze.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 323 Aktualizace aplikací AIR
Konkretizace objektu nástroje updater Až načtete aktualizační rámec AIR do kódu (viz části „Nastavení vývojového prostředí Flex“ na stránce 320 a „Zahrnutí souborů rámce do aplikací AIR založených na jazyce HTML“ na stránce 320), je třeba konkretizovat objekt nástroje updater. Příklad: var appUpdater:ApplicationUpdater = new ApplicationUpdater();
Předchozí kód používá třídu ApplicationUpdater (která neposkytuje žádné uživatelské rozhraní). Pokud chcete používat třídu ApplicationUpdaterUI (která uživatelské rozhraní poskytuje), použijte následující kód: var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
Zbývající ukázky kódu v tomto dokumentu předpokládají, že jste konkretizovali objekt nástroje updater s názvem appUpdater.
Konfigurace nastavení aktualizace Verze ApplicationUpdater i ApplicationUpdaterUI lze konfigurovat prostřednictvím konfiguračního souboru dodaného s aplikací nebo prostřednictvím kódu jazyků ActionScript nebo JavaScript v aplikaci.
Definice nastavení aktualizace v konfiguračním souboru XML Konfigurační soubor aktualizace je soubor ve formátu XML. Obsahuje následující elementy:
•
updateURL – Řetězec. Představuje umístění deskriptoru aktualizace na vzdáleném serveru. Je povolena jakákoli platná hodnota umístění URLRequest. Je třeba prostřednictvím konfiguračního souboru nebo skriptu definovat vlastnost updateURL (viz část „Definice souboru deskriptoru aktualizace a přidání souboru AIR na webový server“ na stránce 322). Tuto vlastnost musíte definovat dříve, než začnete nástroj updater používat (než voláte metodu initialize() objektu nástroje updater popsanou v části „Inicializace aktualizačního rámce“ na stránce 325).
•
delay – Číslo. Představuje časové období kontroly aktualizací vyjádřené ve dnech (jsou povoleny hodnoty typu 0.25). Hodnota 0 (výchozí) určuje, že nástroj updater pravidelnou automatickou kontrolu neprovádí.
Kromě elementů updateURL a delay může konfigurační soubor pro verzi ApplicationUpdaterUI obsahovat i následující elementy:
•
defaultUI: Seznam elementů dialog. Každý element dialog má atribut name, který odpovídá dialogovému oknu
v uživatelském rozhraní. Každý element dialog má atribut visible, který definuje, zda je dialogové okno viditelné. Výchozí hodnota je true. Atribut name může nabývat následujících hodnot:
•
"checkForUpdate" – Odpovídá dialogovým oknům Check for Update (Kontrola aktualizací), No Update
(Žádné aktualizace) a Update Error (Chyba aktualizace).
•
"downloadUpdate" – Odpovídá dialogovému oknu Download Update (Stáhnutí aktualizace).
•
"downloadProgress" – Odpovídá dialogovým oknům Download Progress (Průběh stahování) a Download
Error (Chyba stahování).
•
•
"installUpdate" – Odpovídá dialogovému oknu Install Update (Instalace aktualizace).
•
"fileUpdate" – Odpovídá dialogovým oknům File Update (Aktualizace souboru), File No Update (Soubor bez aktualizace) a File Error (Chyba souboru).
"unexpectedError" – Odpovídá dialogovému oknu Unexpected Error (Neočekávaná chyba).
Pokud jsou nastaveny na false, odpovídající dialogové okno se během postupu aktualizace neobjeví. Zde je příklad konfiguračního souboru pro rámec ApplicationUpdater:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 324 Aktualizace aplikací AIR
http://example.com/updates/update.xml <delay>1
Zde je příklad konfiguračního souboru pro rámec ApplicationUpdaterUI, který obsahuje definici pro element defaultUI: http://example.com/updates/update.xml <delay>1 <defaultUI>
Vlastnost configurationFile nastavte na umístění tohoto souboru – viz následující příklady kódu jazyků
• ActionScript: appUpdater.configurationFile = new File("app:/cfg/updateConfig.xml");
• JavaScript: appUpdater.configurationFile = new air.File("app:/cfg/updateConfig.xml");
Adresář templates aktualizačního rámce obsahuje ukázkový konfigurační soubor config-template.xml.
Definice kódu jazyka ActionScript nebo JavaScript pro nastavení aktualizace Tyto parametry konfigurace lze také nastavit pomocí kódu v aplikaci (viz následující příklad): appUpdater.updateURL = " http://example.com/updates/update.xml"; appUpdater.delay = 1;
Objekt nástroje updater má vlastnosti updateURL a delay. Tyto vlastnosti definují stejná nastavení jako elementy updateURL a delay v konfiguračním souboru – URL souboru deskriptoru aktualizace a prodlevu kontroly aktualizací. Pokud určíte konfigurační soubor a zároveň i nastavení v kódu, přepisují jakékoli vlastnosti nastavené pomocí kódu příslušná nastavení v konfiguračním souboru. Než nástroj updater použijete (než voláte metodu initialize() objektu nástroje updater popsanou v části „Inicializace aktualizačního rámce“ na stránce 325), je třeba prostřednictvím konfiguračního souboru nebo skriptu definovat vlastnost updateURL (viz část „Definice souboru deskriptoru aktualizace a přidání souboru AIR na webový server“ na stránce 322). Rámec ApplicationUpdaterUI definuje tyto další vlastnosti objektu nástroje updater:
•
isCheckForUpdateVisible – Odpovídá dialogovým oknům Check for Update (Kontrola aktualizací), No Update
(Žádné aktualizace) a Update Error (Chyba aktualizace).
•
isDownloadUpdateVisible – Odpovídá dialogovému oknu Download Update (Stáhnutí aktualizace).
•
isDownloadProgressVisible – Odpovídá dialogovým oknům Download Progress (Průběh stahování) a Download Error (Chyba stahování).
•
isInstallUpdateVisible – Odpovídá dialogovému oknu Install Update (Instalace aktualizace).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 325 Aktualizace aplikací AIR
•
isFileUpdateVisible – Odpovídá dialogovým oknům File Update (Aktualizace souboru), File No Update (Soubor bez aktualizace) a File Error (Chyba souboru).
•
isUnexpectedErrorVisible – Odpovídá dialogovému oknu Unexpected Error (Neočekávaná chyba).
Každá vlastnost odpovídá jednomu nebo více dialogovým oknům v uživatelském rozhraní rámce ApplicationUpdaterUI. Každá vlastnost je Booleovská hodnota; výchozí hodnota je true. Pokud jsou nastaveny na false, odpovídající dialogová okna se během postupu aktualizace neobjeví. Tyto vlastnosti dialogových oken potlačí nastavení v souboru konfigurace aktualizace.
Proces aktualizace K dokončení procesu aktualizace musí aktualizační rámec AIR projít následujícími kroky: 1 Inicializace nástroje updater zkontroluje, zda byla v rámci definovaného časového období prodlevy provedena
kontrola aktualizace (viz část „Konfigurace nastavení aktualizace“ na stránce 323). Pokud má být provedena kontrola aktualizace, aktualizační proces pokračuje. 2 Nástroj updater stáhne a interpretuje soubor deskriptoru aktualizace. 3 Nástroj updater stáhne soubor aktualizace AIR. 4 Nástroj updater nainstaluje aktualizovanou verzi aplikace.
Po dokončení každého jednotlivého kroku odesílá objekt nástroje updater příslušné události. Ve verzi ApplicationUpdater můžete události označující úspěšné dokončení kroků tohoto procesu zrušit. Pokud jednu z těchto událostí zrušíte, je zrušen i následující krok procesu. Ve verzi ApplicationUpdaterUI představuje nástroj updater dialogová okna, pomocí kterých mohou uživatelé v každém kroku procesu vybrat, zda chtějí proces zrušit nebo zda chtějí pokračovat. Pokud událost zrušíte a chcete v procesu pokračovat, můžete volat metody objektu nástroje updater. V průběhu procesu aktualizace zaznamenává verze nástroje updater ApplicationUpdater do vlastnosti currentState aktuální stav procesu aktualizace. Tato vlastnost je nastavena na řetězec, který může nabývat těchto hodnot:
•
"UNINITIALIZED" – Nástroj updater nebyl inicializován.
•
"INITIALIZING" – Nástroj updater se právě inicializuje.
•
"READY" – Nástroj updater byl inicializován.
•
"BEFORE_CHECKING" – Nástroj updater ještě nezkontroloval soubor deskriptoru aktualizace.
•
"CHECKING" – Nástroj updater právě kontroluje soubor deskriptoru aktualizace.
•
"AVAILABLE" – Soubor deskriptoru nástroje updater je k dispozici.
•
"DOWNLOADING" – Nástroj updater právě stahuje soubor AIR.
•
"DOWNLOADED" – Nástroj updater stáhl soubor AIR.
•
"INSTALLING" – Nástroj updater právě instaluje soubor AIR.
•
"PENDING_INSTALLING" – Nástroj updater byl inicializován a existují neprovedené aktualizace.
Některé metody objektu nástroje updater se spouští pouze tehdy, pokud je nástroj updater v určitém stavu.
Inicializace aktualizačního rámce Po nastavení vlastností konfigurace (viz část „Základní příklad: Použití verze ApplicationUpdaterUI“ na stránce 321) inicializujte aktualizaci voláním metody initialize():
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 326 Aktualizace aplikací AIR
appUpdater.initialize();
Tato metoda provádí následující kroky:
• Inicializuje aktualizační rámec, jakékoli neprovedené aktualizace nainstaluje synchronně na pozadí. Tuto metodu je třeba volat při spuštění aplikace, protože při jejím volání může dojít k restartování aplikace.
• Kontroluje, zda existují odložené aktualizace, a tyto aktualizace nainstaluje. • Pokud se během procesu aktualizace vyskytne chyba, vymaže z ukládacího prostoru aplikace informace o souboru a verzi aktualizace.
• Pokud prodleva již vypršela, spustí proces aktualizace. V opačném případě restartuje časovač. Když voláte tuto metodu, může objekt nástroje updater odeslat následující událostí:
•
UpdateEvent.INITIALIZED – Odešle se při dokončení inicializace.
•
ErrorEvent.ERROR – Odešle se, když se během inicializace vyskytne chyba.
Při odeslání události UpdateEvent.INITIALIZED je proces aktualizace dokončen. Voláte-li metodu initialize(), nástroj updater spustí proces aktualizace a dokončí všechny kroky na základě nastavení prodlevy v časovači. Proces aktualizace ale můžete také kdykoli spustit voláním metody checkNow() objektu nástroje updater: appUpdater.checkNow();
Pokud je proces aktualizace již spuštěný, neprovede tato metoda žádnou akci. V opačném případě spustí proces aktualizace. Když voláte metodu checkNow() může objekt nástroje updater odeslat následující událost:
•
UpdateEvent.CHECK_FOR_UPDATE: Tato událost je odeslána těsně před tím, než se objekt pokusí stáhnout soubor
deskriptoru aktualizace. Pokud událost checkForUpdate zrušíte, můžete volat metodu checkForUpdate() objektu nástroje updater (viz následující část). Pokud tuto událost nezrušíte, pokračuje proces aktualizace ke kontrole souboru deskriptoru aktualizace.
Správa procesu aktualizace ve verzi ApplicationUpdaterUI Ve verzi ApplicationUpdaterUI mohou uživatelé prostřednictvím tlačítek Zrušit v dialogových oknech uživatelského rozhraní tento proces zrušit. Proces aktualizace můžete také zrušit programaticky voláním metody cancelUpdate() objektu ApplicationUpdaterUI. Chcete-li určit, která dialogová okna nástroj updater zobrazuje, můžete nastavit vlastnosti objektu ApplicationUpdaterUI nebo definovat elementy v konfiguračním souboru aktualizace. Podrobnosti naleznete v části „Konfigurace nastavení aktualizace“ na stránce 323.
Správa procesu aktualizace ve verzi ApplicationUpdater Chcete-li zrušit kroky procesu aktualizace, můžete volat metodu preventDefault() objektu událostí odeslaného objektem ApplicationUpdater (viz část „Proces aktualizace“ na stránce 325). Pokud zrušíte výchozí chování, může aplikace uživatelům zobrazit zprávu s dotazem, zda chtějí pokračovat. Následující části popisují způsob, jak pokračovat v procesu aktualizace, když byl některý krok tohoto procesu zrušen.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 327 Aktualizace aplikací AIR
Stáhnutí a interpretace souboru deskriptoru aktualizace Před začátkem procesu aktualizace (těsně před tím, než se nástroj updater pokusí stáhnout soubor deskriptoru aktualizace) odešle objekt ApplicationUpdater událost checkForUpdate. Pokud zrušíte výchozí chování události checkForUpdate, nástroj updater nestáhne soubor deskriptoru aktualizace. Pokud chcete v procesu aktualizace pokračovat, volejte metodu checkForUpdate(): appUpdater.checkForUpdate();
Volání metody checkForUpdate() způsobí, že nástroj updater asynchronně stáhne a interpretuje soubor deskriptoru aktualizace. Výsledkem volání metody checkForUpdate() je, že objekt nástroje updater může odeslat následující události:
•
StatusUpdateEvent.UPDATE_STATUS – Nástroj updater úspěšně stáhnul a interpretoval soubor deskriptoru aktualizace. Tato událost má následující vlastnosti:
•
available – Booleovská hodnota. Pokud je dostupná jiná verze, než jaká je verze stávající aplikace, je nastavena
na hodnotu true. V opačném případě (pokud je verze stejná) je nastavena na hodnotu false.
•
version – Řetězec. Verze souboru deskriptoru aplikace souboru aktualizace.
•
details – Pole. Pokud neexistují lokalizované verze popisu, vrací toto pole jako první element prázdný řetězec
("") a jako druhý element popis. Pokud v souboru deskriptoru aktualizace existuje více verzí popisu, obsahuje toto pole více podpolí. Každé pole má dva elementy. Prvním elementem je jazykový kód (například "en"), druhým je odpovídající popis pro tento jazyk (řetězec). Viz část „Definice souboru deskriptoru aktualizace a přidání souboru AIR na webový server“ na stránce 322.
•
StatusUpdateErrorEvent.UPDATE_ERROR – Došlo k chybě, nástroj updater nedokáže stáhnout nebo
interpretovat soubor deskriptoru aktualizace.
Stáhnutí souboru aktualizace AIR Poté, co nástroj updater úspěšně stáhne a interpretuje soubor deskriptoru aktualizace, odešle objekt ApplicationUpdater událost updateStatus. Výchozím chováním je spustit stahování, pokud je soubor aktualizace dostupný. Pokud toto výchozí chování zrušíte a chcete v procesu aktualizace pokračovat, můžete volat metodu downloadUpdate(): appUpdater.downloadUpdate();
Volání této metody způsobí, že nástroj updater asynchronně stáhne verzi aktualizace souboru AIR. Metoda downloadUpdate() může odesílat následující události:
•
UpdateEvent.DOWNLOAD_START – Bylo navázáno připojení k serveru. Pokud používáte knihovnu
ApplicationUpdaterUI, zobrazí tato událost dialogové okno s indikátorem průběhu umožňující sledovat průběh stahování.
•
ProgressEvent.PROGRESS – Odesílá se pravidelně v průběhu stahování souboru.
•
DownloadErrorEvent.DOWNLOAD_ERROR – Odešle se, pokud dojde při připojování nebo stahování souboru aktualizace k chybě. Odesílá se také pro neplatné stavy HTTP (jako je například hlášení informující o chybějícím souboru „404 - File not found“). Tato událost má vlastnost errorID; tato vlastnost je tvořena celým číslem, které definuje další informace o chybě. Další vlastnost subErrorID může obsahovat více informací o chybě.
•
UpdateEvent.DOWNLOAD_COMPLETE – Nástroj updater úspěšně stáhnul a interpretoval soubor deskriptoru
aktualizace. Pokud tuto událost nezrušíte, verze ApplicationUpdater pokračuje a nainstaluje verzi aktualizace. Ve verzi ApplicationUpdaterUI se uživatelům zobrazí dialogové okno, kde mohou vybrat, zda chtějí pokračovat.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 328 Aktualizace aplikací AIR
Aktualizace aplikace Když je stáhnutí souboru aktualizace dokončeno, odešle objekt ApplicationUpdater událost downloadComplete. Pokud toto výchozí chování zrušíte a chcete v procesu aktualizace pokračovat, můžete volat metodu installUpdate(): appUpdater.installUpdate(file);
Voláním této metody nainstalujete verzi aktualizace souboru AIR. Tato metoda obsahuje jeden parametr – file. Jedná se o objekt File, který odkazuje na soubor AIR použitý pro aktualizaci. Když voláte metodu installUpdate(), může pak objekt ApplicationUpdater odeslat událost beforeInstall:
•
UpdateEvent.BEFORE_INSTALL – Odešle se těsně před instalací aktualizace. Někdy je vhodné zabránit okamžité
instalaci aktualizace; uživatel tak může před pokračováním aktualizace dokončit stávající práci. Pokud voláte metodu preventDefault() objektu Event, odložíte instalaci až do dalšího restartování počítače. Také nelze spustit žádný další proces aktualizace (sem patří aktualizace inicializované voláním metody checkNow() nebo pravidelnými kontrolami).
Instalace z libovolného souboru AIR Chcete-li provést instalaci ze souboru AIR v počítači uživatele, nainstalujte verzi aktualizace voláním metody installFromAIRFile(): appUpdater.installFromAIRFile();
Touto metodou nainstaluje nástroj updater verzi aktualizace aplikace ze souboru AIR. Metoda installFromAIRFile() může odesílat následující události:
•
StatusFileUpdateEvent.FILE_UPDATE_STATUS – Odešle se poté, co verze ApplicationUpdater odeslaný soubor
úspěšně ověřila pomocí metody installFromAIRFile(). Tato událost má následující vlastnosti:
•
available – Pokud je dostupná jiná verze, než jaká je verze stávající aplikace, je nastavena na hodnotu true. V opačném případě (pokud jsou verze stejné) je nastavena na hodnotufalse.
•
version – Řetězec představující novou dostupnou verzi.
•
path – Představuje nativní cestu souboru aktualizace.
Pokud je dostupná vlastnost objektu StatusFileUpdateEvent nastavena na hodnotu true, můžete tuto událost zrušit. Pokud tuto událost zrušíte, zrušíte pokračování aktualizace. Chcete-li ve zrušené aktualizaci pokračovat, volejte metodu installUpdate().
•
StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR – Došlo k chybě; nástroj updater nedokáže aplikaci AIR
nainstalovat.
Zrušení procesu aktualizace Pokud chcete proces aktualizace zrušit, volejte metodu cancelUpdate(): appUpdater.cancelUpdate();
Tato metoda zruší všechny neprovedené aktualizace, odstraní všechny zcela nestáhnuté soubory a restartuje časovač pravidelných kontrol. Pokud se objekt nástroje updater inicializuje, neprovede tato metoda žádnou akci.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 329 Aktualizace aplikací AIR
Lokalizace rozhraní ApplicationUpdaterUI Třída ApplicationUpdaterUI poskytuje pro proces aktualizace výchozí uživatelské rozhraní. Součástí tohoto rozhraní jsou dialogová okna, která dávají uživatelům možnost tento proces spustit nebo zrušit a provádět související akce. Element description souboru deskriptoru aktualizace umožňuje definovat popis aplikace ve více jazycích pomocí více elementů text, které definují atributy lang (viz následující příklad): 1.1a1http://example.com/updates/sample_1.1a1.air <description> English descriptionFrench descriptionRomanian description
Aktualizační rámec používá popis, který nejlépe odpovídá lokalizačnímu řetězci koncového uživatele. Další informace naleznete v části Definice souboru deskriptoru aktualizace a přidání souboru AIR na webový server. Vývojáři pro prostředí Flex mohou nový jazyk přidat přímo do svazku "ApplicationUpdaterDialogs". Vývojáři pro prostředí jazyka JavaScript mohou volat metodu addResources() objektu nástroje updater. Tato metoda dynamicky přidává pro každý jazyk nový zdrojový svazek. Zdrojový svazek definuje pro jazyk lokalizované řetězce. Tyto řetězce jsou použité v různých textových polích dialogových oken. Vývojáři pro prostředí jazyka JavaScript mohou definovat místní řetězec použitý uživatelským rozhraním pomocí vlastnosti localeChain třídy ApplicationUpdaterUI. Tuto vlastnost obvykle používají vývojáři pro prostředí jazyka JavaScript (HTML). Vývojáři pro prostředí Flex mohou místní řetězec spravovat pomocí třídy ResourceManager. Následující kód jazyka JavaScript například definuje zdrojové svazky pro rumunštinu a maďarštinu: appUpdater.addResources("ro_RO", {titleCheck: "Titlu", msgCheck: "Mesaj", btnCheck: "Buton"}); appUpdater.addResources("hu", {titleCheck: "Cím", msgCheck: "Üzenet"}); var languages = ["ro", "hu"]; languages = languages.concat(air.Capabilities.languages); var sortedLanguages = air.Localizer.sortLanguagesByPreference(languages, air.Capabilities.language, "en-US"); sortedLanguages.push("en-US"); appUpdater.localeChain = sortedLanguages;
Podrobnosti naleznete v referenční příručce jazyka v popisu metody addResources() třídy ApplicationUpdaterUI.
330
Kapitola 34: Lokalizace aplikací AIR Aplikace Adobe® AIR™ 1.1 zahrnuje podporu pro několik jazyků.
Úvod do lokalizace Lokalizace je proces zahrnutí datových zdrojů pro podporu několika lokálních verzí. Lokální verze je kombinací jazyka a kódu země. Například en_US označuje angličtinu jako jazyk používaný v USA, fr_FR pak francouzštinu používanou ve Francii. Pro lokalizování aplikace v těchto lokálních verzích budete muset poskytnout dvě sady datových zdrojů: jednu pro verzi en_US a druhou pro fr_FR. Lokální verze mohou sdílet jazyky. Například en_US a en_GB (Velká Británie) jsou odlišné lokální verze. V tomto případě obě lokální verze používají anglický jazyk, ale kód země označuje jiné místo a proto může být možné použití jiných datových zdrojů. Například aplikace v lokální verzi en_US může hláskovat slovo „color“, zatímco totéž bude ve verzi en_GB ve formě „colour“. Jednotky měny mohou být dolary nebo libry, v závislosti na lokální verzi a formát dat a času může být také odlišný. Můžete také poskytnout datové zdroje pro jazyk bez specifikování kódu země. Například můžete poskytnout datové zdroje pro angličtinu a další datové zdroje pro lokální verzi en_US, specifickou pro americkou angličtinu. AIR SDK poskytuje lokalizační strukturu HTML Localization Framework (obsažený v souboru AIRLocalizer.js). Tato struktura zahrnuje rozhraní API, které pomáhá při práci s různými lokálními verzemi. Podrobnosti viz „Lokalizace obsahu HTML“ na stránce 331. Lokalizace neznamená pouze překlad řetězců použitých v aplikaci. Zahrnuje také kterýkoliv typ datových zdrojů, například audio soubory, obrázky a videa.
Lokalizace názvu aplikace a popisu v instalačním programu aplikace Můžete specifikovat několik jazyků pro prvky name a description v popisovacím souboru aplikace. Například následující určuje název aplikace ve třech jazycích (angličtina, francouzština, němčina): Sample 1.0Échantillon 1.0Stichprobe 1.0
Atribut xml:lang pro každý textový element určuje jazykový kód; definice těchto kódů naleznete v dokumentu RFC4646 RFC4646 (http://www.ietf.org/rfc/rfc4646.txt). Název prvku definuje název aplikace, který zobrazuje instalační program aplikace AIR. Instalační program aplikace AIR používá lokalizovanou hodnotu, která nejlépe odpovídá jazykům rozhraní definovaným nastavením operačního souboru. Podobně můžete specifikovat několik jazykových verzí prvku description v souboru popisovače aplikace. Tento prvek definuje text popisovače, který zobrazuje instalační program aplikace AIR.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 331 Lokalizace aplikací AIR
Tato nastavení platí pouze pro jazyk dostupný v instalačním programu aplikace AIR. Nedefinují lokální verze dostupné pro spuštění instalované aplikace. Aplikace AIR může poskytnout uživatelské rozhraní podporující několik jazyků, včetně těch, které jsou dostupné pro instalační program aplikace AIR. Další informace viz „Definování vlastností v souboru deskriptoru aplikace“ na stránce 44.
Výběr lokální verze Pro stanovení, která lokální verze je používána aplikací, můžete použít jednu z následujících metod:
• Výzva pro uživatele - můžete spustit aplikaci v některé výchozí lokální verzi a pak se uživatele dotázat, zda chce zvolit jinou verzi.
•
Capabilities.languages - vlastnost Capabilities.languages uvádí seznam pole jazyků dostupných pro
upřednostňovaný jazyk uživatele, nastavený prostřednictvím operačního systému. Tyto řetězce obsahují jazykové tagy (případně také skript a informace o oblasti); jejich definici naleznete v dokumentu RFC4646 (http://www.ietf.org/rfc/rfc4646.txt). Řetězce používají jako oddělovací znak pomlčky (například "en-US" nebo "ja-JP"). První záznam ve vráceném poli bude mít stejnou identifikaci primárního jazyka jako vlastnost language. Pokud je například vlastnost languages[0] nastavena na hodnotu "en-US", pak je vlastnost language nastavena na hodnotu "en".Pokud je však vlastnost language nastavena na "xu" (specifikace neznámého jazyka), první prvek v poli languages bude odlišný.
•
Capabilities.language - vlastnost Capabilities.language poskytuje uživatelskému rozhraní kód jazyka operačního systému.. Tato vlastnost je však omezena na 20 známých jazyků. U anglických systémů vrátí tato vlastnost pouze jazykový kód a nikoliv kód země. Z těchto důvodu je lepší použít první prvek v poli Capabilities.languages.
Lokalizace obsahu Flash Aplikace Flash CS3 a Flash CS4 obsahují v komponentách jazyka ActionScript 3.0 třídu Locale. Třída Locale umožňuje ovládat způsob zobrazování vícejazyčného textu souboru SWF. Panel Flash Strings umožňuje používat v dynamických textových polích místo přesných hodnot identifikátory řetězců. To umožní vytvořit soubor SWF, který zobrazí text zavedený ze souboru XML pro konkrétní jazyk. Informace o používání třídy Locale viz také Flash Referenční příručka jazyka ActionScript 3.0 a jeho součástí.
Lokalizace obsahu HTML Balík AIR 1.1 SDK obsahuje lokalizační strukturu HTML. Soubor skriptu JavaScript AIRLocalizer.js tuto strukturu definuje. Adresář struktury balíku AIR SDK obsahuje soubor AIRLocalizer.js. Tento soubor zahrnuje třídu air.Localizer, která poskytuje funkci pro pomoc při vytváření aplikací podporujících lokalizované verze.
Nahrávání kódu lokalizační struktury AIR HTML Chcete-li používat lokalizační strukturu, nakopírujte soubor AIRLocalizer.js do svého projektu. Pak ji zahrňte do hlavního souboru HTML aplikace, pomocí značky skriptu: <script src="AIRLocalizer.js" type="text/javascript" charset="utf-8">
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 332 Lokalizace aplikací AIR
Následující skript JavaScript může volat objekt air.Localizer.localizer: <script> var localizer = air.Localizer.localizer;
Objekt air.Localizer.localizer je jediný objekt, který definuje metody a vlastnosti pro použití a správu lokalizovaných zdrojů. Třída Localizer zahrnuje následující metody: Metoda
Popis
getFile()
Získává text specifikovaného zdrojového svazku pro specifikovanou lokální verzi. Viz „Získání zdrojů pro specifickou lokální verzi“ na stránce 337.
getLocaleChain()
Vrací jazyky v řetězci lokální verze. Viz „Definování řetězce locale“ na stránce 336.
getResourceBundle()
Vrací klíče svazků a odpovídající hodnoty jako objekt. Viz „Získání zdrojů pro specifickou lokální verzi“ na stránce 337.
getString()
Získává řetězec definovaný pro zdroj. Viz „Získání zdrojů pro specifickou lokální verzi“ na stránce 337.
setBundlesDirectory( )
Nastavuje umístění adresáře svazků. Viz „Uzpůsobení nastavení lokalizátoru AIR HTML“ na stránce 336.
setLocalAttributePre fix()
Nastavuje prefix použitý lokalizačními atributy použitými v prvcích HTML DOM. Viz „Uzpůsobení nastavení lokalizátoru AIR HTML“ na stránce 336
setLocaleChain()
Nastavuje pořadí jazyků v řetězci lokální verze. Viz „Definování řetězce locale“ na stránce 336.
sortLanguagesByPrefe rence()
Třídí lokální verze v řetězci lokální verze na základě pořadí lokálních verzí v nastavení operačního systému. Viz „Definování řetězce locale“ na stránce 336.
update()
Aktualizuje HTML DOM (nebo prvek DOM) s lokalizovanými řetězci ze stávajícího řetězce lokální verze. Diskuse o řetězcích lokální verze viz také „Správa řetězců lokální verze“ na stránce 333. Informace o metodě update() naleznete v kapitole „Aktualizace prvků DOM pro použití ve stávající lokální verzi“ na stránce 334.
Třída Localizer zahrnuje následující statické vlastnosti: Vlastnost
Popis
localizer
Vrací odkaz na jediný objekt Localizer pro aplikaci.
ultimateFallbackLocale
Lokální verze použitá, když aplikace nepodporuje žádné uživatelské předvolby. Viz „Definování řetězce locale“ na stránce 336.
Definování zdrojových svazků Lokalizační struktura HTML načte lokalizované verze řetězců ze souborů localization. Lokalizační soubor je sbírkou klíčových hodnot, sériově uspořádaných v textovém souboru. Lokalizační soubor je někdy popisován jako svazek. Vytvořte podadresáře v adresáři aplikačního projektu, pojmenovaný locale. (Můžete také použít jiný název, viz „Uzpůsobení nastavení lokalizátoru AIR HTML“ na stránce 336.) Tento adresář bude zahrnovat lokalizační soubory. Tento adresář se nazývá adresářem svazků. Pro každou lokální verzi podporovanou vaší aplikací vytvořte podadresář v adresáři svazků. Pojmenujte každý podadresář tak, aby odpovídal kódu lokální verze. Například pojmenujte adresář francouzštiny „fr“ a angličtiny „en“. Můžete použít znak podtržítka (_) pro definování lokální verze, která má jazyk a kód země. Například pojmenujte adresář americké angličtiny „en_us“. (Alternativně můžete použít pomlčku namísto podtržítka, „en-us“. Lokalizační struktura HTML podporuje obojí.)
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 333 Lokalizace aplikací AIR
Můžete přidat jakýkoliv počet zdrojových souborů do podadresáře lokální verze. Obecně vytvoříte lokalizační soubor pro každý jazyk (a umístíte jej do adresáře daného jazyka). Lokalizační struktura HTML zahrnuje metodu getFile(), která umožňuje načtení obsahu souboru (viz „Získání zdrojů pro specifickou lokální verzi“ na stránce 337. Soubory, které mají příponu souboru .properties, jsou definovány jako lokalizační soubory vlastností. Můžete je používat pro definování párů klíčové hodnoty pro lokální verzi. Soubor vlastnosti definuje jednu hodnotu řetězce pro každý řádek. Například následující definice popisuje hodnotu řetězce "Hello in English." pro klíč pojmenovaný greeting: greeting=Hello in English.
Soubor vlastnosti obsahující následující text definuje šest párů klíčových hodnot: title=Sample Application greeting=Hello in English. exitMessage=Thank you for using the application. color1=Red color2=Green color3=Blue
Tento příklad ukazuje anglickou verzi souboru vlastností, která je uložena v adresáři en. Francouzská verze tohoto souboru je umístěna v adresáři fr. title=Application Example greeting=Bonjour en français. exitMessage=Merci d'avoir utilisé cette application. color1=Rouge color2=Vert color3=Bleu
Můžete definovat několik zdrojových souborů pro různé typy informací. Například soubor legal.properties může obsahovat základní text právních informací (například o autorských právech). Můžete použít znovu tento zdroj v několika aplikacích. Podobně můžete definovat samostatné soubory, které definují lokalizovaný obsah pro různé části uživatelského rozhraní. Pokud chcete podporovat několik jazyků, použijte pro tyto soubory kódování UTF-8.
Správa řetězců lokální verze Když aplikace načte soubor AIRLocalizer.js, prověří lokální verze definované ve vaší aplikaci. Tyto lokální verze odpovídají podadresářům v adresáři svazků (viz také „Definování zdrojových svazků“ na stránce 332). Tento seznam dostupných lokálních verzí je znám jako řetězec locale. Soubor AIRLocalizer.js automaticky roztřídí řetězec locale, založený na upřednostňovaném pořadí definovaném nastavením operačního systému. (Vlastnost Capabilities.languages uvádí seznam jazyků uživatelského rozhraní operačního systému v upřednostňovaném pořadí.) Pokud tedy aplikace definuje zdroje pro lokální verze „ens“, „en_US“ a „en_UK“, struktura AIR HTML Localizer roztřídí řetězec locale odpovídajícím způsobem. Když se aplikace spustí v systému, který hlásí „en“ jako primární lokální verzi, řetězec locale je roztříděn jako ["en", "en_US", "en_UK"]. V tomto případě aplikace vyhledá zdroje nejprve ve svazku „en“, pak ve svazku „en_US“. Pokud však systém nahlásí primární lokální verzi „en-US“, pak třídění bude vypadat takto: ["en_US", "en", en_UK"]. V tomto případě aplikace vyhledá zdroje nejprve ve svazku „en_US“, pak ve svazku „en“. Standardně aplikace definuje první lokální verzi v řetězci locale, jako výchozí lokální verzi pro použití. Můžete uživatele požádat, aby zvolil lokální verzi při prvním spuštění aplikace. Poté můžete vybrat uložení volby do souboru předvoleb a použít tuto lokální verzi při následujícím spuštění aplikace.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 334 Lokalizace aplikací AIR
Aplikace může použít zdrojové řetězce v kterékoliv lokální verzi v řetězci locale. Pokud specifická lokální verze nedefinuje řetězec zdroje, aplikace použije následující shodný řetězec zdroje pro ostatní lokální verze definované v řetězci locale. Řetězec locale můžete přizpůsobit zavoláním metody setLocaleChain() objektu Localizer. Viz „Definování řetězce locale“ na stránce 336.
Aktualizace prvků DOM lokalizovaným obsahem Prvek v aplikaci může odkazovat na klíčovou hodnotu v souboru vlastností lokalizace. Například prvek title v následujícím příkladu specifikuje atribut local_innerHTML. Lokalizační struktura používá tento atribut k vyhledání lokalizované hodnoty. Standardně struktura vyhledá názvy atributů, které začínají "local_". Struktura aktualizuje atributy, které mají názvy odpovídající textu za "local_". V tomto případě struktura nastavuje atribut innerHTML prvku title. Atribut innerHTML používá hodnotu definovanou v klíči mainWindowTitle v souboru výchozích vlastností (default.properties):
Pokud stávající lokální verze nedefinuje žádnou shodnou hodnotu, pak lokalizační struktura vyhledá zbytek řetězce locale. Používá následující lokální verzi v řetězci locale, pro kterou je hodnota definována. V následujícím příkladu text (innerHTML attribute) prvku p používá hodnotu klíče greeting definovaného v souboru výchozích vlastností:
V následujícím příkladu hodnota atributu (a zobrazený text) prvku input využívá hodnotu klíče btnBlue definovanou v souboru výchozího nastavení:
Pro aktualizování HTML DOM s cílem použít řetězce definované ve stávajícím řetězci locale, zavolejte metodu update() objektu Localizer. Zavoláním metody update() dojde k tomu, že objekt Localizer analyzuje DOM a použije manipulační postupy tam, kde naleznete lokalizační atributy ("local_..."): air.Localizer.localizer.update();
Můžete definovat hodnoty pro atribut (například „innerHTML“) a odpovídající lokalizační atribut (například „local_innerHTML“). V tomto případě lokalizační struktura pouze přepíše hodnotu atributu, pokud naleznete odpovídající hodnotu v lokalizačním řetězci. Například následující prvek definuje atributy value a local_value:
Můžete také aktualizovat pouze specifický prvek DOM. Viz následující kapitola, „Aktualizace prvků DOM pro použití ve stávající lokální verzi“ na stránce 334. Standardně lokalizátor AIR HTML používá "local_" jako prefix pro atributy definující nastavení lokalizace prvku. Atribut local_innerHTML například standardně definuje název svazku a zdroje použitého pro hodnotu innerHTML prvku. Atribut local_value například standardně definuje název svazku a zdroje použitého pro hodnotu value prvku. Můžete nakonfigurovat Localizer tak, aby používal prefix atributu pro jiný, než "local_". Viz „Uzpůsobení nastavení lokalizátoru AIR HTML“ na stránce 336.
Aktualizace prvků DOM pro použití ve stávající lokální verzi Když objekt Localizer aktualizuje HTML DOM, způsobí, že označené prvky použijí hodnoty atributů na základě řetězců definovaných ve stávajícím řetězci locale. Chcete-li, aby lokalizátor HTML aktualizoval HTML DOM, zavolejte metodu update() objektu Localizer:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 335 Lokalizace aplikací AIR
air.Localizer.localizer.update();
Chcete-li, aby lokalizátor aktualizoval pouze specifikovaný prvek DOM, přidejte jej jako parametr metodě update(). Metoda update() má pouze jeden parametr, parentNode, který je volitelný. Při specifikování parametr parentNode stanoví lokalizování prvku DOM. Zavolání metody update() a stanovení parametru parentNode nastaví lokalizované hodnoty pro všechny podřízené prvky, které specifikují lokalizační atributy. Například můžete zvážit následující prvek div:
Pro aktualizování tohoto prvku použijte lokalizované řetězce definované ve stávajícím řetězci locale použijte následující kód JavaScript: var divElement = window.document.getElementById("colorsDiv"); air.Localizer.localizer.update(divElement);
Pokud hodnota není v řetězci locale nalezena, lokalizační struktura nastaví hodnotu atribut na hodnotu atributu "local_". Například v předchozím příkladu předpokládáme, že lokalizační struktura nemůže nalézt hodnotu klíče lblColors (ve kterémkoliv souboru default.properties v řetězci locale). V tomto případě je použito "default.lblColors" jako hodnota innerHTML. Použití této hodnoty signalizuje (vývojáři) chybějící zdroje. Metoda update() odesílá událost resourceNotFound, pokud nemůže nalézt zdroj v řetězci locale. Konstanta air.Localizer.RESOURCE_NOT_FOUND definuje řetězec "resourceNotFound". Událost má tři vlastnosti: bundleName, resourceName a locale. Vlastnost bundleName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost resourceName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost locale je názvem lokální verze, ve které není zdroj nalezen.
Metoda update() odesílá událost bundleNotFound, když nemůže nalézt specifikovaný svazek. Konstanta air.Localizer.BUNDLE_NOT_FOUND definuje řetězec "bundleNotFound". Událost má dvě vlastnosti: bundleName a locale. Vlastnost bundleName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost locale je názvem lokální verze, ve které není zdroj nalezen. Metoda update() pracuje asynchronně (a odesílá události resourceNotFound a bundleNotFound asynchronně). Následující kód stanoví posluchače událostí pro události resourceNotFound a bundleNotFound: air.Localizer.localizer.addEventListener(air.Localizer.RESOURCE_NOT_FOUND, rnfHandler); air.Localizer.localizer.addEventListener(air.Localizer.BUNDLE_NOT_FOUND, rnfHandler); air.Localizer.localizer.update(); function rnfHandler(event) { alert(event.bundleName + ": " + event.resourceName + ":." + event.locale); } function bnfHandler(event) { alert(event.bundleName + ":." + event.locale); }
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 336 Lokalizace aplikací AIR
Uzpůsobení nastavení lokalizátoru AIR HTML Metoda setBundlesDirectory() objektu Localizer umožňuje uzpůsobit cestu adresáře svazku. Metoda setLocalAttributePrefix() objektu Localizer umožňuje přizpůsobit cestu adresáře svazku a hodnotu atributu používanou objektem Localizer. Výchozí adresář svazku je definován jako podadresář lokální verze adresáře aplikace. Můžete stanovit jiný adresář a to zavoláním metody setBundlesDirectory() objektu Localizer. Tato metoda používá jeden parametr, path, který je cestou do požadovaného adresáře, jako řetězec. Hodnota parametru path může být kterákoliv z následujících:
• Řetězec definující cestu relativní k adresáři aplikace, například "locales" • Řetězec definující platnou adresu URL, která použije schémata URL app, app-storage nebo file, například "app://languages" (nepoužívejte schéma URL http)
• Objekt File Informace o adresách URL a cestách adresářů naleznete v kapitole „Cesty objektu File“ na stránce 105. Například následující kód nastavuje adresář svazků na podadresář jazyka v adresáři ukládání dat aplikace (nikoliv v adresáři samotné aplikace): air.Localizer.localizer.setBundlesDirectory("languages");
Předejte platnou cestu jako parametr path. Jinak metoda odešle výjimku BundlePathNotFoundError. Tato chyba má parametr "BundlePathNotFoundError" jako svou vlastnosti name, a vlastnost message specifikuje neplatnou cestu. Standardně lokalizátor AIR HTML používá "local_" jako prefix pro atributy definující nastavení lokalizace prvku. Například atribut local_innerHTML definuje název svazku a zdroje použitý pro hodnotu innerHTML následujícího prvku input:
Metoda setLocalAttributePrefix() objektu Localizer umožňuje použít prefix atributu jiný, než "local_". Tato statická metoda bere jeden parametr, což je řetězec, který chcete použít jako prefix atributu. Například následující kód nastavuje lokalizační strukturu tak, že použije jako prefix atributu „loc_“: air.Localizer.localizer.setLocalAttributePrefix("loc_");
Můžete přizpůsobit prefix atributu, který používá lokalizační struktura. Prefix můžete uzpůsobit, pokud výchozí hodnota ("local_") bude v konfliktu s názvem jiného atributu použitého kódem. Při volání této metody nezapomeňte použít platné znaky pro atributy HTML. (Například hodnota nemůže obsahovat prázdný znak.) Informace o použití lokalizačních atributů v prvcích HTML, viz „Aktualizace prvků DOM lokalizovaným obsahem“ na stránce 334. Nastavení adresáře svazků a prefixu atributu se mezi jednotlivými relacemi aplikace neuchovává. Pokud použijete vlastní nastavení adresáře svazků a prefixu atributu, nezapomeňte nastavení provést pokaždé, když se aplikace aktivuje.
Definování řetězce locale Standardně, když načtete kód AIRLocalizer.js, nastaví se řetězec locale. Lokální verze dostupné v adresáři svazků a nastavení jazyka operačního systému definují tento řetězec locale. (Podrobnosti viz „Správa řetězců lokální verze“ na stránce 333.)
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 337 Lokalizace aplikací AIR
Řetězec locale můžete změnit zavoláním statické metody setLocaleChain() objektu Localizer. Například může být požadováno zavolání této metody v případě, že uživatel indikuje předvolbu pro specifický jazyk. Metoda setLocaleChain() bere jeden parametr, chain, který je polem lokálních verzí, například ["fr_FR","fr","fr_CA"]. Pořadí lokálních verzí v poli nastavuje pořadí, ve kterém struktura vyhledává zdroje (v následujících operacích). Pokud zdroj není nalezen pro první lokální verzi v řetězci, pokračuje v hledání v jiném zdroji lokální verze. Pokud chybí argument chain, není polem nebo se jedná o prázdný řetězec, funkce selže a odešle výjimku IllegalArgumentsError. Statická metoda getLocaleChain() objektu Localizer vrací objekt Array s uvedením seznamu lokálních verzí ve stávajícím řetězci locale. Následující kód načte stávající řetězec locale a přidá dvě lokální verze French do hlavičky řetězce: var currentChain = air.Localizer.localizer.getLocaleChain(); newLocales = ["fr_FR", "fr"]; air.Localizer.localizer.setLocaleChain(newLocales.concat(currentChain));
Metoda setLocaleChain() odesílá událost "change", když aktualizuje řetězec locale. Konstanta air.Localizer.LOCALE_CHANGE definuje řetězec "change". Událost má jednu vlastnost, localeChain, pole kódů lokálních verzí v novém řetězci locale. Následující kód stanoví posluchače událostí pro tuto událost. var currentChain = air.Localizer.localizer.getLocaleChain(); newLocales = ["fr_FR", "fr"]; localizer.addEventListener(air.Localizer.LOCALE_CHANGE, changeHandler); air.Localizer.localizer.setLocaleChain(newLocales.concat(currentChain)); function changeHandler(event) { alert(event.localeChain); }
Statická vlastnost air.Localizer.ultimateFallbackLocale představuje lokální verzi použitou, když aplikace nepodporuje žádné uživatelské předvolby. Výchozí hodnota je "en". Můžete nastavit jinou lokální verzi, jak je uvedeno v následujícím kódu: air.Localizer.ultimateFallbackLocale = "fr";
Získání zdrojů pro specifickou lokální verzi Metoda getString() objektu Localizer vrací řetězec definovaný pro zdroj ve specifické lokální verzi. Když voláte metodu, není nutné specifikovat hodnotu locale. V tomto případě metoda hledá v celém řetězci lokální verze a vrací řetězec do první lokální verze, která poskytuje stanovený název zdroje. Metoda má následující parametry: Parametr
Popis
bundleName
Svazek, který obsahuje zdroj. Toto je název souboru vlastností bez přípony .properties. (Například, pokud je tento parametr nastaven jako "alerts", kód Localizer hledá v lokalizačních souborech pojmenovaných alerts.properties.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 338 Lokalizace aplikací AIR
Parametr
Popis
resourceName
Název zdroje.
templateArgs
Volitelné. Pole řetězců, které nahrazují očíslované značky v náhradních řetězcích. Například zvažte zavolání funkce, kde má parametr templateArgs hodnotu ["Raúl", "4"] a odpovídající zdrojový řetězec je "Hello, {0}. You have {1} new messages.". V tomto případě funkce vrací hodnotu "Hello, Raúl. You have 4 new messages.". Toto nastavení ignorujete předáním hodnoty null.
locale
Volitelné. Kód lokální verze (například "en", "en_us" nebo "fr"), který se má použít. Pokud je lokální verze k dispozici a není nalezena žádná odpovídající hodnota, metoda nepokračujte v hledání hodnot v jiných lokální verzích v řetězci locale. Pokud není specifikována žádná lokální verze, funkce navrací řetězec v první lokální verzi, která poskytuje hodnotu pro daný název řetězce.
Lokalizační struktura může aktualizovat označené atributy HTML DOM. Můžete však používat lokalizované řetězce jinými způsoby. Například můžete použít řetězec v jiných dynamicky generovaných kódech HTML nebo jako hodnotu parametrů ve volání funkce. Například následující kód volá funkci alert() s řetězcem definovaným ve zdroji error114 ve výchozím souborů vlastností lokální verze fr_FR: alert(air.Localizer.localizer.getString("default", "error114", null, "fr_FR"));
Metoda getString() odesílá událost resourceNotFound, když nemůže nalézt zdroj ve specifikovaném svazku. Konstanta air.Localizer.RESOURCE_NOT_FOUND definuje řetězec "resourceNotFound". Událost má tři vlastnosti: bundleName, resourceName a locale. Vlastnost bundleName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost resourceName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost locale je názvem lokální verze, ve které není zdroj nalezen. Metoda getString() odesílá událost bundleNotFound, když nemůže nalézt specifikovaný svazek. Konstanta air.Localizer.BUNDLE_NOT_FOUND definuje řetězec "bundleNotFound". Událost má dvě vlastnosti: bundleName a locale. Vlastnost bundleName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost locale je názvem lokální verze, ve které není zdroj nalezen. Metoda getString() pracuje asynchronně (a odesílá události resourceNotFound a resourceNotFound asynchronně). Následující kód stanoví posluchače událostí pro události resourceNotFound a bundleNotFound: air.Localizerlocalizer.addEventListener(air.Localizer.RESOURCE_NOT_FOUND, rnfHandler); air.Localizerlocalizer.addEventListener(air.Localizer.BUNDLE_NOT_FOUND, bnfHandler); var str = air.Localizer.localizer.getString("default", "error114", null, "fr_FR"); function rnfHandler(event) { alert(event.bundleName + ": " + event.resourceName + ":." + event.locale); } function bnfHandler(event) { alert(event.bundleName + ":." + event.locale); }
Metoda getResourceBundle() objektu Localizer vrací určený svazek pro danou lokální verzi. Vrácená hodnota metody je objekt s vlastnostmi, které odpovídají klíčům ve svazku. (Pokud aplikace nemůže určený svazek najít, vrací metoda hodnotu null.) Tato metoda nabývá dvou parametrů – locale a bundleName.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 339 Lokalizace aplikací AIR
Parametr
Popis
locale
Lokální verze (například "fr").
bundleName
Název svazku.
Následující kód například volá metodu document.write() k načtení výchozího svazku pro lokální francouzskou (fr) verzi. Pak volá metodu document.write() k zápisu hodnot klíčů str1 a str2 do tohoto svazku: var aboutWin = window.open(); var bundle = localizer.getResourceBundle("fr", "default"); aboutWin.document.write(bundle.str1); aboutWin.document.write(" "); aboutWin.document.write(bundle.str2); aboutWin.document.write(" ");
Metoda getResourceBundle() odesílá událost bundleNotFound, když nemůže nalézt specifikovaný svazek. Konstanta air.Localizer.BUNDLE_NOT_FOUND definuje řetězec "bundleNotFound". Událost má dvě vlastnosti: bundleName a locale. Vlastnost bundleName je názvem svazku, ve kterém není zdroj nalezen. Vlastnost locale je názvem lokální verze, ve které není zdroj nalezen. Metoda getFile() objektu Localizer navrací obsah jako svazek, řetězec, pro danou lokální verzi. Soubor svazku je načten jako soubor UTF-8. Metoda obsahuje následující parametry: Parametr
Popis
resourceFileName
Název zdrojového souboru (například "about.html").
templateArgs
Volitelné. Pole řetězců, které nahrazují očíslované značky v náhradních řetězcích. Například zvažte zavolání funkce, kde má parametr templateArgs hodnotu ["Raúl", "4"] a odpovídající zdrojový soubor obsahuje dvě řádky: Hello, {0}. You have {1} new messages.
V tomto případě funkce vrací řetězec se dvěma řádky: Hello, Raúl. You have 4 new messages. locale
Kód lokální verze, například "en_GB", který se má použít. Pokud je lokální verze k dispozici a není nalezen žádný odpovídající soubor, metoda nepokračujte v hledání v jiných lokálních verzích v řetězci locale. Pokud není specifikován žádný kód lokální verze, funkce vrací text v první lokální verzi v řetězci locale, který má soubor odpovídající resourceFileName.
Například následující kód volá metodu document.write() pomocí obsahu souboru about.html lokální verze fr: var aboutWin = window.open(); var aboutHtml = localizer.getFile("about.html", null, "fr"); aboutWin.document.close(); aboutWin.document.write(aboutHtml);
Metoda getFile() odesílá událost fileNotFound, pokud nemůže nalézt zdroj v řetězci locale. Konstanta air.Localizer.FILE_NOT_FOUND definuje řetězec "resourceNotFound". Metoda getFile() pracuje asynchronně (a odesílá událost fileNotFound asynchronně). Událost má dvě vlastnosti: fileName a locale. Vlastnost fileName je názvem nenalezeného souboru. Vlastnost locale je názvem lokální verze, ve které není zdroj nalezen. Následující kód stanoví posluchače událostí pro tuto událost.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 340 Lokalizace aplikací AIR
Lokalizace data, času a měny Způsob, kterým aplikace prezentuje datum, čas a měny se pro každou lokální verzi velmi liší. Například standardní USA pro vyjádření data je měsíc/den/rok, zatímco evropský standard pro vyjádření je den/měsíc/rok. Můžete zapsat kód pro formátování data, času a měny. Například následující kód převádí objekt Date do formátu měsíc/den/rok nebo den/měsíc/úrok. Pokud proměnná locale (představující lokální verzi) bude nastavena na hodnotu "en_US", funkce navrátí formát měsíc/den/rok. Příklad převádí objekt Date do formátu den/měsíc/rok pro všechny ostatní lokální verze. function convertDate(date) { if (locale == "en_US") { return (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear(); } else { return date.getDate() + "/" + (date.getMonth() + 1) + "/" + date.getFullYear(); } }
341
Kapitola 35: Vytváření aplikace AIR pomocí nástrojů příkazového řádku Nástroje příkazového řádku Adobe® AIR™ vám umožňují testovat a balit aplikace Adobe AIR. Tyto nástroje můžete také použít v procesu automatického vývoje. Nástroje příkazového řádku AIR jsou obsaženy v sadě SDK AIR AIR SDK (http://www.adobe.com/go/learn_air_download_AIRSDK_cz).
Použití programu AIR Debug Launcher (ADL) Nástroj AIR Debug Launcher (ADL) použijte během vyvíjení pro spuštění aplikací vycházejících z SWF i HTML. Pomocí ADL můžete spustit aplikaci bez předchozího zabalení a instalace. ADL implicitně používá runtime obsažený v sadě SDK, což znamená, že pro použití ADL nemusíte runtime instalovat samostatně. ADL vytiskne příkazy trace a chyby v době běhu do standardního výstupu, ale nepodporuje body rozdělení nebo jiné funkce ladění. Jestliže vyvíjíte aplikaci vycházející z formátu SWF, použijte na složité úkoly ladění nástroj Flash Debugger (nebo Flash CS). K nástroji Flash Debugger se lze připojit tím, že ladicí program spustíte před spuštění aplikace pomocí nástroje ADL.
Spuštění aplikace pomocí ADL Použijte následující syntaxi: adl [-runtime runtime-directory] [-pubid publisher-id] [-nodebug] application.xml [rootdirectory] [-- arguments]
-runtime runtime-directory Určuje adresář obsahující runtime, které má být použito. Jestliže není určeno, použije se adresář runtime ve stejné sadě SDK jako v případě programu ADL. Jestliže ADL přesunete mimo složku sady SDK, musíte poté určit adresář runtime. V systémech Windows a Linux určete adresář obsahující adresář prostředí Adobe AIR . V OS X Mac určete adresář obsahující Adobe AIR.framework. -pubid publisher-id Přiřadí určenou hodnotu jako ID vydavatele aplikace AIR pro toto spuštění. Určení přechodného ID vydavatele pro testování funkcí aplikace AIR, například komunikaci přes lokální připojení, které používá ID vydavatele. To vám umožní jedinečně identifikovat aplikaci. Finální ID vydavatele je určeno digitálním certifikátem použitým pro podepsání instalačního souboru AIR. -nodebug Vypne podporu ladění. Je-li použit, proces aplikace se nemůže připojit k nástroji ladění Flash a dialogy pro zpracovávání výjimek jsou potlačeny. (Příkazy trace se nicméně stále tisknou do okna konzoly.) Vypnete-li ladění, poběží vaše aplikace o trochu rychleji a také podrobněji emuluje režim spuštění nainstalované aplikace. application.xml Soubor deskriptoru aplikace. Viz téma „Nastavení vlastností aplikace AIR“ na stránce 43. root-directory Určuje kořenový adresář aplikace, které má být spuštěna. Není-li určeno, použije se adresář obsahující soubor deskriptoru aplikace. -- arguments Jakékoliv řetězce znaků, které se zobrazí za „--“ jsou předány aplikaci jako argumenty příkazového řádku. Poznámka: Když spustíte aplikaci AIR, která již běží, nespustí se nová instance dané aplikace. Namísto toho se k běžící instanci odešle událost invoke.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 342 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Tisk příkazů trace Pro tisk příkazů trace do konzoly použité ke spuštění ADL přidejte příkazy trace k vašemu kódu pomocí funkce trace(): trace("debug message"); air.trace("debug message");
Příklady ADL Spuštění aplikace v aktuálním adresáři: adl myApp-app.xml
Spuštění aplikace v podadresáři aktuálního adresáře: adl source/myApp-app.xml release
Spusťte aplikaci a předejte dva argumenty příkazového řádku, „tick“ a „tock“: adl myApp-app.xml -- tick tock
Spuštění aplikace pomocí specifického runtime: adl -runtime /AIRSDK/runtime myApp-app.xml
Spuštění aplikace bez podpory ladění: adl myApp-app.xml -nodebug
Připojení k programu Flash Debugger (FDB) Chcete-li pomocí programu Flash Debugger ladit aplikaci AIR vycházející z formátu SWF, spusťte relaci programu FDB a poté spusťte ladicí verzi aplikace. K poslouchající relaci programu FDB se automaticky připojí aplikace AIR obsahující ladicí verzi souboru SWF. Poznámka: Ladicí verze aplikace AIR je taková verze, ve které je hlavní soubor SWF zkompilován s příznakem -debug. 1 Spusťte program FDB. Program FDB naleznete v adresáři bin sady Flex SDK.
Konzola zobrazí výzvu programu FDB: 2 Spusťte příkaz run: run [Enter] 3 V odlišném příkazu nebo konzole skořepiny spusťte verzi ladění své aplikace: adl myApp.xml
4 Pomocí příkazů programu FDB nastavte dle potřeby body rozdělení. 5 Zadejte: continue [Enter]
Pokud aplikace AIR vychází z formátu SWF, ovládá ladicí program pouze spuštění kódu jazyka ActionScript. Pokud aplikace AIR vychází z jazyka HTML, pak ovládá ladicí program pouze spuštění kódu jazyka JavaScript. Chcete-li nástroj ARL spustit a přitom se nepřipojovat k ladicímu programu, zařaďte do příkazu volbu -nodebug: adl myApp.xml -nodebug
Potřebujete-li základní informace o příkazech programu FDB, spusťte příkaz help: help [Enter]
Podrobnosti o příkazech programu FDB naleznete v dokumentaci aplikace Flex v tématu Using the command-line debugger commands (Používání ladicích příkazů příkazového řádku).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 343 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Kódy ukončení a chyb nástroje ADL Následující tabulka popisuje kódy ukončení vytištěné ADL: Kódy ukončení
Popis
0
Úspěšné spuštění. ADL se ukončí po ukončení aplikace AIR.
1
Úspěšná iniciace již běžící aplikace AIR. ADL se okamžitě ukončí.
2
Chyba použití. Argumenty dodané ADL nejsou správné.
3
Runtime se nepodařilo nalézt.
4
Runtime se nepodařilo spustit. K tomu často dojde z důvodu, že verze úrovně záplaty určené v aplikaci neodpovídá verzi nebo úrovni záplaty runtime.
5
Došlo k neznámé chybě.
6
Soubor deskriptoru aplikace se nepodařilo nalézt.
7
Obsah deskriptoru aplikace není platný. Tato chyba obvykle určuje, že XML není dobře vytvořen.
8
Hlavní obsahový soubor aplikace (určený v elementu souboru deskriptoru aplikace) se nepodařilo nalézt.
9
Hlavní obsahový soubor aplikace není platným SWF nebo HTML souborem.
Zabalení instalačního souboru AIR pomocí programu AIR Developer Tool (ADT) Instalační soubor AIR pro aplikace AIR vycházející z SWF i HTML můžete vytvořit pomocí nástroje AIR Developer Tool (ADT). (Jestliže k vytvoření své aplikace používáte Adobe Flash CS3, můžete pro vývoj balíku AIR také použít příkaz Vytvořit soubor AIR v nabídce Příkazy. Více informací naleznete v tématu „Aktualizace Adobe AIR pro program Flash CS3 Professional“ na stránce 13. Informace o vytváření aplikací AIR pomocí programu Flash CS4 naleznete v dokumentu Používání programu Flash v části Publikování v prostředí Adobe AIR.) ADT je programem jazyka Java, který můžete spustit z příkazového řádku nebo z nástroje pro vyvíjení, například Ant. Sady SDK AIR a Flex obsahují skripty příkazového řádku, které pro vás spustí program Java.
Zabalení instalačního souboru AIR Každá aplikace AIR musí mít minimálně soubor deskriptoru aplikace a hlavní soubor SWF nebo HTML. Jakékoliv datové zdroje jiných nainstalovaných aplikací musí být také zabaleny do souboru AIR. Všechny soubory instalátoru AIR musí být podepsány pomocí digitálního certifikátu. Instalátor AIR používá podpis k ověření, zda váš soubor aplikace nebyl od podepsání pozměněn. Můžete použít certifikát podpisu kódu z certifikační autority nebo certifikát s vlastním podpisem. Certifikát vydaný důvěryhodnou autoritou poskytuje uživateli vaší aplikace určité záruky vaší totožnosti jako vydavatele. Certifikát s vlastním podpisem nelze použít k ověření vaší autority jako autora podpisu. Tato nevýhoda také zeslabuje záruku, že balík nebyl pozměněn, protože legitimní instalační soubor mohl být před dodáním uživateli nahrazen falzifikátem. Soubor AIR můžete zabalit a podepsat v jediném kroku pomocí příkazu ADT -package. Pomocí příkazu preparemůžete také vytvořit dočasný nepodepsaný balík a tento přechodný balík můžete podepsat pomocí příkazu sign v samostatném kroku.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 344 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Při podepisování balíku instalace připojit ADT automaticky autoritu časové známky pro ověření času. Informace časové známky je obsažena v souboru AIR. Soubor AIR, který obsahuje ověřenou časovou známku, lze nainstalovat kdykoliv v budoucnosti. Jestliže se ADT nemůže připojit k serveru časové známky, je zabalení zrušeno. Volbu časové známky můžete potlačit, ale bez časové známky nelze aplikaci AIR po vypršení certifikátu použitého k podepsání instalačního souboru nainstalovat. Jestliže vytváříte balík k aktualizaci stávající aplikace AIR, musí být podepsán se stejným certifikátem jako je původní aplikace nebo s certifikátem, který má stejnou totožnost. Pro získání stejné totožnosti musí mít dva certifikáty stejný rozlišovací název (všechna pole s informacemi se shodují) a stejný řetězec certifikátu a kořenový certifikát. Proto můžete použít uznávaný certifikát od certifikační autority, pokud nezměníte žádnou z určujících informací. Jako v případě AIR 1.1 můžete migrovat aplikaci pro použití nového certifikátu pomocí příkazu -migrate. Přesunutí certifikátu vyžaduje podepsání souboru AIR pomocí nového i starého certifikátu. Přesun certifikátu vám umožňuje provést změnu z certifikátu s vlastním podpisem na komerční certifikát podpisu kódu nebo z jednoho certifikátu s vlastním podpisem či komerčního certifikátu na jiný. Při přesunu certifikátu nemusí vaši stávající uživatelé odinstalovat svou stávající aplikaci před instalováním nové verze. Podpisy přesunutí jsou implicitně opatřeny časovou známkou. Poznámka: Nastavení v souboru deskriptoru aplikace určuje identitu aplikace AIR a její výchozí cestu instalace. Viz „Struktura souboru deskriptoru aplikace“ na stránce 43. Balík a podpis souboru AIR v jednom kroku ❖ Použijte příkaz -package s následující syntaxí (na jediném příkazovém řádku): adt -package SIGNING_OPTIONS air_file app_xml [file_or_dir | -C dir file_or_dir | -e file dir ...] ...
SIGNING_OPTIONS Možnosti podpisu určují úložiště klíčů obsahující osobní klíč a certifikát použitý k podepsání souboru AIR. Pro podepsání aplikace AIR pomocí certifikátu s vlastním podpisem vygenerovaného programem ADT můžete použít následující možnosti: -storetype pkcs12 -keystore certificate.p12
V tomto příkladu je certificate.p12 názvem souboru úložiště klíčů. (program ADT vás požádá o heslo, protože není zadáno na příkazovém řádku.) Možnosti podpisu jsou kompletně popsány v tématu „Možnosti podpisu příkazového řádku programu ADT“ na stránce 349. air_file Název souboru AIR, který je vytvořen. app_xml Cesta k souboru deskriptoru aplikace. Cestu lze určit relativně k aktuálnímu adresáři nebo jako absolutní cestu. (Soubor deskriptoru aplikace je v souboru AIR přejmenován na „application.xml“.) file_or_dir Soubory a slovníky, které budou zabaleny v souboru AIR. Lze určit jakýkoliv počet souborů a slovníků, oddělených prázdným prostorem. Jestliže uvedete adresář, budou všechny soubory a podadresáře, s výjimkou skrytých souborů, přidány do balíku. (Pokud je určen soubor deskriptoru aplikace, přímo nebo pomocí zástupného znaku či doplnění aplikace, je ignorován a není podruhé přidán do balíku.) Určené soubory a slovníky musí být umístěny v aktuálním adresáři nebo jednom z jeho podadresářích. Pomocí volby -C změňte aktuální adresář.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 345 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Důležité: Zástupné znaky nelze použít v argumentech file_or_dir po volbě –C. (Skořepiny příkazu rozšiřují zástupné znaky před předání argumentů do programu ADT a tento program vyhledá soubory ve špatném umístění.) Pro nahrazení stávajícího adresáře můžete nicméně použít znak tečky „.“. Například "-C assets ." zkopíruje vše v adresáři datového zdroje, včetně všech dílčích adresářů, až ke kořenové úrovni balíku aplikace. -C dir Změní pracovní adresář na hodnotu dir před zpracováním dalších souborů a adresářů přidaných do balíku
aplikace. Soubory nebo adresáře jsou přidány ke kořenům balíku aplikace. Volbu –C lze použít tolikrát, kolikrát si přejete, pro zahrnutí souborů s více bodů do systému souborů. Je-li pro dirurčena relativní cesta, je cesta vždy získána z původního pracovního adresáře. Když program ADT zpracovává soubory a adresáře obsažené v balení, uloží se relativní cesta mezi aktuálním adresářem a cílovými soubory. Tyto cesty jsou při instalaci balíku rozšířeny do struktury adresáře aplikace. Proto určením -C release/bin lib/feature.swf umístíte soubor release/bin/lib/feature.swf do podadresáře lib kořenové složky aplikace. -e file dir Umístí určený soubor do určeného adresáře balíku.
Poznámka: Element souboru deskriptoru aplikace musí určit finální umístění hlavního souboru aplikace ve stromové struktuře adresáře balíku aplikace. Příklady programu ADT Soubory aplikace specifické pro balík v aktuálním adresáři: adt –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.swf components.swc
Všechny soubory a podadresáře balíku v aktuálním pracovním adresáři: adt –package -storetype pkcs12 -keystore ../cert.p12 myApp.air myApp.xml .
Poznámka: Soubor úložiště klíčů obsahuje osobní klíč použití k podepsání vaší aplikace. Certifikát podpisu nikdy nevkládejte do balíku AIR! Jestliže v příkazu programu ADT použijete zástupné znaky, uložte soubor úložiště klíčů do odlišného umístění, aby nebyl zahrnut do balíku. V tomto příkladu je soubor úložiště klíčů, cert.p12, umístěn do nadřazeného adresáře. Zabalení pouze hlavních souborů a obrazů podadresáře: adt –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.swf images
Zabalení souboru application.xml a hlavního souboru SWF umístěného v pracovním adresáři(release/bin): adt –package -storetype pkcs12 -keystore cert.p12 myApp.air release/bin/myApp.xml –C release/bin myApp.swf
Zabalení datových zdrojů z více než jednoho místa v systému vývoje souborů. V tomto příkladu jsou datové zdroje aplikace před zabalením umístěny v následujících složkách:
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 346 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Má za následek následující strukturu balíku: /myAppRoot /META-INF /AIR application.xml hash myApp.swf mimetype /images image-1.png ... image-n.png /libs lib-1.swf ... lib-n.swf AIRAliases.js
Spuštění ADT jako programu jazyka Java (bez nastavení cesty třídy): java –jar {AIRSDK}/lib/ADT.jar –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.swf
Spuštění ADT jako programu jazyka Java (cesta třídy Java je nastavena tak, aby obsahovala balík ADT.jar): java com.adobe.air.ADT –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.swf
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 347 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Chybová hlášení programu ADT Následující tabulka obsahuje seznam možných chyb, které může nahlásit program ADT, a jejich pravděpodobné příčiny: Chyby ověření deskriptoru aplikace Kód chyby
Popis
Poznámky
100
Deskriptor aplikace nelze analyzovat.
Zkontrolujte, zda se v souboru deskriptoru aplikace nevyskytují chyby syntaxe jazyka XML, jako jsou například neuzavřené tagy.
101
Chybí jmenný prostor.
Přidejte chybějící jmenný prostor.
102
Neplatný jmenný prostor
Zkontrolujte pravopis jmenného prostoru.
103
Neočekávaný element nebo atribut
Odstraňte nevhodné elementy a atributy. V souboru deskriptoru nejsou povoleny vlastní hodnoty. Zkontrolujte pravopis názvů elementů a atributů. Ujistěte se, že jsou elementy umístěny ve správném nadřazeném elementu a že jsou atributy použity se správnými elementy.
104
Chybějící element nebo atribut
Přidejte požadovaný element nebo atribut.
105
Element nebo atribut obsahuje neplatnou hodnotu.
Opravte nevhodnou hodnotu.
106
Nesprávná kombinace atributu okna
Některá nastavení oken nelze používat společně (například nastavení transparency = true a systemChrome = standard. Změňte jedno z nekompatibilních nastavení.
107
Minimální velikost okna je větší než maximální velikost okna.
Změňte buď nastavení minimální velikosti, nebo nastavení maximální velikosti.
Informace o jmenných prostorech, elementech, atributech a jejich platných hodnotách naleznete v části „Nastavení vlastností aplikace AIR“ na stránce 43. Chyby ikony aplikace
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 348 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Kód chyby
Popis
Poznámky
200
Nelze otevřít soubor ikony.
Zkontrolujte, že soubor v určené cestě existuje. Ujistěte se pomocí jiné aplikace, že soubor lze otevřít.
201
Ikona má nesprávnou velikost.
Velikost ikony (v obrazových bodech) musí odpovídat tagu XML. Je-li například daný element deskriptoru aplikace: icon.png
Musí mít obraz v souboru icon.png rozměry 32 x 32 obrazových bodů. 202
Soubor ikony obsahuje nepodporovaný formát souboru.
Podporován je pouze formát PNG. Před zabalením aplikace převeďte obrazy v jiných formátech.
Chyby souboru aplikace Kód chyby
Popis
Poznámky
300
Soubor chybí nebo nelze otevřít.
Soubor určený na příkazovém řádku nelze najít nebo otevřít.
301
Soubor deskriptoru aplikace chybí nebo nelze otevřít.
Soubor deskriptoru aplikace nelze v určené cestě najít nebo ho nelze otevřít.
302
V balíčku chybí soubor kořenového obsahu.
Do balíčku je třeba přidat soubor SWF nebo HTML odkazovaný v elementu deskriptoru aplikace – zahrňte tento soubor do souborů, které jsou uvedeny na příkazovém řádku programu ADT.
303
V balíčku chybí soubor ikony.
Do balíčku je třeba přidat soubory ikony určené v deskriptoru aplikace – zahrňte tyto soubory do souborů uvedených na příkazovém řádku programu ADT. Soubory ikon nejsou přidávány automaticky.
304
Počáteční obsah okna je neplatný.
Soubor odkazovaný v elementu deskriptoru aplikace není
rozpoznán jako platný soubor HTML nebo SWF. 305
Počáteční verze SWF obsahu okna je vyšší než verze jmenného prostoru
Kódy ukončení pro jiné chyby
Verze formátu SWF souboru odkazovaného v elementu deskriptoru aplikace není podporována verzí aplikace AIR, která je určena ve jmenném prostoru deskriptoru. Tuto chybu například vygenerujete, pokud se pro počáteční obsah aplikace AIR 1.1 pokusíte zabalit soubor ve formátu SWF10 (Flash Player 10).
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 349 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Kódy ukončení
Popis
Poznámky
2
Chyba použití
Zkontrolujte, zda se na příkazovém řádku nevyskytují chyby.
5
Neznámá chyba
Tato chyba označuje situaci, kterou nelze vysvětlit pomocí běžných podmínek chyb. Mezi hlavní příčiny patří nekompatibilita mezi programem ADT a prostředím runtime jazyka Java, poškozené instalace programu ADT nebo prostředí JRE a programovací chyby uvnitř programu ADT.
6
Nelze provést zápis do výchozího adresáře. Ujistěte se, že je určený (nebo předpokládaný) výstupní adresář přístupný a že na jednotce, která tento adresář obsahuje, je dostatek volného místa.
7
Nelze získat přístup k certifikátu
Ujistěte se, že je cesta ke stisknutí klávesy určena správně. Zkontrolujte, zda lze k certifikátu přistupovat v rámci stisknutí klávesy. K řešení potíží s přístupem k certifikátu slouží nástroj Java 1.6 Keytool.
8
Neplatný certifikát
Soubor certifikátu je utvořený nesprávně, upravený, má vypršenou platnost nebo byl odvolán.
9
Soubor AIR nelze podepsat.
Ověřte možnosti podpisu předané programu ADT.
10
Nelze vytvořit časové razítko.
Program ADT nedokáže ustavit připojení k serveru časového razítka. Pokud jste k internetu připojeni prostřednictvím serveru proxy, bude patrně potřeba nakonfigurovat nastavení proxy prostředí JRE.
11
Chyba vytvoření certifikátu
Ověřte argumenty příkazového řádku použité k vytvoření podpisů.
12
Neplatné zadání
Ověřte cesty souborů a další argumenty předané programu ADT na příkazovém řádku.
Možnosti podpisu příkazového řádku programu ADT Program ADT používá funkci Java Cryptography Architecture (JCA) k získání přístupu k osobním klíčům a certifikátům pro podpis aplikací AIR. Možnosti podpisu určují úložiště klíčů a osobní klíče a certifikáty v daném úložišti klíčů. Úložiště klíčů musí obsahovat osobní klíč i asociovaný řetězec certifikátu. Řetězec certifikátu se používá k zavedení ID vydavatele pro danou aplikaci. Jestliže certifikát podpisu provede propojení k důvěryhodnému certifikátu v počítači, běžný název certifikátu se zobrazí jako název vydavatele v dialogovém okně instalace AIR. Program ADT vyžaduje, aby certifikát odpovídal normě x509v3 (RFC3280) a obsahoval příponu rozšířeného použití klíče (Extended Key Usage) s řádnou hodnotou pro podepsání kódu. Omezení v rámci certifikátu jsou respektována a mohou vyloučit použití některých certifikátů pro podepsání aplikací AIR.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 350 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Poznámka: Je-li to vhodné, používá program ADT nastavení proxy prostředí runtime jazyka Java pro připojení ke zdrojům aplikace Internet ke kontrole seznamu zrušených certifikátů a získání časových známek. Jestliže používáte program ADT a při připojování ke zdrojům na internetu dojde k obtížím a vaše síť vyžaduje specifické nastavení proxy, bude třeba nakonfigurovat nastavení proxy JRE. Určení možnosti podpisu AIR ❖ K určení možností podpisu programu ADT pro příkazy -package a -prepare použijte následující syntaxi: [-alias aliasName] [-storetype type] [-keystore path] [-storepass password1] [-keypass password2] [-providerName className] [-tsa url]
-alias aliasName —Alias klíče v úložišti klíčů. Určení alias není nutné, jestliže úložiště klíčů obsahuje pouze jediný certifikát. Není-li určen žádný alias, použije program ADT první klíč v úložišti klíčů. Ne všechny aplikace pro správu úložiště klíčů umožňují přiřazení alias certifikátům. Například při používání úložiště klíčů OS Windows použijte jako alias rozlišující název certifikátu. Můžete použít utilitu Java Keytool pro zobrazení dostupných certifikátů, takže budete moct určit alias. Například spuštění příkazu: keytool -list -storetype Windows-MY
vytvoří pro certifikát výstup podobný následující ukázce: CN=TestingCert,OU=QE,O=Adobe,C=US, PrivateKeyEntry, Certificate fingerprint (MD5): 73:D5:21:E9:8A:28:0A:AB:FD:1D:11:EA:BB:A7:55:88
Pro odkázání tohoto certifikátu na příkazovém řádku ADT nastavte alias na: CN=TestingCert,OU=QE,O=Adobe,C=US
V OS Mac X je alias certifikátu v řetězci klíčů název zobrazený v aplikaci přístupu k řetězci klíčů. -storetype type —Typ úložiště klíčů určený implementací úložiště. Výchozí implementace úložiště klíčů zahrnutá ve většině instalací jazyka Java podporuje typy JKS a PKCS12. Java 5.0 obsahuje podporu pro typ PKCS11 pro získání přístupu k úložištím klíčů na známkách hardware a typ Keychain pro získání přístupu k řetězci klíčů OS Mac X. Java 6.0 obsahuje podporu pro typ MSCAPI (pro OS Windows). Jestliže byly nainstalovány a nakonfigurovány jiní poskytovatelé JCA, mohou být k dispozici další typy úložišť klíčů. Jestliže nebyly určeny žádné typy úložiště klíčů, použije se výchozí typ pro výchozího poskytovatele JCA.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 351 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Typ uložení
Formát úložiště klíčů
Minimální verze Java
JKS
Soubor úložiště klíčů Java (.keystore)
1.2
PKCS12
soubor PKCS12 (.p12 nebo .pfx)
1.4
PKCS11
Známka hardware
1.5
Úložiště řetězce klíčů
Úložiště řetězce klíčů pro OS Mac X
1.5
Windows-MY nebo WindowsROOT
MSCAPI
1.6
-keystore path —Cesta k souboru úložiště klíčů pro typy uložení vycházející ze souborů. -storepass password1 —Heslo vyžadované pro přístup k úložišti klíčů. Není-li určeno, program ADT požádá o zadání hesla. -keypass password2 —Heslo vyžadované pro přístup k osobnímu klíči, který je použit pro podepsání aplikace AIR. Není-li určeno, program ADT požádá o zadání hesla. -providerName className —Poskytovatel JCA pro určený typ úložiště klíčů. Není-li určen, použije program ADT výchozího poskytovatele pro daný typ úložiště klíčů. -tsa url —Určuje URL serveru časové známky vyhovujícímu normě RFC3161-pro udělení časové známky digitálnímu podpisu. Není-li určena žádná URL, použije se výchozí server časové známky poskytnutý autoritou Geotrust. Když je podpis aplikace AIR opatřen časovou známkou, aplikace může být stále instalována i po vypršení certifikátu podpisu, protože časová známka ověří, že certifikát byl v době podpisu platný. Jestliže se program ADT nemůže připojit k serveru časové známky, je podepisování zrušeno a nebude vytvořen žádný balík. Pro vypnutí získávání časové známky určete -tsa none. Nicméně aplikace AIR zabalená bez časové známky nemůže být nainstalována po vypršení certifikátu podpisu. Poznámka: Možnosti podpisu jsou podobné ekvivalentním možnostem utility Java Keytool. Utilitu Keytool můžete použít k prozkoumání a správě úložišť klíčů v systému Windows. Utilitu zabezpečení Apple® lze za tímto účelem také použít v OS Mac X. Příklady možností podepsání Podepsání se souborem .p12: -storetype pkcs12 -keystore cert.p12
Podepsání s výchozím úložištěm klíčů Java: -alias AIRcert -storetype jks
Podepsání s řetězcem klíčů OS Mac X: -alias AIRcert -storetype KeychainStore -providerName Apple
Podepsání s úložištěm klíčů OS Windows: -alias cn=AIRCert -storeype Windows-MY
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 352 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Podepsání známkou hardware (rady pro konfiguraci Java k použití známky a správnou hodnotu providerName naleznete v pokynech výrobce známky): -alias AIRCert -storetype pkcs11 -providerName tokenProviderName
Vytvoření nepodepsaného přechodného souboru AIR pomocí programu ADT K vytvoření nepodepsaného přechodného souboru AIR použijte příkaz -prepare. Přechodný soubor AIR musí být podepsán použitím příkazu programu ADT -sign pro vytvoření platného instalačního souboru AIR. Příkaz -prepare přebírá stejné příznaky a parametry jako příkaz -package (s výjimkou možností podpisu). Jediným rozdílem je to, že výstupní soubor není podepsaný. Přechodný soubor je vygenerován s příponou názvu souboru: airi. Pro podpis přechodného souboru AIR použijte příkaz programu ADT -sign. (Viz Podpis přechodného souboru AIR pomocí programu ADT.) Příklad ADT adt –prepare unsignedMyApp.airi myApp.xml myApp.swf components.swc
Podpis přechodného souboru AIR pomocí programu ADT Pro podpis přechodného souboru AIR pomocí programu ADT použijte příkaz -sign. Příkaz podpisu je funkční pouze u přechodných souborů AIR (přípona airi). Soubor AIR nelze podepsat podruhé. Pro podpis přechodného souboru AIR použijte příkaz programu ADT -prepare. (Viz „Vytvoření nepodepsaného přechodného souboru AIR pomocí programu ADT“ na stránce 352.) Podpis souboru AIRI ❖ Použijte příkaz ADT -sign s následující syntaxí: adt -sign SIGNING_OPTIONSairi_fileair_file
SIGNING_OPTIONS Možnosti podpisu určují osobní klíč a certifikát použitý k podepsání souboru AIR. Tyto možnosti podpisu jsou popsány v tématu „Možnosti podpisu příkazového řádku programu ADT“ na stránce 349. airi_file Cesta k nepodepsanému přechodnému souboru AIR, který musí být podepsán. air_file Název souboru AIR, který má být vytvořen. Příklad ADT adt –sign -storetype pkcs12 -keystore cert.p12 unsignedMyApp.airi myApp.air
Více informací naleznete v tématu „Digitální podepisování souboru AIR“ na stránce 310.
Podepsání souboru AIR pro změnu certifikátu aplikace K aktualizaci stávající aplikace AIR pro použití nového certifikátu podpisu použijte příkaz programu ADT -migrate. Přesun certifikátu může být užitečný v následujících situacích:
• Aktualizace z certifikátu s vlastním podpisem na certifikát vydaný certifikační autoritou
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 353 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
• Změna z certifikátu s vlastním podpisem, který brzy vyprší, na nový certifikát s vlastním podpisem. • Změna z jednoho komerčního certifikátu na jiný, například při změně identity vaší společnosti. Pro použití podpisu přesunu musí být původní certifikát stále platný. Jakmile certifikát vyprší, nelze podpis přesunu použit. Uživatelé vaší aplikace budou muset odinstalovat stávající verzi před tím, než budou moct nainstalovat aktualizovanou verzi. Všimněte si, že podpis přesunu je implicitně označen časovou známkou, takže aktualizace AIR podepsané s podpisem přesunu zůstanou platné i po vypršení certifikátu. Poznámka: Obvykle není třeba přesunout certifikát při obnovení komerčně vydaného certifikátu. Obnovený certifikát si zachová stejnou identitu vydavatele jako certifikát původní, pokud nebyl změněn rozlišující název. Kompletní seznam atributů certifikátu, které jsou použity k určení rozlišujícího názvu, naleznete v tématu „O identifikátorech vydavatele AIR“ na stránce 311. Chcete-li přesunout aplikaci pro použití nového certifikátu: 1 Vytvořte aktualizaci své aplikace 2 Zabalte a podepište aktualizovaný soubor AIR pomocí certifikátu nový 3 Znovu podepište soubor AIR certifikátem původní pomocí příkazu -migrate
Soubor AIR podepsaný pomocí příkazu -migrate lze použít k nainstalování nové verze aplikace i k aktualizaci předcházejících verzí, včetně verzí podepsaných starým certifikátem. Přesun aplikace AIR pro použití nového certifikátu ❖ Použijte příkaz ADT -migrate s následující syntaxí: adt -migrate SIGNING_OPTIONS air_file_in air_file_out
SIGNING_OPTIONS Možnosti podpisu určují osobní klíč a certifikát použitý k podepsání souboru AIR. Tyto možnosti musí určovat původní certifikát podpisu a jsou popsány v tématu „Možnosti podpisu příkazového řádku programu ADT“ na stránce 349. air_file_in Soubor AIR pro aktualizaci podepsaný novým certifikátem. air_file_out Soubor AIR, který má být vytvořen. Příklad ADT adt –migrate -storetype pkcs12 -keystore cert.p12 myApp.air myApp.air
Více informací naleznete v tématu „Digitální podepisování souboru AIR“ na stránce 310. Poznámka: Příklad -migrate byl přidán k programu ADT ve verzi AIR 1.1.
Vytvoření certifikátu s vlastním podpisem pomocí programu ADT Certifikáty s vlastním podpisem vám umožňují vytvořit platný instalační soubor AIR, ale vašim uživatelům poskytují pouze omezené záruky bezpečnosti, protože věrohodnost certifikátů s vlastním podpisem nelze ověřit. Při instalaci souboru AIR s vlastním podpisem je informace o vydavateli zobrazena uživateli jako Neznámé. Certifikát vygenerovaný programem ADT je platný po dobu pěti let.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 354 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Jestliže vytvoříte aktualizaci pro aplikaci AIR, která byla podepsána vámi vytvořeným certifikátem, musíte stejný certifikát použít k podepsání původních i aktualizovaných souborů AIR. Certifikáty vytvořené programem ADT jsou vždy jedinečné, i při použití stejných parametrů. Jestliže si proto přejete vámi podepsané aktualizace pomocí certifikátu vygenerovaného programem ADT, zachovejte původní certifikát v bezpečném umístění. Dále nebude možné aktualizovaný soubor AIR vytvořit po vypršení původního certifikátu vygenerovaného programem ADT. (Nové aplikace můžete publikovat s odlišným certifikátem, ale nikoliv však nové verze stejné aplikace.) Důležité: Z důvodů omezení certifikátů s vlastním podpisem společnost Adobe důrazně doporučuje používat pro podepisování veřejně dostupných aplikací AIR komerční certifikáty vydané uznávaným certifikačním úřadem. Certifikát a přiřazený osobní klíč vygenerovaný programem ADT jsou uloženy v souboru úložiště klíčů typu PKCS12. Určené heslo je nastaveno na samotném klíči, nikoliv na úložišti. Vygenerování digitálního certifikátu ID pro soubory AIR s vlastním podpisem. ❖ Použijte příkaz programu ADT -certificate (na jediném příkazovém řádku): adt -certificate -cn name [-ou org_unit][-o org_name][-c country] key_type pfx_file password
-cn name Řetězec přiřazený jako běžné jméno nového certifikátu. -ou org_unit Řetězec přiřazený jako organizační jednotka vydávající certifikát. (Volitelné.) -o org_name Řetězec přiřazený jako organizace vydávající certifikát. (Volitelné.) -c country Kód země ISO-3166 obsahující dvě písmena. Certifikát není vygenerován, je-li zadán neplatný kód.
(Volitelné.) key_type Typ klíče, který bude pro certifikát použit. Buď „1024-RSA“ nebo „2048-RSA“.
pfx_file Cesta pro soubor certifikátu, který bude vygenerován. password Heslo pro nový certifikát. Heslo je vyžadováno při podepisování souborů AIR tímto certifikátem. Příklady vygenerování certifikátu adt -certificate -cn SelfSign -ou QE -o "Example, Co" -c US 2048-RSA newcert.p12 39#wnetx3tl adt -certificate -cn ADigitalID 1024-RSA SigningCert.p12 39#wnetx3tl
Pro použití těchto certifikátů k podepsání souborů AIR použijte následující možnosti podpisu s příkazy programu ADT -package nebo -prepare: -storetype pkcs12 -keystore newcert.p12 -keypass 39#wnetx3tl -storetype pkcs12 -keystore SigningCert.p12 -keypass 39#wnetx3tl
Použití nástroje Apache Ant s nástroji sady SDK Toto téma obsahuje příklady použití vývojového nástroje Apache Ant k testování a balení aplikací AIR. Poznámka: Tyto informace nejsou určeny jako kompletní přehled nástroje Apache Ant. Dokumentaci nástroje Ant naleznete na těchto odkazech: http://Ant.Apache.org.
Používání nástroje Ant pro jednoduché projekty Tento příklad ukazuje vývoj aplikace AIR pomocí nástroje Ant a nástrojů příkazového řádku AIR. Jednoduchá struktura projektu je použita u všech souborů uložených v jediném adresáři.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 355 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
Pro usnadnění opětovného použití vývojového skriptu používají tyto příklady několik definovaných vlastností. Jedna množina vlastností definuje nainstalovaná umístění nástrojů příkazového řádku: <property name="SDK_HOME" value="C:/Flex3SDK"/> <property name="ADL" value="${SDK_HOME}/bin/adl.exe"/> <property name="ADT.JAR" value="${SDK_HOME}/lib/adt.jar"/>
Druhá množina vlastností je specifická pro každý projekt. Tyto vlastnosti předpokládají konvenci názvů, kde jsou deskriptor aplikace a soubory AIR pojmenovány na základě kořenového zdrojového souboru. Jiné konvence jsou snadno podporované. <property <property <property <property <property <property
Iniciace programu ADL pro testování aplikace Pro spuštění aplikace pomocí programu ADL použijte úlohu exec: <exec executable="${ADL}"> <arg value="${APP_DESCRIPTOR}"/>
Iniciace programu ADT k zabalení aplikace K zabalení aplikace použijte úlohu jazyka Java pro spuštění nástroje adt.jar: <java jar="${ADT.JAR}" fork="true" failonerror="true"> <arg value="-package"/> <arg value="-storetype"/> <arg value="${STORETYPE}"/> <arg value="-keystore"/> <arg value="${KEYSTORE}"/> <arg value="${AIR_NAME}"/> <arg value="${APP_DESCRIPTOR}"/> <arg value="${APP_NAME}.swf"/> <arg value="*.png"/>
Jestliže má vaše aplikace více souborů k zabalení, můžete přidat další prvky <arg>.
Použití nástroje Ant pro složitější projekty Struktura adresáře typické aplikace je složitější než jediný adresář. Následující příklad ukazuje vývojový soubor použitý ke kompilaci, testování a zabalení aplikace AIR, který má praktičtější projektovou strukturu adresářů. Tento ukázkový projekt ukládá zdrojové soubory aplikace a jiné datové zdroje jako soubory ikon do adresáře src. Vývojový skript vytvoří následující pracovní adresáře: build Uchovává verze uvedení (bez ladění) kompilovaných souborů SWF.
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 356 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
debug Uchovává nezabalené laděné verze aplikace, včetně libovolných kompilovaných souborů SWF a souborů datových zdrojů. Utilita ADL spustí aplikaci z tohoto adresáře. release Uchovává finální balík AIR
Nástroje AIR vyžadují použití některých dodatečných možností, pokud pracujete se soubory mimo aktuální pracovní adresář: Testování Druhý argument předaný programu ADL určuje kořenový adresář aplikace AIR. Pro určení kořenového adresáře aplikace je k úloze testování přidán následující řádek: <arg value="${debug}"/>
Balení Balení souborů z podadresářů, které by neměly být součástí finální struktury balíku, vyžaduje použití příkazu
-C pro změnu pracovního adresáře ADT. Když použijete příkaz -C, budou soubory a adresáře v novém pracovním adresáři zkopírovány na kořenovou úroveň souboru balíku AIR. Proto -C build file.png zkopíruje file.png do kořene adresáře aplikace. Podobně -C assets icons zkopíruje složku ikon na kořenovou úroveň a zkopíruje také všechny soubory a adresáře uvnitř této složky. Například následující sekvence řádků v úloze balení přidá adresář s ikonami přímo na kořenovou úroveň souboru balíku aplikace: <arg value="-C"/> <arg value="${assets}"/> <arg value="icons"/>
Poznámka: Jestliže potřebujete přesunout mnohou zdrojů a datových zdrojů do odlišných souvisejících umístění, je obvykle jednodušší seřadit je do přechodného adresáře pomocí úloh nástroje Ant, než vytvořit složitý seznam argumentů pro program ADT. Jakmile jsou vaše zdroje zorganizovány, můžete k jejich zabalení použít jednoduchý seznam argumentů programu ADT. <project> <property name="SDK_HOME" value="C:/Flex3SDK"/> <property name="ADL" value="${SDK_HOME}/bin/adl.exe"/> <property name="ADT.JAR" value="${SDK_HOME}/lib/adt.jar"/> <property name="PROJ_ROOT_DIR" value="."/> <property name="APP_NAME" value="ExampleApplication"/> <property name="APP_ROOT_DIR" value="."/> <property name="APP_ROOT_FILE" value="${APP_NAME}.swf"/> <property name="APP_DESCRIPTOR" value="${PROJ_ROOT_DIR}/${APP_NAME}-app.xml"/> <property name="AIR_NAME" value="${APP_NAME}.air"/> <property name="release" location="${PROJ_ROOT_DIR}/release"/> <property name="assets" location="${PROJ_ROOT_DIR}/src/assets"/> <property name="STORETYPE" value="pkcs12"/> <property name="KEYSTORE" value="ExampleCert.p12"/> <mkdir dir="${release}"/> <exec executable="${ADL}"> <arg value="${APP_DESCRIPTOR}"/> <arg value="${APP_ROOT_DIR}"/>
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 357 Vytváření aplikace AIR pomocí nástrojů příkazového řádku
adresář plochy 106 Adresář Program Files (OS Windows) 301
atribut sandboxRoot (elementy frame a iframe) 212, 215, 220, 241 atributy documentRoot (prvky frame a iframe) 30 automatické spuštění (spuštění aplikace AIR při přihlášení) 285
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 359 Rejstřík
certifikáty
soubory 161
autority (CA) 42
struktura 162
formáty 311
synchronní režim 164
možnosti příkazového řádku programu ADT 349
tabulky 162, 166
podepisování kódu 42
typování dat 171, 184
podepisování souborů AIR 310
v paměti 165
přesunutí 313, 352
více, práce s 181
řetězce 315
výkon 171
vypršení 312
vytváření 165
změna 313, 352
zabezpečení 171
Certifikáty Authenticode od společnosti Microsoft 312 Certifikáty ChosenSecurity 310, 311 Certifikáty GlobalSign 310, 311 Certifikáty pro vývojáře AIR 311
třídy použité s 162
změna dat 180 databáze v paměti 165 datové typy, databáze 184 default_badge.html 303
Certifikáty pro vývojáře Apple 311
deskriptor aktualizace, soubor (aktualizační rámec) 322
Certifikáty pro vývojáře JavaSoft 312
Digitální ID Microsoft Authenticode 311
certifikáty s vlastním podpisem 42, 310, 353
Digitální ID pro podpis Sun Java 311
Certifikáty Thawte 310, 311
digitální podpisy 310, 343, 349
Certifikáty VeriSign 311
distribuce aplikací AIR 301
Certifikáty Verisign 310, 311
dočasné adresáře 114
cesty (soubor a adresář) 110
dočasné soubory 119
cesty, relativní 111
dokumentace aplikace Flash 9 dokumentace jazyka ActionScript 9
Ch Chod aplikace AIR aktualizace 23 chod programu AIR nové funkce 53 Clipboard (Schránka) 216 CSS
dokumentace společnosti Adobe 9 dokumentace, související 9 DOM HTML a nativní okna 58 DPAPI (přidružení šifrovaných dat k uživatelům) 208 DRM 269 oprávnění 277
přístup ke stylům HTML z jazyka ActionScript 239
dynamické generování kódu 32
rozšíření prostředí AIR 224
É ekvivalenty kláves
čtení souborů 119
kopírování a vkládání 149 Ď databáze asynchronní režim 164 chyby 181 identifikátory řádku 180 mazání dat 180 načítání dat 172 o 161
element allowBrowserInvocation (soubor deskriptoru aplikace) 51, 282, 285 Element customUpdateUI (soubor deskriptoru aplikace) 317 element customUpdateUI (soubor deskriptoru aplikace) 50, 282 Element fileTypes (soubor deskriptoru aplikace) 290
pole 162
element fileTypes (soubor deskriptoru aplikace) 51
použití pro 161
element ID (soubor deskriptoru aplikace) 46
primární klíče 179, 180
element ID (třída NativeApplication) 289
připojení 167
element ikony (soubor deskriptoru aplikace) 50
řádky 162 sloupce 162
element initialWindow (soubor deskriptoru aplikace) 49, 58 element installFolder (soubor deskriptoru aplikace) 48 element maximalizace (soubor deskriptoru aplikace) 50 element maxSize (soubor deskriptoru aplikace) 50 element minimalizace (soubor deskriptoru aplikace) 50 element minSize (soubor deskriptoru aplikace) 50 element názvu (soubor deskriptoru aplikace) 47 element názvu souboru (soubor deskriptoru aplikace) 46 element obsahu (soubor deskriptoru aplikace) 49 element popisu (soubor deskriptoru aplikace) 47 element programMenuFolder (soubor deskriptoru aplikace) 49 element průhlednosti (soubor deskriptoru aplikace) 49 element šířky (soubor deskriptoru aplikace) 50 element titulu (soubor deskriptoru aplikace) 49 element verze (soubor deskriptoru aplikace) 46 element viditelnosti (soubor deskriptoru aplikace) 49 element výšky (soubor deskriptoru aplikace) 50 element x (soubor deskriptoru aplikace) 50 element y (soubor deskriptoru aplikace) 50 element změny velikosti (soubor deskriptoru aplikace) 50 elementy frame 212, 214, 220 elementy iframe 212, 214, 220 Endian.BIG_ENDIAN 152 Endian.LITTLE_ENDIAN 152 F FDB (debugger) 342 File, třída metoda load() 127 metoda save() 127 FileReference, třída metoda load() 127 metoda save() 127 Flash Media Rights Management Server 269 Flash Player 53, 210, 213, 232
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 360 Rejstřík
Funkce AC_FL_RunContent() (v default_badge.html) 303 funkce eval() 28, 32, 214, 227, 228 funkce setInterval() 33, 219, 230 funkce setTimeout() 33, 219, 230 funkce vyvolání prohlížeče 51 funkce vyvolání z prohlížeče 285 G gesto tažení dovnitř 131, 135 gesto tažení ven 131, 133 H hesla nastavení pro zašifrovaný multimediální obsah 269 hlavní obrazovka 81 HTML DOM, přístup z jazyka ActionScript 235 karantény 213 kopírování a vkládání 145 načtení obsahu 226 okna 65 podpora přetažení 131, 139
ikony hlavního panelu 71 ikony hlavního panelu (Windows) 63 ikony hlavního panelu systému 85, 88 ikony na hlavním panelu 99 ikony oznamovací oblasti podpora 99 ikony proxy Mac OS 63 ikony ukotvení minimalizace oken a ikony ukotvení 71 nabídky 88 informace o autorských právech aplikace AIR 48 instalace aplikací AIR 301
klávesové ekvivalenty příkazů nabídky 87 klávesové zkratky kopírování a vkládání 147 klávesové zkratky pro příkazy nabídky 87 knihy z nakladatelství Adobe Press 9 kódy chyb DRM 278 kompilátor acompc 237 komprese deflate 153 komprese ZLIB 153 komprimování dat 153 konfigurační soubor aktualizace (aktualizační rámec) 323 konstruktory Function (v jazyce JavaScript) 214 HTML 91
zamezení vzniku chyb zabezpečení 228 jazyky, podporované v instalátoru aplikace AIR 47
výchozí položky nabídky (Mac OS) 148 kopírování adresářů 115 kopírování souborů 117 kořenové svazky 106 koš (odstranění souboru) 118 kurzor, účinky tažení 136, 140 L ladění pomocí nástroje ADL 342 literály objektů (v jazyce JavaScript) 32
jmenný prostor XML (soubor deskriptoru aplikace) 44
load(), metoda (třída FileReference) 127
JSON 214
lokální databáze
lokalizace 330 Viz databáze lokální verze, výběr pro aplikaci 331
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 361 Rejstřík
M Mac OS ikony proxy 63 panel nástrojů 63
Metoda getApplicationVersion() (soubor air.swf) 307
metoda orderInBackOf() (třída NativeWindow) 71
metoda getData()
metoda orderInFrontOf() (třída NativeWindow) 71
objekt ClipboardData 216
manipulační program onload 32
objekt DataTransfer 141, 217
maximalizace oken 50, 59, 73
třída Clipboard 136
mazání adresářů 116
událost kopírování a vložení v HTML 146
metoda orderToBack() (třída NativeWindow) 71 metoda orderToFront() (třída NativeWindow) 71
metoda getData() (třída Clipboard) 132
Metoda postMessage() (objekt PDF) 267
metoda getData() (vlastnosti dataTransfer události tažení HTML) 139
metoda preloadEmbeddedMetadata() (třída NetStream) 271
Metoda getDefaultApplication() (třída NativeApplication) 290
metoda print() (objekt Window (Okno)) 213
Metoda getDirectoryListing() (třída File) 115
metoda readBytes() (třída ByteArray) 150
metoda bounce() (třída Icon) 100
Metoda getDirectoryListingAsync() (třída File) 115
metoda readInt() (třída ByteArray) 150
Metoda browseForDirectory() (třída File) 108
Metoda getResult() (třída SQLStatement) 179
Metoda browseForOpen() (třída File) 109 Metoda browseForSave() (třída File) 109
metoda getScreensForRectangle() (třída Screen) 81
metoda clearData()
metoda getStatus() (soubor air.swf) 306
metoda acceptDragDrop() (třída NativeDragManager) 132, 136 metoda activate() (třída NativeWindow) 65, 71 metoda addChild() (třída Stage) 68 metoda addChildAt() (třída Stage) 68 Metoda attach() (třída SQLConnection) 181
objekt ClipboardData 216
metoda hasEventListener() 250
objekt DataTransfer 139, 217
Metoda installApplication() (soubor air.swf) 307
metoda close() třída NativeWindow 72 metoda close() (objekt Window) 58 metoda compress() (třída ByteArray) 153 metoda copy() (třída NativeApplication) 148 Metoda copyTo() (třída File) 117 Metoda copyToAsync() (třída File) 117 Metoda createDirectory() (třída File) 114 metoda createElement() (objekt Document) 231
Metoda isSetAsDefaultApplication() (třída NativeApplication) 290
Metoda resolvePath() (třída File) 106
metoda setAsDefaultApplication() (třída NativeApplication) 51
metoda maximize() (třída NativeWindow) 73
metoda setData()
metoda minimize() (třída NativeWindow) 73
Metoda moveToAsync() (třída File) 117 Metoda moveToTrash() (třída File) 118
Metoda deleteDirectoryAsync() (třída File) 116
Metoda moveToTrashAsync() (třída File) 118
Metoda deleteFile() (třída File) 118
Metoda NativeApplication.setAsDefaultApplic ation() 290
třída NativeApplication 287
metoda resetDRMVouchers() (třída NetStream) 274
metoda loadString() (třída HTMLLoader) 35, 226
Metoda deleteDirectory() (třída File) 116
metoda exit()
metoda removeEventListener() 249
Metoda setAsDefaultApplication() (třída NativeApplication) 290
Metoda createTempFile() (třída File) 119
Metoda execute() (třída SQLStatement) 169, 172, 179
Metoda removeAsDefaultApplication() (třída NativeApplication) 290
metoda Loader.loadBytes() 40
Metoda moveTo() (třída File) 117
metoda doDrag() (třída NativeDragManager) 132, 133, 136
Metoda relativize() (třída File) 111
metoda loadBytes() (třída Loader) 40
Metoda createTempDirectory() (třída File) 114, 119
metoda display() (třída NativeMenu) 94
metoda readUTFBytes() (třída ByteArray) 150
metoda restore() (třída NativeWindow) 73
metoda moveTo()
metoda dispatchEvent() (třída NativeWindow) 59
metoda readObject() (třída ByteArray) 150
Metoda listRootDirectories() (třída File) 106
metoda createRootWindow() (třída HTMLLoader) 65, 67, 226
Metoda deleteFileAsync() (třída File) 118
metoda readFloat() (třída ByteArray) 150
objekt Window 58
metoda open()
objekt ClipboadData 216 objekt DataTransfer 139, 141, 217 metoda setDragImage() (vlastnosti dataTransfer události tažení HTML) 139 metoda setDRMAuthenticationCredentials() (třída NetStream) 270, 274 metoda startMove() (třída NativeWindow) 76 metoda startResize() (třída NativeWindow) 75 metoda uncompress() (třída ByteArray) 153 Metoda update() (třída Updater) 316
objekt Window 34, 65
metoda write() (objekt Document (Dokument)) 218
objekt Window (Okno) 219
metoda write() (objekt Document) 231
třída SQLConnection 164
metoda writeBytes() (třída ByteArray) 150
metoda open() (třída SQLConnection) 165
metoda writeFloat() (třída ByteArray) 150
metoda openAsync() (třída SQLConnection) 164, 165, 167
metoda writeInt() (třída ByteArray) 150
metoda orderBehind() (třída NativeWindow) 71
metoda writeln() (objekt Document (Dokument)) 218
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 362 Rejstřík
metoda writeln() (objekt Document) 231 metoda writeObject() (třída ByteArray) 150 metoda writeUTFBytes() (třída ByteArray) 150 Microsoft Windows ikony hlavního panelu 63 minimalizace oken 50, 59, 71, 73 místní důvěryhodná karanténa 213
nabídky okna 84, 96 vytváření 88
metoda close() 58
nabídky ukotvení 85
metoda moveTo() 58
Nastavení FlashVars (pro používání badge.swf) 303
metoda open() 34, 65
Nastavení registru Windows 26
vlastnost nativeWindow 58, 66
nativní nabídky
vlastnost opener 66
Viz nabídky
vlastnost parent 66
místní karanténa z hlediska systému souborů 213
nativní okna
mnemotechnické znaky
Název sloupce OID (SQL) 180
položky nabídky 87
objekt Window
Viz okna
vlastnost htmlLoader 66, 226
vlastnost parentSandboxBridge 242 vlastnost runtime 66, 232 objekt Window (Okno)
neaplikační karantény zabezpečení 29 nepojmenované parametry (v příkazech SQL) 171 NetStream, třída
Ň nabídka aplikace 96 struktura 86 události 96 Nabídka Start (Windows) 49 nabídky 84 aplikace 88 ikona hlavního panelu systému 88 ikony hlavního panelu systému 85 klávesové ekvivalenty 87
metoda preloadEmbeddedMetadata() 271
vlastnost nativeWindow 219 vlastnost parentSandboxBridge 219 vlastnost runtime 211, 218 Objekt XMLHttpRequest 33 objekt XMLHttpRequest 214, 220, 231
neznámý název vydavatele (v instalátoru aplikace AIR) 310
objekty Date, převádění mezi jazyky ActionScript a JavaScript 239
normální okna 60
objekty RegExp, převádění mezi jazyky ActionScript a JavaScript 239
Ó objekt Canvas (Plátno) 215, 222
obnovení oken 59, 73
objekt DataTransfer vlastnost types 141 objekt DataTransfer (přetažení HTML) 217
kontextové nabídky 90
objekt DataTransfer (tažení HTML) 139, 140, 141
oddělovače 90
Objekt Document
okno 88, 96
metoda write() 33
podnabídky 86, 89
metoda writeln() 33
položka ukotvení 88
vlastnost htmlLoader 219
objekt Document
obrazovky 80 hlavní 81 okna, přesouvání mezi 81 výčet 81 obsah PDF komunikace pomocí kódu JavaScript 266 načítání 266 přidávání do aplikací AIR 265 známá omezení 268 obsah SWF
položky 86
metoda createElement() 231
příkazy kopírování a vkládání 147
metoda write() 231
rozbalovací 88, 94
metoda writeln() 231
oddělovače, nabídka 90
struktura 85
vlastnost designMode 141
oddělovací znak cesty (systém souborů) 108
tok událostí 86, 94
vlastnost stylesheets 239
odinstalace
třídy pro práci s nimi 85
objekt Document (Dokument)
typy 85
metoda wirte() 218
ukotvení 85
metoda wirtelin() 218
vlastní 85
vlastnost designMode 218
výchozí systémové 85
Objekt Window
překrytí přes HTML 67 v HTML 212
modul runtime prostředí AIR 2 odinstalování aplikace AIR 26 odkazy na objekty podpora kopírování a vkládání 145
vytváření 88
vlastnost childSandboxBridge 31
XML, definování nabídek 92
vlastnost parentSandboxBridge 31
odkládací adresář aplikace 233
vlastnost runtime 28, 33
odstranění souborů 118
nabídky aplikace 84, 96 vytváření 88
podpora přetažení 131
odstraňování adresářů 116, 118
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 363 Rejstřík
okna 57
osobní klíče 349
překlad aplikací 330 přemísťování oken 59, 75, 76
aktivní 70, 71
otazník (?) znaky, v nepojmenovaných parametrech SQL 171
přemísťování 59, 75, 76 přesouvání 81 průhlednost 49, 61 režim změny velikosti plochy 65
přesunutí 313, 352 Podpora databáze SQLLite 160 Viz také databáze
skrývání 71
pojmenované parametry (v příkazech SQL) 170
správa 70
pole (databáze) 162
styl 60 systémové prvky 60
Pole NSHumanReadableCopyright(OS Mac) 48
systémové prvky operačního systému 60
poloha oken 50
tok událostí 59
položky nabídky 86
klávesy modifikátoru 136 podpora Flex 133 příbuzné třídy 131 události v HTML 138 výchozí chování v HTML 138 přihlášení do systému, spuštění aplikace AIR 285 přihlášení, spuštění aplikace AIR 285 Příkaz CREATE TABLE (SQL) 166 Příkaz DELETE (SQL) 180 Příkaz INSERT (SQL) 184 Příkaz SELECT (SQL) 172, 184 Příkaz UPDATE (SQL) 180 příkazy, nabídka Viz položky nabídky
třídy pro práci s nimi 58
checked 88
příkazy, SQL 168
typy 60
enabled 88
primární klávesy
události 77
klávesové ekvivalenty 87
úvodní 58
klávesové zkratky 87
velikost 50, 65
kopírování a vkládání 148
viditelnost 49
mnemotechnické znaky 87
připojení k databázi 167
vlastní systémové prvky 60
stavy 88
vlastnosti 49
výběr 95
přípony (soubor), asociace s aplikací AIR 51, 290
vytváření 63, 69, 226
vytváření 90
vzhled 60 zavírání 59, 72, 287
položky nabídky, data přiřazení 88
zjednodušená okna 60
pomocná okna 60
změna velikosti 50, 59, 75
pořadí bytů 152
zobrazení 71
pořadí bytů big-endian 152
okna pracovní plochy
pořadí bytů little-endian 152
položky nabídky 87 primární klíče databáze 179
přípony (soubor), přiřazení k aplikaci AIR 283 procházení výběr adresáře 108 výběr souboru 109 Program AIR Developer Tool (ADT) zabalení souboru AIR 343
pořadí oken 71
Prohlášení o postupech certifikátu (CPS) 315
okna zobrazená na celou obrazovku 78
pořadí zobrazení, okna 71
protokol asfunction 28
oprávnění
povolení, použití pro obsah s šifrováním DRM 269
průhledná okna 49, 61
požadavky
prvky iframe 30
Viz okna
pro obsah s šifrováním DRM 277 oprávnění vyžadovaná pro aktualizaci runtime AIR nebo aplikace AIR 301, 308 oprávnění vyžadovaná pro aktualizaci runtime AIR nebo aplikaci AIR 23
vykreslení PDF 265 pozadí oken 61 pozice myši během tažení 137
pruhy nabídek 86
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 364 Rejstřík
Ř řádky (databáze) 162, 179
skrývání oken 71
příkaz DELETE 180
sloupce (databáze) 162
příkaz INSERT 184
Registrace typů souborů 290
Sloupce AUTOINCREMENT (SQL) 180
příkaz SELECT 172, 184
relativní cesty (mezi soubory) 111
sloupce INTEGER PRIMARY KEY (SQL) 180
příkaz UPDATE 180
snímky 30
_ROWID_ column name 180
RIA (Rich Internet Applications) 6
soubor AIRAliases.js 211, 232
sloupce AUTOINCREMENT 180
_ROWID_ column name (SQL) 180
Soubor AIRLocalizer.js 331
sloupce INTEGER PRIMARY KEY 180
rozbalovací nabídky 84, 94
soubor API 104
třídy použité s 162
řetězec klíčů (přidružení šifrovaných dat k uživatelům) 208
vytváření 88 rozměry, okna 50 Runtime AIR
soubor deskriptoru aplikace 43 soubor desktriptoru aplikace čtení 289
příkazy 168
typování dat 171, 184 start (systém), spuštění aplikace AIR 285 synchronní programování
úrovně dočasné opravy 291
soubor ID vydavatele 289
databáze 164, 167, 184
zjišťování 291, 306
soubor JavaScript
systém souborů 104
runtime AIR úrovně záplaty 44
AIRAliases.js 211 soubor volitel dialogová okna 109 soubory
okna HTML 65 Ť tabulky (databáze) 162 vytváření 166
text
schéma URL file 233
podepisování 310
podpora kopírování a vkládání 145
schéma URL javascript 33, 230
zabalení 343
podpora přetažení 131, 139
schéma URL souboru 38, 110 schéma URL uložení dat aplikace 110 Schémata URL 110 Schopnosti
Soubory AIRI vytváření pomocí programu AIR Developer Tool (ADT) 352 soubory cookie 216
vlastnost language 331
Soubory Info.plist (OS Mac) 48
vlastnost languages 331
Soubory P12 311
Schránka kopírování a vkládání 145 serializace objektů 133 serializované objekty
Soubory PFX 311 soubory SWF načtení pomocí tagu script 237 spouštění aplikací AIR 282
podpora kopírování a vkládání 145
správa digitálních práv 269
podpora přetažení 131
spuštění aplikací AIR 301, 308
Seznam zrušených certifikátů (CRL) 315 seznamy souborů podpora přetažení 139 seznamy stylů, HTML práce v jazyce ActionScript 239 šifrovaná data, ukládání a načítání 208 šifrování 269 šifrování dat 208 šifrování obsahu videa 269
SQL název sloupce OID 180 název sloupce ROWID 180 nepojmenované parametry (v příkazech) 171
tisk 213 Třída SQLStatement 162, 168 třída ApplicationDomain 235 třída BrowserInvokeEvent 285 třída ByteArray konstruktor 150 metoda compress() 153 metoda readBytes() 150 metoda readFloat() 150 metoda readInt() 150 metoda readObject() 150 metoda readUTFBytes() 150 metoda uncompress() 153 metoda writeBytes() 150 metoda writeFloat() 150
o 162
metoda writeInt() 150
parametry v příkazech 170
metoda writeObject() 150
pojmenované parametry (v příkazech) 170
metoda writeUTFBytes() 150
příkaz CREATE TABLE 166
vlastnost bytesAvailable 151
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 365 Rejstřík
metoda copyTo() 117 metoda copyToAsync() 117 metoda createDirectory() 114
vlastnost runtimeApplicationDomain 235
metoda createTempDirectory() 114, 119
vlastnost width 226
metoda createTempFile() 119
Třída HTMLPDFCapability 265
metoda deleteDirectory() 116
Třída HTMLUncaughtScriptException 246
metoda deleteDirectoryAsync() 116
třída Icon
metoda deleteFile() 118 metoda deleteFileAsync() 118 metoda getDirectoryListingAsync() 115
metoda bounce() 100 třída icon vlastnost bitmaps 99
metoda getRootDirectories() 105
Třída InvokeEvent 52
metoda moveTo() 117
třída InvokeEvent 283
metoda moveToAsync() 117
vlastnost arguments 283
metoda moveToTrash() 118
vlastnost currentDirectory 283
metoda moveToTrashAsync() 118
třída Keyboard 87
metoda relativize() 111
třída Loader 66
metoda resolvePath() 105
třída LoaderContext
vlastnost supportsSystemTrayIcon 99 třída NativeBoundsEvent 77 třída NativeDragEvent vlastnost clipboard 136 vlastnost dropAction 135, 136 třída NativeDragManager metoda acceptDragDrop() 132, 136 metoda doDrag() 132, 133, 136 třída NativeMenu 86, 94 třída NativeMenuItem 86 data vlastnost data 88 vlastnost keyEquivalent 87 vlastnost keyEquivalentModifiers 87 vlastnost label 148 vlastnost mnemonicIndex 87 vlastnost podnabídky 86 třída NativeWindow 58 konstruktor 65 metoda activate 71
vlastnost applicationStorageDirectory 105
vlastnost allowLoadBytesCodeExecution 40
vlastnost creationDate 116
vlastnost applicationDomain 35
metoda addEventListener() 77
vlastnost creator 116
vlastnost securityDomain 35
metoda close() 72
vlastnost desktopDirectory 105
třída LoaderInfo
metoda activate() 65, 71
metoda dispatchEvent() 59
vlastnost documentsDirectory 105
vlastnost childSandboxBridge 36
metoda maximize() 73
vlastnost encoding 113
vlastnost parentSandboxBridge 36
metoda minimize() 73
vlastnost exists 116 vlastnost isDirectory 116
Třída LocalConnection 302, 309
metoda orderBehind() 71 metoda orderInBackOf() 71
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 366 Rejstřík
metoda orderInFrontOf() 71
Třída SQLSchemaResult 162
událost drag (přetažení) 138, 217
metoda orderToBack() 71
Třída SQLStatement
událost dragend 138, 217
metoda orderToFront() 71
metoda execute() 179
událost dragenter 138, 217
metoda restore() 73
metoda getResult() 179
událost dragleave 138, 217
metoda startMove() 76
metoda spuštění 169
událost dragover 138, 217
metoda startResize() 75
objekt parametry 169
událost dragstart 138, 217
události 77
vlastnost parametrů 170
událost drop (vložení) 217
vlastnost alwaysInFront 71
vlastnost sqlConnection 169
událost enterFrame 68
vlastnost stage 68
vlastnost textu 169, 170, 172, 180
událost exiting 287
vlastnost systemChrome 60
Třída SQLTableSchema 162
událost htmlBoundsChanged 245
vlastnost systemMaxSize 65
Třída SQLTransactionLockType 162
Událost htmlDOMInitialize 245
vlastnost systemMinSize 65
Třída SQLTriggerSchema 162
událost invoke 282
vlastnost transparent 60, 61
Třída SQLUpdateEvent 162
událost kopírování 146
vlastnost type 60
Třída SQLViewSchema 162
událost load 228, 235
vlastnost visible 65, 71
třída Stage
událost load (načtení) 212, 214
vytváření instancí 69
metoda addChild() 68
událost locationChange 245
metoda addChildAt() 68
událost mouseDown 75, 132
vlastnost displayState 78
událost mouseMove 132
třída NativeWindowDisplayStateEvent 78
vlastnost nativeWindow 64, 70
událost move 59, 77
třída NativeWindowInitOptions 64, 65
vlastnost scaleMode 65, 75
událost moving 77
třída NativeWindow class JavaScript, přístup 211
třída NetStream
třída StageDisplayState 78
událost nativeDragComplete 132, 135, 137
metoda resetDRMVouchers() 274
třída StageScaleMode 65, 75
událost nativeDragDrop 132
metoda setDRMAuthenticationCredentials() 2 70, 274
třída StatusEvent 270
událost nativeDragEnter 132, 135, 136, 137
třída TextField
událost nativeDragExit 132, 137
třída Netstream zašifrovaný obsah, přehrávání 270 Třída Responder 169, 179 třída Screen 80 metoda getScreenForRectangle() 81 vlastnost mainScreen 81 vlastnost screens 81 Třída Security metoda allowDomain() 35, 39 vlastnost sandboxType 291 Třída souboru odkazování na lokální databázi 165 Třída SQLCollationType 162 Třída SQLColumnNameStyle 162 Třída SQLConnection 162 metoda attach() 181 metoda open 165 metoda open() 164 metoda openAsync() 164, 165, 167 Třída SQLError 162, 169 Třída SQLErrorEvent 162, 169 Třída SQLEvent 162 Třída SQLIndexSchema 162 Třída SQLMode 162, 168 Třída SQLResult 162, 179
načtený HTML 226
událost nativeDragOver 132, 135, 136, 137
značky img 28
událost nativeDragStart 132, 137
Třída Updater 316
událost nativeDragUpdate 132, 137
třída URLStream 214
událost posouvání 245
třída Window 58
událost resize 59, 77
třída WindowedApplication 58
událost resizing 77
třída XMLList 232
událost schránky 217
typy MIME
událost select 86, 95, 96
kopírování a vkládání HTML 216
Událost uncaughtScriptExcpetion 245
přetažení HTML 139
událost upuštění 138 událost userIdle 291
Ú událost active 77
Událost userPresent 291
událost browserInvoke 286
událost výsledku 169
událost browserInvokey 309
události
událost vyjmutí 146
událost chyby 169
HTML 245
událost close 77
manipulační programy 248
událost closing 72, 77, 248, 287
nabídka 86, 94
událost complete 235, 239
nativní okna 59
událost contextmenu 91
posluchače 248
událost deactivate 77
třída NativeWindow 77
událost displaying 86, 96
události load 231
událost displayStateChange 59, 78
události menuItemSelect 87
událost displayStateChanging 59, 78
události menuSelect 87
událost dokončení 245
události unload (odstranění z paměti) 218
událost dominitialize 221
ukázkové aplikace 2
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 367 Rejstřík
W web podpory společnosti Adobe 9 WebKit 210, 213, 224 vlastnost -webkit-border-horizontalspacing jazyka CSS 224
webové prohlížeče instalace aplikací AIR z 307, 308 spuštění aplikace AIR z webového prohlížeče 285 zjištění, zda je aplikace AIR nainstalována z 307 zjišťování runtime AIR z 306 X XML definování nabídek 92 třída 232 xmlns (soubor deskriptoru aplikace) 44 Ž zabalení souborů AIR program AIR Developer Tool (ADT) 343 zabezpečení adresář uložení dat aplikace 25 chyby jazyka JavaScript 228 CSS 29 databáze 171 dynamické generování kódu 32 funkce eval() 32 funkce vyvolání z prohlížeče 286
vlastnost -webkit-border-vertical-spacing jazyka CSS 224
mosty karantén 31, 241 načítání obsahu 66 nejlepší postupy 40 protokol asfunction 28 šifrování dat 208
systém souborů 38
uživatelská oprávnění pro instalaci 23 uživatelská pověření 41
VÝVOJ APLIKACÍ ADOBE AIR 1.5 POMOCÍ PROGRAMU FLASH CS4 PROFESSIONAL 369 Rejstřík
window.open() 34 XMLHTTPRequest 221 značky img 28 Zabezpečení jazyka JavaScript 31 zabezpečení mezidoménové vyrovnávací paměti 28 zápis souborů 119 zásuvné moduly (v HTML) 212 zavírání aplikací 287 zavírání aplikací AIR 282 zavírání oken 59, 72, 287 zjednodušená okna 60 změna velikosti oken 50, 59, 75 značky img (v obsahu objektu TextField) 28 značky skriptu vlastnosti src 33 znak : (dvojtečka) v názvech parametru příkazu SQL 170 znak @ (at) v názvech parametru příkazu SQL 170 znak at (@), v názvech parametru příkazu SQL 170 znak dvojtečka (:) v názvech parametru příkazu SQL 170 zobrazení Viz obrazovky zobrazení oken 71 zpracování onclick 231 zpracování onmouseover 231 zvolené položky nabídky 88