Stáhnout PDF s nápovědou
Transkript
Vývoj aplikací ADOBE AIR 1.1 pomocí programu ADOBE FLASH CS4 PROFESSIONAL ® ® ® ™ © 2008 Adobe Systems Incorporated. Všechna práva vyhrazena. Copyright Vývoj aplikací Adobe® AIR™ 1.1 pomocí programu Adobe® Flash® CS4 Professional Pokud je tato příručka distribuovaná se softwarem, u kterého je zahrnuta i smlouva s koncovým uživatelem, je tato příručka, stejně jako v ní popisovaný software, poskytována na základě licence, a může být používána nebo kopírována pouze podle podmínek této licence. S výjimkami povolenými v takové licenci nesmí být žádná část této příručky reprodukována, ukládána ve vyhledávacím systému a přenášena v jakékoliv formě nebo jakýmikoliv prostředky, elektronickými, mechanickými, záznamovými nebo jinými, bez předchozího písemného povolení společnosti Adobe Systems Incorporated. Uvědomte si prosím, že obsah této příručky je chráněn copyrightem i v případě, že není distribuovaná se softwarem, u kterého je zahrnuta i licenční smlouva s koncovým uživatelem. Obsah této příručky slouží pouze pro informaci, může se měnit bez upozornění a nelze ho vykládat jako závazek společnosti Adobe Systems Incorporated. Společnost Adobe Systems Incorporated nepřebírá žádnou odpovědnost za chyby nebo nepřesnosti, které se v informačním obsahu této příručky mohou objevit. Uvědomte si prosím, že existující umělecká díla nebo obrazy, které byste chtěli zahrnout do svých projektů, mohou být chráněny copyrightem. Neautorizované začlenění takových materiálů do vaší nové práce může být porušením práv majitele copyrightu. Opatřete si prosím vyžadované povolení pro použití díla od majitele copyrightu. Všechny odkazy na názvy společností nebo jména osob ve vzorových předlohách jsou pouze pro demonstrační účely a nejsou zamýšleny jako odkaz na jakoukoliv skutečnou organizaci nebo osobu. Adobe, the Adobe logo, Acrobat, ActionScript, Adobe AIR, ColdFusion, Dreamweaver, Flash, Flex, Flex Builder, and Reader are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States and/or other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Apple, Macintosh, and Mac OS are trademarks of Apple Inc., registered in the United States and other countries. Java is a trademark or registered trademark of Sun Microsystems, Inc. in the United States and other countries. All other trademarks are the property of their respective owners. This product includes software developed by the Apache Software Foundation (http://www.apache.org/) MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and Thomson Multimedia (http://www.mp3licensing.com). Speech compression and decompression technology licensed from Nellymoser, Inc. (www.nellymoser.com) Video compression and decompression is powered by On2 TrueMotion video technology. © 1992-2005 On2 Technologies, Inc. All Rights Reserved. http://www.on2.com. This product includes software developed by the OpenSymphony Group (http://www.opensymphony.com/) This product contains either BSAFE and/or TIPEM software by RSA Security, Inc. Sorenson Spark™ video compression and decompression technology licensed from Sorenson Media, Inc. Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA. Notice to U.S. Government End Users. The Software and Documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of “Commercial Computer Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202, as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States. Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA. For U.S. Government End Users, Adobe agrees to comply with all applicable equal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402 of the Vietnam Era Veterans Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60, 60-250, and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall be incorporated by reference. iii Obsah Kapitola 1: Instalace prostředí Adobe AIR Systémové požadavky prostředí Adobe AIR Instalace prostředí Adobe AIR ............................................................................ 1 .......................................................................................... 2 Odinstalace prostředí Adobe AIR ....................................................................................... 2 Instalace a spuštění ukázkových aplikací AIR ............................................................................ 2 Kapitola 2: Instalace aktualizace Adobe AIR pro program Flash CS3 Požadavky na systém pro aktualizaci Adobe AIR pro program Flash CS3 Odinstalování aktualizace Adobe AIR pro program Flash CS3 Instalace aktualizace Adobe AIR pro program Flash CS3 Doplňky prostředí Adobe AIR pro program Flash CS3 ................................................. 4 ........................................................... 4 ................................................................ 5 ................................................................... 5 Kapitola 3: Úvod do aplikace Adobe AIR Kapitola 4: Vyhledávání zdrojů prostředí AIR Kapitola 5: Vytvoření první aplikace AIR v programu Flash CS3 nebo CS4 Vytvoření aplikace „Hello World“ v programu Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Testování aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Převod aplikace Flash na aplikaci Adobe AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Kapitola 6: Aktualizace Adobe AIR pro program Flash CS3 Professional Vytvoření souboru Adobe AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Nastavení publikování prostředí Adobe AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Náhled aplikace Adobe AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Ladění aplikace Adobe AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Vytváření souborů aplikace AIR a instalátoru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Vytvoření vlastního souboru deskriptoru aplikace Podepisování aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Kapitola 7: Zabezpečení aplikace AIR Základy zabezpečení aplikace AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Instalace a aktualizace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Karantény zabezpečení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Zabezpečení HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Skriptování mezi obsahem v různých doménách Zápis na disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Bezpečná práce s nedůvěryhodným obsahem Nejlepší postupy zabezpečení pro vývojáře Podepisování kódu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Kapitola 8: Nastavení vlastností aplikace AIR Struktura souboru deskriptoru aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Definování vlastností v souboru deskriptoru aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL iv Obsah Kapitola 9: Nové funkce v aplikaci Adobe AIR Nové třídy chodu programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Třídy chodu programu s novými funkcemi Třídy rámců pro monitorování služeb Kapitola 10: Práce s nativními okny Další informace o nativních oknech online Základní koncepce oken v aplikaci AIR Vytváření oken Správa oken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Poslouchání událostí oken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Zobrazení oken na celou obrazovku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Kapitola 11: Obrazovky Další online informace o obrazovkách Základní informace o obrazovkách Výčet obrazovek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Kontextové nabídky v HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Definování nativních nabídek deklarativním způsobem Zobrazení rozbalovacích nabídek Zpracování událostí nabídky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Příklad: Nabídka okna a aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Kapitola 13: Ikony na hlavním panelu Doplňující online informace o ikonách na hlavním panelu O ikonách na hlavním panelu Ikony doku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Ikony oznamovací oblasti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Ikony hlavního panelu a tlačítka okna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Kapitola 14: Práce se systémem souborů Další online informace o souborovém API aplikace AIR Základy souborů aplikace AIR Práce s objekty File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Získání informací o systému souborů Práce s adresáři Práce se soubory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Čtení a zápis souborů . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Kapitola 15: Přetažení Doplňující online informace o přetahování myší Základy přetažení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL v Obsah Podpora gesta tažení ven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Podpora gesta tažení dovnitř Přetažení HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Kapitola 16: Kopírování a vkládání Doplňující online informace o kopírování a vkládání Základy kopírování a vkládání . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Operace čtení a zápis se systémovou schránkou Kopírování a vkládání v HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Příkazy nabídky a stisknutí kláves pro kopírování a vkládání Schránka:formáty dat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Kapitola 17: Práce s bytovými poli Čtení a zapisování do objektu ByteArray Příklad ByteArray: Čtení souboru .zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Kapitola 18: Práce s lokálními databázemi SQL Další online dostupné informace o lokálních databázích SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 O lokálních databázích SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Vytváření a úpravy databáze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Manipulace s daty databází SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Použití synchronních a asynchronních operací databáze Strategie pro práci s databázemi SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Kapitola 19: Ukládání šifrovaných dat Kapitola 20: Prostředí HTML Přehled prostředí HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Rozšíření prostředí AIR a modulu Webkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Kapitola 21: Programování v jazycích HTML a JavaScript Popis třídy HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením Přístup ke třídám API aplikace AIR z jazyka JavaScript Popis URL v aplikaci AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Zpřístupňování objektů ActionScript pro JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Přístup k objektovému modelu dokumentu HTML a objektům JavaScript z jazyka ActionScript Vložení obsahu SWF do HTML . . . . . . . . . . . . . . . . . . . . . . . . 216 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Použití knihoven jazyka ActionScript na stránce HTML Převádění objektů Date a RegExp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Práce se seznamem stylů HTML z jazyka ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Vytváření křížových skriptů pro obsah v různých karanténách zabezpečení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Kapitola 22: Zpracování událostí týkajících se HTML Události HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Zpracování událostí DOM pomocí jazyka ActionScript Reagování na nezachycené výjimky JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 Zpracování událostí chodu programu pomocí jazyka JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL vi Obsah Kapitola 23: Skriptování kontejneru HTML Vlastnosti zobrazení objektů HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 Rolování obsahu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Přístup k seznamu historie HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Nastavení agenta uživatele použitého při načítání obsahu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Nastavení kódování znaků, které bude použito pro obsah HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Definování uživatelských rozhraní podobných prohlížeči pro obsah HTML. Vytváření podtříd třídy HTMLLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Kapitola 24: Přidávání obsahu PDF Zjišťování schopností PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Načítání obsahu PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Skriptování obsahu PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Známá omezení obsahu PDF v aplikaci AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Kapitola 25: Použití správy digitálních práv Další informace o správě digitálních práv online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Popis toku operací při zpracování zašifrovaných souborů FLV Změny ve třídě NetStream Použití třídy DRMStatusEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Použití třídy DRMAuthenticateEvent Použití třídy DRMErrorEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Kapitola 26: Možnosti spuštění a ukončení aplikací Vyvolání aplikací . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Zachycení argumentů příkazového řádku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Spuštění při přihlášení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Vyvolání z prohlížeče . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Ukončení aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Kapitola 27: Čtení nastavení aplikace Čtení souboru deskriptoru aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Získávání identifikátorů aplikace a vydavatele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Kapitola 28: Práce s runtime a informacemi operačního systému Správa asociací souboru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Získávání verze runtime a úrovně dočasné opravy. Zjišťování možností AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Sledování přítomnosti uživatele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Kapitola 29: Sledování připojení k síti Zjišťování změn síťového připojení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Základní informace o sledování služeb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Zjišťování připojení pomocí protokolu HTTP Zjišťování soketového připojení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL vii Obsah Kapitola 30: Požadavky URL a práce v síti Používání třídy URLRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Změny v třídě URLStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Otevření URL ve výchozím systémovém webovém prohlížeči . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Kapitola 31: Distribuce, Instalace a Spuštění aplikací AIR Instalace a spuštění aplikace AIR z pracovní plochy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Instalace a spuštění aplikací AIR z webové stránky Nasazení firmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Digitální podepisování souboru AIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Kapitola 32: Aktualizace aplikací AIR O aktualizaci aplikací . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Představení vlastního uživatelského rozhraní pro aktualizaci aplikace Stažení souboru AIR do počítače uživatele Zjištění, zda je aplikace spuštěná poprvé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Kapitola 33: Lokalizace aplikací AIR Úvod do lokalizace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Lokalizace názvu aplikace a popisu v instalačním programu aplikace Výběr lokální verze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Lokalizace obsahu Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Lokalizace obsahu HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Lokalizace data, času a měny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 Kapitola 34: Vytváření aplikace AIR pomocí nástrojů příkazového řádku Použití programu AIR Debug Launcher (ADL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 Zabalení instalačního souboru AIR pomocí programu AIR Developer Tool (ADT) Podepsání souboru AIR pro změnu certifikátu aplikace Vytvoření certifikátu s vlastním podpisem pomocí programu ADT Použití nástroje Apache Ant s nástroji sady SDK Rejstřík . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 1 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. Systémové požadavky prostředí Adobe AIR Systémové požadavky pro spouštění prostředí Adobe AIR jsou následující: • Pro základní aplikace Adobe AIR: Procesor Windows Macintosh Intel® Pentium® 1,0 GHz nebo rychlejší PowerPC® G3 1,0 GHz nebo rychlejší nebo Intel Core™ Duo 1,83 GHz nebo rychlejší Paměť 256 MB paměti RAM 256 MB paměti RAM Operační systém Windows 2000 Service Pack 4; Mac OS X 10.4.10 nebo 10.5.x (PowerPC); Windows XP SP2; Mac OS X 10.4.x nebo 10.5.x (Intel) Vista • Pro aplikace Adobe AIR využívající video v režimu celé obrazovky s hardwarovými změnami měřítka: Procesor Windows Macintosh Intel® Pentium® 2,0 GHz nebo rychlejší PowerPC® G4 1,8 GHz nebo rychlejší nebo Intel Core™ Duo 1,33 GHz nebo rychlejší Paměť 512 MB paměti RAM; 32 MB videopaměti RAM 256 MB paměti RAM; 32 MB videopaměti RAM Operační systém Windows 2000 Service Pack 4; Mac OS X v.10.4.10 nebo v.10.5 (Intel nebo PowerPC) Windows XP SP2; Vista POZNÁMKA: Kodek používaný pro zobrazení videa ve formátu H.264 vyžaduje procesor Intel VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 2 Instalace prostředí Adobe AIR Instalace prostředí Adobe AIR Podle následujících pokynů si stáhněte verzi prostředí AIR pro operační systémy Windows® nebo Mac OS X. 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. Odinstalace prostředí Adobe AIR Nainstalovaný modul runtime prostředí AIR můžete odinstalovat následujícími postupy. Odinstalace 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 Abyste mohli odinstalovat modul runtime, vyberte položku Adobe AIR. 4 Klepněte na tlačítko Změnit nebo odebrat. Odinstalace modulu runtime z počítače Macintosh • Poklepejte na položku Adobe AIR Uninstaller, která se nachází ve složce /Applications (Aplikace). 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 3 Instalace prostředí Adobe AIR 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/). Poznámka: V poznámkách k verzi prostředí AIR vyhledejte aktualizace těchto pokynů, které se nacházejí zde: http://www.adobe.com/go/learn_air_relnotes_cz. 4 Kapitola 2: Instalace aktualizace Adobe AIR pro program Flash CS3 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. 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 tuto aktualizaci odinstalujte. 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 5. Odinstalová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 odinstalujte. 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 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 5 Instalace aktualizace Adobe AIR pro program Flash CS3 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\External Libraries\FLAir.dll (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/Configuration/External Libraries/FLAir.bundle. 4 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. 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. Doplňky prostředí Adobe 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 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 6 Instalace aktualizace Adobe AIR pro program Flash CS3 (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 • Externí knihovna (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\en\Configuration\External Libraries (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/Configuration/External Libraries/ • Cílový konfigurační soubor (Systém Windows) [jednotka]:\Program Files\Adobe\Adobe Flash CS3\en\Configuration\Players\ (Počítače Mac) [jednotka]:/Applications/Adobe Flash CS3/Configuration/Players/ 7 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 Professional, Adobe® Flex™, HTML, JavaScript®, Ajax) při vytváření a implementaci aplikací RIA (Rich Internet Applications). 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 8 Ú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. 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 Umístění Programování v jazyce ActionScript 3.0 http://www.adobe.com/go/learn_fl_cs4_programmingAS3_en Referenční příručka jazyka ActionScript 3.0 a jeho komponent (zahrnuje prostředí AIR)( http://www.adobe.com/go/learn_flashcs4_langref_en Adobe AIR – stručné úvody pro aplikaci Flash http://www.adobe.com/go/learn_air_flash_qs_cz Používání aplikace Flash http://www.adobe.com/go/learn_fl_cs4_using_en Používání komponent jazyka ActionScript 3.0 http://www.adobe.com/go/learn_fl_cs4_as3components_en 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 v programu Flash CS3 nebo CS4 Toto téma nabízí rychlou a praktickou ukázku toho, jakým způsobem pracuje prostředí Adobe ® AIR™. Postupujte podle pokynů a vytvořte a zabalte jednoduchou aplikaci AIR „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 „Instalace aktualizace Adobe AIR pro program Flash CS3“ na stránce 4. Pokud používáte program Flash CS4, 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ékoli jiné aplikace Flash. 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“. 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"); 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 11 Vytvoření první aplikace AIR v programu Flash CS3 nebo CS4 4 Chcete-li v programu Flash CS3 otevřít dialogové okno AIR – Nastavení aplikace a instalátoru, vyberte příkaz 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 12 Vytvoření první aplikace AIR v programu Flash CS3 nebo CS4 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 nejdříve 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 aplikace Flash na aplikaci Adobe AIR Můžete také převést existující aplikaci Flash na aplikaci AIR. Informace o tom, jak tuto akci provést v programu Flash CS3, najdete 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 „Nové funkce v aplikaci Adobe AIR“ na stránce 50. 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 Flash 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é dialogové okno, 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.1 POMOCÍ PROGRAMU ADOBE 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 Flash. • Otevřete nový soubor Flash 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 Flash 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é dialogové okno 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.1 POMOCÍ PROGRAMU ADOBE 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.1 POMOCÍ PROGRAMU ADOBE 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.název_aplikace. 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.1 POMOCÍ PROGRAMU ADOBE 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ů, se kterými bude aplikace AIR pracovat. 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.1 POMOCÍ PROGRAMU ADOBE 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 291. 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.1 POMOCÍ PROGRAMU ADOBE 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 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.1 POMOCÍ PROGRAMU ADOBE 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 42. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE 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 285. 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.1 POMOCÍ PROGRAMU ADOBE 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 285. 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 Files\Common Files\Adobe AI 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ému Windows musí mít uživatel práva správce. 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 276. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 24 Zabezpečení aplikace AIR 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 276 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 Files\ • Windows Vista: ~/Apps/ Pokud vývojář specifikuje nastavení installFolder v propisovacím souboru aplikace, aplikace se nainstaluje do podřízené cesty tohoto adresáře. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 25 Zabezpečení aplikace AIR 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. • 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). • 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: • Mac OS: adresář pro uložení dat aplikace je <appData>/<appId>/Local Store/, kde <appData> je „složka předvoleb“ uživatele, typicky /Users/<user>/Library/Preferences • Windows: adresář pro uložení dat aplikace je <appData>\<appId>\Local Store\ , kde <appData> je „Speciální složka“ uživatele CSIDL_APPDATA, typicky C:\Documents and Settings\<userName>\Application Data 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 98. 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. 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 43. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 26 Zabezpečení aplikace AIR 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 285). 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“. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 27 Zabezpečení aplikace AIR 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 aplikace Soubor je umístěn v aplikačním adresáři a pracuje s úplnou sadou oprávnění AIR. vzdáleně 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.) lokální-důvěryhodné 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. lokální-se-sítí 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. lokální-se-systémem souborů 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 také kapitola „Zabezpečení aplikace Flash Player“ v Programování jazyka ActionScript 3.0 (http://www.adobe.com/go/flashCS3_progAS3_security_cz) a Dokument zabezpečení Flash Player 9 (http://www.adobe.com/go/fp9_0_security_cz). 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 272). 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ů. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 28 Zabezpečení aplikace AIR 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). 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 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í lokální-se-systémem soubor , lokální-se-sítí nebo 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 34. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 29 Zabezpečení aplikace AIR • Existují omezení volání metody window.open() jazyka JavaScript. Podrobnosti viz také „Omezení pro volání metody JavaScript window.open()“ na stránce 33. 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 26) 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 208. 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.) HTML si v aplikaci AIR uchovává svou normální, rozmazanou čáru mezi spustitelným kódem a daty. V důsledku toho aplikace AIR vloží obsah do horního snímku prostředí HTML do karantény zabezpečení aplikace a omezuje jakékoliv operace, například eval(), které mohou převést řetězec textu do spustitelného objektu. Toto omezení je vynuceno i v případě, že aplikace nenačte vzdálený obsah. Chcete-li pracovat zabezpečeným způsobem se vzdáleným obsahem HTML v aplikaci AIR, musíte použít snímky nebo snímky iframes. I když nenačtete vzdálený obsah, může být pohodlnější spustit obsah v závislém snímku v karanténě zabezpečení, aby tak obsah mohl být spouštěn bez omezení v eval(). (Uzavření do karantény zabezpečení může být nutné v případě, že používáte aplikační struktury JavaScript.) Ú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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 30 Zabezpečení aplikace AIR 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/"> </iframe> 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 „závislý objekt", 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 31 Zabezpečení aplikace AIR 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.“ Další informace viz také „Zamezení vzniku chyb jazyka JavaScript souvisejících se zabezpečením“ na stránce 208. 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. • Výrazy zahrnující literály jsou povoleny Například: eval("null"); eval("3 + .14"); eval("'foo'"); • 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 32 Zabezpečení aplikace AIR [ 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ě. 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 28 a „Skriptování mezi aplikačním a neaplikačním obsahem“ na stránce 38. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 33 Zabezpečení aplikace AIR 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 38. 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. 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:/"> </iframe> Další informace viz „Skriptování mezi obsahem v různých doménách“ na stránce 34. 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, frame, 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 34 Zabezpečení aplikace AIR 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 26 ), 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 208. 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í aplikace (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(). Zavolání této metody z karantény zabezpečení aplikace nemá žádný účinek. • 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 35 Zabezpečení aplikace AIR 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. 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: <?xml version="1.0" encoding="utf-8"?> <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:Script> <mx:UIComponent id="container" /> </mx:WindowedApplication> VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 36 Zabezpečení aplikace AIR 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: 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()); } } } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 37 Zabezpečení aplikace AIR 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 222. 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 221 „Karanténa zabezpečení aplikace“ na stránce 27 „Oprávnění obsahu v neaplikačních karanténách zabezpečení“ na stránce 28 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 39. 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í. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 38 Zabezpečení aplikace AIR 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í. 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 <appData>/<appId>/Local Store/, kde <appData> je složka předvoleb uživatele. To je typicky adresář /Users/<user>/Library/Preferences • Windows: adresář pro uložení dat aplikace je <appData>\<appId>\Local Store\, kde <appData> je speciální složka CSIDL_APPDATA uživatele. To je typicky adresář C:\Documents and Settings\<userName>\Application Data 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 39. 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 9 omezuje přístup ke skriptování pro nedůvěryhodný obsah. Například v aplikaci Flash Player v prohlížeči, když soubor SWF přidělený k lokální-d v ryhodné karanténě zabezpečení zavolá metodu System.allowDomain(), skriptovací přístup je zajištěn všem souborům SWF načteným ze specifikované domény, s opakovaným přiřazením tohoto vzdáleného souboru ze vzdálené karantény zabezpečení do lokální-d v ryhodné karantény zabezpečení . Analogický přístup není z obsahu aplikacev 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 39 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 34. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 40 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. Vývojářům se doporučuje zvážit následující: • Pokud musí být pověření uložena lokálně, doporučuje se zašifrovat pověření při zápisu do lokálního systému souborů. 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 190. • 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í, 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 43. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 41 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 285 a „Vytváření aplikace AIR pomocí nástrojů příkazového řádku“ na stránce 305. 42 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í programu Adobe® AIR™ Aktualizace pro Adobe® Flash® CS3 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 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: <?xml version="1.0" encoding="utf-8" ?> <application xmlns="http://ns.adobe.com/air/application/1.1"> <id>com.example.HelloWorld</id> <version>2.0</version> <filename>Hello World</filename> <name>Example Co. AIR Hello World</name> <description> <text xml:lang="en">This is a example.</text> <text xml:lang="fr">C'est un exemple.</text> <text xml:lang="es">Esto es un ejemplo.</text> </description> <copyright>Copyright (c) 2006 Example Co.</copyright> <initialWindow> <title>Hello World</title> <content> HelloWorld-debug.swf </content> <systemChrome>none</systemChrome> <transparent>true</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>false</maximizable> <resizable>false</resizable> <width>640</width> <height>480</height> <minSize>320 240</minSize> <maxSize>1280 960</maxSize> </initialWindow> <installFolder>Example Co/Hello World</installFolder> <programMenuFolder>Example Co</programMenuFolder> VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 43 Nastavení vlastností aplikace AIR <icon> <image16x16>icons/smallIcon.png</image16x16> <image32x32>icons/mediumIcon.png</image32x32> <image48x48>icons/bigIcon.png</image48x48> <image128x128>icons/biggestIcon.png</image128x128> </icon> <customUpdateUI>true</customUpdateUI> <allowBrowserInvocation>false</allowBrowserInvocation> <fileTypes> <fileType> <name>adobe.VideoFile</name> <extension>avf</extension> <description>Adobe Video File</description> <contentType>application/vnd.adobe.video-file</contentType> <icon> <image16x16>icons/avfIcon_16.png</image16x16> <image32x32>icons/avfIcon_32.png</image32x32> <image48x48>icons/avfIcon_48.png</image48x48> <image128x128>icons/avfIcon_128.png</image128x128> </icon> </fileType> </fileTypes> </application> Definování vlastností v souboru deskriptoru aplikace Ve svých kořenech obsahuje soubor deskriptoru aplikace vlastnost application, která má několik atributů: <application version="1.0" xmlns="http://ns.adobe.com/air/application/1.1"> 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). Poslední segment jmenného prostoru, například „1.0“, určuje verzi runtime vyžadovanou aplikací. minimumPatchLevel Volitelné. Použijte atribut minimumPatchLevel pro určení minimální úrovně záplaty Adobe AIR vyžadované aplikací. Aplikace AIR obvykle určují požadované verze aplikace AIR jednoduchým definováním jmenného prostoru v souboru deskriptoru aplikace. Jmenný prostor se změní pro každou hlavní verzi AIR (například 1.0 nebo 1.1). Jmenný prostor se nemění pro verzi záplaty. Verze záplaty obsahuje pouze omezenou sadu oprav a žádné změny rozhraní API. Aplikace obvykle neurčují, které verze záplaty vyžadují. Nicméně oprava ve verzi záplaty může opravit problém v aplikaci. V této situaci může aplikace určit hodnotu pro atributminimumPatchLevel a zajistit, že je záplata použita před nainstalováním aplikace. Je-li to nezbytné, požádá Instalátor aplikace AIR uživatele o stažení a instalaci vyžadované verze záplaty. Následující příklad ukazuje element aplikace, který určuje hodnotu pro atribut minimumPatchLevel: <application version="1.0" xmlns="http://ns.adobe.com/air/application/1.1" minimumPatchLevel="5331"> Definice základních informací aplikace Následující elementy definují ID aplikace, verzi, název, název souboru, popis a informace o autorských právech: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 44 Nastavení vlastností aplikace AIR <id>com.example.samples.TestApp</id> <version>2.0</version> <filename>TestApp</filename> <name> <text xml:lang="en">Hello AIR</text> <text xml:lang="fr">Bonjour AIR</text> <text xml:lang="es">Hola AIR</text> </name> <description>An MP3 player.</description> <copyright>Copyright (c) 2008 YourCompany, Inc.</copyright> id Řetězec identifikátoru jedinečný pro danou aplikaci, který je znám jako ID aplikace. Hodnota atributu je omezena na následující znaky: • 0–9 • a–z • A–Z • . (tečka) • - (pomlčka) Hodnota musí obsahovat 1 až 212 znaků. Tento element je vyžadován. Řetězec id obvykle používá hierarchii oddělenou tečkou v zarovnání s obrácenou adresou domény DNS, názvem balíku nebo třídy jazyka Java™ nebo univerzálním identifikátorem typu pro OS Mac ® X. Formulář podobný DNS není použit a AIR nevytvoří žádné asociace mezi názvem a vlastními doménami DNS. version Určuje informaci o verzi aplikace. (Nemá souvislost s verzí runtime). Řetězec verze je aplikací definovaný oddělovač. AIR řetězec žádným způsobem neinterpretuje. Proto se nepředpokládá, že verze „3.0“ je aktuálnější než verze „2.0“. Příklady: „1.0", „.4", „0.5“, „4.9", „1.3.4a". Tento element je vyžadován. filename Řetězec, který bude použit jako název souboru aplikace (bez přípony) při její instalaci. Soubor aplikace spustí aplikaci AIR v době běhu. Jestliže není k dispozici žádná hodnota name, použije se tedy také název složky instalace filename. Tento element je vyžadován. Vlastnost filename může obsahovat jakýkoliv znak Unicode (UTF-8), s výjimkou následujících, které nemohou být v různých systémech použity jako názvy souborů: Znak Hexadecimální kód různé 0x00 – x1F * x2A “ x22 : x3A > x3C < x3E ? x3F \ x5C | x7C Hodnota filename nemůže skončit v období. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 45 Nastavení vlastností aplikace AIR name (Volitelné, ale doporučeno) Titul zobrazený instalátorem aplikace AIR. Jestliže určíte jediný textový uzel (namísto více elementůtextu), používá instalátor aplikace AIR tento název, a to bez ohledu na jazyk systému: <name>Test Application</name> Schéma deskriptoru aplikace AIR 1.0 umožňuje pouze jeden jednoduchý textový uzel, který bude pro název definován (nikoliv více elementů textu). V programu AIR 1.1 můžete v elementu název určit více jazyků. Například následující určuje název ve třech jazycích (angličtina, francouzština a španělština): <name> <text xml:lang="en">Hello AIR</text> <text xml:lang="fr">Bonjour AIR</text> <text xml:lang="es">Hola AIR</text> </name> Atribut xml:lang pro každý textový element určuje jazykový kód, dle definice v RFC4646 (http://www.ietf.org/rfc/rfc4646.txt). Instalátor aplikace AIR používá název, který nejvíce odpovídá jazyku uživatelskému rozhranní operačního systému uživatele. Vezměte například v úvahu instalaci, kde element názvu souboru deskriptoru aplikace zahrnuje hodnotu pro místní nastavení „en“ (angličtina). Instalátor aplikace AIR používá název „en“, jestliže operační systém identifikuje „en“ (angličtina) jako jazyk uživatelského rozhraní. Název „en“ také používá, jestliže jazyk uživatelského systému jazyka je en-US (Americká angličtina). Nicméně pokud je rozhraní uživatelského jazyka en-US a soubor deskriptoru aplikace definuje název en-US i en-GB, poté instalátor aplikace AIR používá hodnotu en-US. Jestliže aplikace nedefinuje žádný název, který odpovídá jazykům uživatelského rozhraní systému, používá instalátor aplikace AIR první hodnotu name definovanou v souboru deskriptoru aplikace. Jestliže není určen žádný element name, instalátor aplikace AIR zobrazí filename jako název aplikace. Element name definuje pouze titul aplikace použitý v instalátoru aplikace AIR. Instalátor aplikace AIR 1.1 podporuje více jazyků: tradiční čínštinu, zjednodušenou čínština, angličtinu, francouzštinu, němčinu, italštinu, japonštinu, korejštinu, brazilskou portugalštinu, ruštinu a španělštinu. Instalátor aplikace AIR zvolí svůj zobrazený jazyk (pro jiný text než titul a popis aplikace) na základě jazyka uživatelského rozhraní systému. Tento výběr jazyka nezávisí na nastavení v souboru deskriptoru aplikace. Element name nedefinuje místní nastavení dostupné pro spuštěnou a nainstalovanou aplikaci. Podrobnosti o vyvíjení aplikací s více jazyky naleznete v tématu „Lokalizace aplikací AIR“ na stránce 295. description (Volitelné) Popis aplikace zobrazený v instalátoru aplikace AIR. Jestliže určíte jediný textový uzel (nikoliv více elementů textu), používá instalátor aplikace AIR tento popis, a to bez ohledu na jazyk systému: <description>This is a sample AIR application.</description> Schéma deskriptoru aplikace AIR 1.0 umožňuje pouze jeden jednoduchý textový uzel, který bude pro název definován (nikoliv více elementů textu). V programu AIR 1.1 můžete v elementu description určit více jazyků. Například následující určuje popis ve třech jazycích (angličtina, francouzština a španělština): VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 46 Nastavení vlastností aplikace AIR <description> <text xml:lang="en">This is a example.</text> <text xml:lang="fr">C'est un exemple.</text> <text xml:lang="es">Esto es un ejemplo.</text> </description> Atribut xml:lang pro každý textový element určuje jazykový kód, dle definice v RFC4646 (http://www.ietf.org/rfc/rfc4646.txt). Instalátor aplikace AIR používá popis, který nejvíce odpovídá jazyku uživatelskému rozhranní operačního systému uživatele. Vezměte například v úvahu instalaci, kde element description souboru deskriptoru aplikace zahrnuje hodnotu pro místní nastavení „en“ (angličtina). Instalátor aplikace AIR používá název „en“, jestliže operační systém identifikuje „en“ (angličtina) jako jazyk uživatelského rozhraní. Název „en“ také používá, jestliže jazyk uživatelského systému jazyka je en-US (Americká angličtina). Nicméně pokud je rozhraní uživatelského jazyka en-US a soubor deskriptoru aplikace definuje název en-US i en-GB, poté instalátor aplikace AIR používá hodnotu en-US. Jestliže aplikace nedefinuje žádný název, který odpovídá jazyku uživatelského rozhraní systému, používá instalátor aplikace AIR první hodnotu description definovanou v souboru deskriptoru aplikace. Více informací o vyvíjení aplikací s více jazyky naleznete v tématu „Lokalizace aplikací AIR“ na stránce 295. copyright (Volitelné) Informace o autorských právech pro aplikaci AIR. V OS Mac se text autorských práv pro nainstalovanou aplikaci zobrazí v dialogovém okně Adobe. V OS Mac je informace o autorských právech také použita v poli NSHumanReadableCopyright v souboru Info.plist aplikace. Definice složky instalace a složky nabídky programu Složky instalace a nabídky programu jsou definovány následujícím nastavením vlastností: <installFolder>Acme</installFolder> <programMenuFolder>Acme/Applications</programMenuFolder> installFolder (Volitelné) Určuje podadresář výchozího adresáře aplikace. V OS Windows je výchozím podadresářem instalace adresář Program Files. V OS Mac se jedná o adresář /Applications. Například jestliže je vlastnost installFolder nastavena na „Acme" a aplikace je pojmenována„ExampleApp", poté je aplikace instalována do umístění C:\Program Files\Acme\ExampleApp v OS Windows a do /Applications/Acme/Example.app v OS Mac. Použijte znak lomítka (/) jako znak oddělovače adresáře, jestliže si přejete určit vnořený podadresář, viz následující příklad: <installFolder>Acme/Power Tools</installFolder> Vlastnost installFolder může obsahovat znak Unicode (UTF-8) s výjimkou těch, které nesmí být v různých systémech použity jako názvy složek (viz vlastnost filename výše pro seznam výjimek). Vlastnost installFolder je volitelná. Jestliže neurčíte žádnou vlastnost installFolder, je aplikace nainstalovaná do podadresáře výchozího adresáře instalace, na základě vlastnosti name. programMenuFolder (Volitelné) Určuje lokaci, kam budou umístěny zkratky aplikace v nabídce Všechny programy operačního systému Windows. (Toto nastavení je aktuálně v jiných operačních systémech ignorováno.) Omezení pro znaky, které jsou povoleny v hodnotě vlastnosti, jsou stejná jako omezení pro vlastnost installFolder. Znak lomítka (/) nepoužívejte jako poslední znak této hodnoty. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 47 Nastavení vlastností aplikace AIR Definice vlastností úvodního okna aplikace Při načtení aplikace AIR používá runtime hodnoty v elementu initialWindow pro vytvoření úvodního okna pro danou aplikaci. Runtime poté načte soubor SWF nebo HTML určený v elementu content do okna. Zde je příklad elementu initialWindow: <initialWindow> <content>AIRTunes.swf</content> <title>AIR Tunes</title> <systemChrome>none</systemChrome> <transparent>true</transparent> <visible>true</visible> <minimizable>true</minimizable> <maximizable>true</maximizable> <resizable>true</resizable> <width>400</width> <height>600</height> <x>150</x> <y>150</y> <minSize>300 300</minSize> <maxSize>800 800</maxSize> </initialWindow> Podřazené elementy elementuinitialWindow nastavují vlastnosti okna, do kterého je kořenový soubor obsahu načten. content Hodnota určená pro elementcontent je adresou URL pro hlavní obsahový soubor aplikace. Může se jednat buď o soubor SWF nebo soubor HTML. URL je určena relativně ke kořeni instalační složky aplikace. (Při spuštění aplikace AIR s programem ADL je URL relativní ke složce obsahující soubor deskriptoru aplikace. Parametr rootdir programu ADL můžete použít pro určení odlišného kořenového adresáře.) Poznámka: Vzhledem k tomu, že hodnota elementu obsahu je zpracovávána jako URL, musí být znaky v názvu obsahového souboru kódovány dle URL podle pravidel definovaných v RFC 1738. Znaky mezer musí být například kódovány jako %20. title (Volitelný) Titul okna. systemChrome (Volitelné) Jestliže tento atribut nastavíte na hodnotu standard, zobrazí se standardní systémový chróm dodaný s operačním systémem. Jestliže atribut nastavíte na none, nezobrazí se žádný systémový chróm. Nastavení systémového chrómu nelze provést za běhu. transparent (Volitelné) Nastavte na „true", jestliže si přejete, aby okno aplikace podporovalo prolínání alfa. Okno s průhledností se může vykreslovat pomaleji a vyžadovat více paměti. Nastavení průhlednosti nelze provést za běhu. Důležité: Atribut transparent můžete pouze nastavit na hodnotu true, pokud je systemChrome nastaveno na hodnotu none. visible (Volitelné) Nastavte na hodnotu true, jestliže si přejete, aby bylo hlavní okno ihned po otevření viditelné. Výchozí hodnota je false. Zpočátku si můžete přát ponechat hlavní okno skryté, takže změny polohy okna, velikosti okna a rozvržení jeho obsahu se nezobrazí. Poté můžete okno zobrazit voláním metody okna activate() nebo nastavením vlastnosti visible na hodnotu true. Podrobnosti naleznete v tématu „Práce s nativními okny“ na stránce 54. x, y, width, height (Volitelné) Počáteční ohraničení hlavního okna aplikace. Jestliže tyto hodnoty nenastavíte, bude velikost okna určena nastavením v kořenovém souboru SWF nebo, v případě HTML, operačním systémem. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 48 Nastavení vlastností aplikace AIR minSize, maxSize (Volitelné) Minimální a maximální velikost okna. Jestliže tyto hodnoty nenastavíte, budou určeny operačním systémem. minimizable, maximizable, resizable (Volitelné) Určuje, zda lze okno minimalizovat, maximalizovat a změnit jeho velikost. Tato nastavení mají implicitně hodnotu true. Poznámka: V operačním systému, například OS Mac X, kde je maximalizace oken operací změny velikosti, musí být elementy maximalizace i změny velikosti nastaveny na hodnotu false, aby se zabránilo zvětšení nebo změně velikosti okna. Určení souborů ikon Vlastnost icon určuje jeden nebo více souborů ikon, které budou pro aplikaci použity. Zahrnutí ikony je volitelné. Jestliže neurčíte vlastnosticon, zobrazí operační systém výchozí ikonu. Určená cesta je relativní ke kořenovému adresáři aplikace. Soubory ikon musí být ve formátu PNG. Můžete určit všechny z následujících velikostí ikon: <icon> <image16x16>icons/smallIcon.png</image16x16> <image32x32>icons/mediumIcon.png</image32x32> <image48x48>icons/bigIcon.png</image48x48> <image128x128>icons/biggestIcon.png</image128x128> </icon> Jestliže je přítomen element pro danou velikost, musí mít obraz v souboru přesnou velikost odpovídající zadané velikosti. Jestliže nejsou poskytnuty všechny velikosti, změní se nejbližší velikost tak, aby odpovídala danému použití ikony operačním systémem. Poznámka: Určené ikony nejsou automaticky přidány do balíku AIR. Soubory ikon musí být při zabalení aplikace obsaženy ve svých příslušných relativních umístěních. Pro dosažení nejlepších výsledků poskytněte pro každou z dostupných velikostí obraz. Mimo to se ujistěte, že ikony vypadají reprezentativně v 16- i 32-bitových barevných režimech. Poskytnutí zákaznického uživatelského rozhraní pro aktualizace aplikace AIR nainstaluje a aktualizuje aplikace pomocí výchozích dialogových oken instalace. Pro aktualizaci aplikace můžete nicméně poskytnout své vlastní uživatelské rozhraní. Pro určení, zda by vaše aplikace měla zpracovat proces aktualizace sama, nastavte element customUpdateUI na hodnotu true: <customUpdateUI>true</customUpdateUI> Jestliže má nainstalovaná verze vaší aplikace element customUpdateUI nastavený na hodnotu true a uživatel poklepe na soubor AIR pro novou verzi nebo nainstaluje aktualizaci aplikace pomocí funkce hladké instalace, otevře runtime nainstalovanou verzi aplikace spíše než výchozí instalátor aplikace AIR. Logika vaší aplikace může poté určit, jak s operací aktualizace pokračovat. (ID aplikace a ID vydavatele v souboru AIR musí odpovídat ID v nainstalované aplikaci, aby mohla aktualizace pokračovat.) Poznámka: Mechanismus customUpdateUI je k dispozici pouze tehdy, když je aplikace již nainstalována a uživatel poklepe na instalační soubor AIR obsahující aktualizace nebo nainstaluje aktualizaci aplikace pomocí funkce hladké instalace. Aktualizaci můžete stáhnout a spustit pomocí logiky své vlastní aplikace, která dle potřeby zobrazí vaše uživatelské UI, ať je customUpdateUI nastaveno na hodnotu true nebo nikoliv. Více informací naleznete v tématu „Aktualizace aplikací AIR“ na stránce 291. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 49 Nastavení vlastností aplikace AIR Povolení vyvolání prohlížeče aplikace Jestliže určíte následující nastavení, lze nainstalovanou aplikaci AIR spustit prostřednictvím funkce vyvolání prohlížeče (když uživatel klepne na odkaz na stránce ve webovém prohlížeči): <allowBrowserInvocation>true</allowBrowserInvocation> Výchozí hodnota je false. Jestliže tuto hodnotu nastavíte na true, určitě vezměte v úvahu dopady na zabezpečení popsané v tématu „Vyvolání z prohlížeče“ na stránce 262. Více informací naleznete v části „Instalace a spuštění aplikací AIR z webové stránky“ na stránce 277. Deklarace asociací typů souborů Element fileTypes vám umožňuje deklarovat typy souborů, se kterými lze aplikaci AIR asociovat. Při nainstalování aplikace AIR je v operačním systému zaregistrován jakýkoliv deklarovaný typ souboru, a jestliže tyto typy souborů ještě nejsou asociovány s jinou aplikací, jsou asociovány s aplikací AIR. Pro potlačení stávající asociace mezi typem souboru a jinou aplikací použijte metodu NativeApplication.setAsDefaultApplication() v době běhu (nejlépe se svolením uživatele). Poznámka: Metody runtime mohou pouze spravovat asociace pro typy souborů deklarované v deskriptoru aplikace. <fileTypes> <fileType> <name>adobe.VideoFile</name> <extension>avf</extension> <description>Adobe Video File</description> <contentType>application/vnd.adobe.video-file</contentType> <icon> <image16x16>icons/AIRApp_16.png</image16x16> <image32x32>icons/AIRApp_32.png</image32x32> <image48x48>icons/AIRApp_48.png</image48x48> <image128x128>icons/AIRApp_128.png</image128x128> </icon> </fileType> </fileTypes> Element fileTypes je volitelný. Je-li přítomen, může obsahovat jakýkoliv počet elementů fileType. Elementy name a extension jsou vyžadovány pro každou deklaraci fileType, kterou zahrnete. Stejný název lze použít pro více přípon. Přípona jedinečným způsobem identifikuje typ souboru. (Všimněte si, že přípona je určena bez předcházejí doby.) Element description je volitelný a je uživateli zobrazen prostřednictvím uživatelského rozhraní operačního systému. Vlastnost contentType je také volitelná, ale pomáhá operačnímu systému vyhledat nejlepší aplikaci, která soubor za určitých podmínek otevře. Tato hodnota by měla být typem MIME obsahu souboru. Pro danou příponu souboru lze určit ikony, a to pomocí stejného formátu jako pro element ikony aplikace. Soubory ikon musí být také obsaženy v instalačním souboru AIR (nejsou zabaleny automaticky). Když je typ souboru asociovaný s aplikací AIR, bude aplikace vyvolána, kdykoliv uživatel otevře soubor daného typu. Jestliže je aplikace již spuštěna, AIR automaticky odešle objekt InvokeEvent ke spuštěné instanci. V opačném případě AIR nejprve spustí aplikaci. V obou případech lze cestu k souboru načíst z objektu InvokeEvent odeslaného objektem NativeApplication. Tuto cestu můžete použít k otevření souboru. Více informací naleznete v tématu „Správa asociací souboru“ na stránce 267 a „Zachycení argumentů příkazového řádku“ na stránce 260. 50 Kapitola 9: Nové funkce v aplikaci Adobe AIR Toto téma poskytuje přehled nových funkcí v aplikaci Adobe® AIR™, které nejsou dostupné pro obsah SWF běžící v přehrávači Adobe® Flash®. Nové třídy chodu programu Následující třídy chodu programu jsou v aplikaci Adobe AIR nové. Tyto třídy nejsou dostupné pro obsah SWF běžící v prohlížeči: Třída Balíček BrowserInvokeEvent flash.events Clipboard flash.desktop ClipboardFormats flash.desktop ClipboardTransferMode flash.desktop CompressionAlgorithm flash.utils DockIcon flash.desktop DRMAuthenticateEvent flash.events DRMErrorEvent flash.events DRMStatusEvent flash.events EncryptedLocalStore flash.data File flash.filesystem FileListEvent flash.events FileMode flash.filesystem FileStream flash.filesystem FocusDirection flash.display HTMLHistoryItem flash.html HTMLHost flash.html HTMLLoader flash.html HTMLPDFCapability flash.html HTMLUncaughtScriptExceptionEvent flash.events HTMLWindowCreateOptions flash.html Icon flash.desktop InteractiveIcon flash.desktop VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 51 Nové funkce v aplikaci Adobe AIR Třída Balíček InvokeEvent flash.events NativeApplication flash.desktop NativeDragActions flash.desktop NativeDragEvent flash.events NativeDragManager flash.desktop NativeDragOptions flash.desktop NativeMenu flash.display NativeMenuItem flash.display NativeWindow flash.display NativeWindowBoundsEvent flash.events NativeWindowDisplayState flash.display NativeWindowDisplayStateEvent flash.events NativeWindowInitOptions flash.display NativeWindowResize flash.display NativeWindowSystemChrome flash.display NativeWindowType flash.display NotificationType flash.desktop OutputProgressEvent flash.events RevocationCheckSettings flash.security Screen flash.display ScreenMouseEvent flash.events SignatureStatus flash.security SignerTrustSettings flash.security SQLCollationType flash.data SQLColumnNameStyle flash.data SQLColumnSchema flash.data SQLConnection flash.data SQLError flash.errors SQLErrorEvent flash.events SQLErrorOperation flash.errors SQLEvent flash.events SQLIndexSchema flash.data SQLResult flash.data SQLSchema flash.data VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 52 Nové funkce v aplikaci Adobe AIR Třída Balíček SQLSchemaResult flash.data SQLStatement flash.data SQLTableSchema flash.data SQLTransactionLockType flash.data SQLTriggerSchema flash.data SQLUpdateEvent flash.events SQLViewSchema flash.data SystemTrayIcon flash.desktop Updater flash.desktop URLRequestDefaults flash.net XMLSignatureValidator flash.utils Balíček flash.security zahrnuje rozhraní IURIDereferencer. Třídy chodu programu s novými funkcemi Následující třídy jsou dostupné pro obsah SWF běžící v prohlížeči, ale aplikace AIR poskytuje ještě další vlastnosti nebo metody: Třída Vlastnost nebo Metoda Capabilities jazyky Event DISPLAYING EXITING HTML_BOUNDS_CHANGE HTML_DOM_INITIALIZE HTML_RENDER LOCATION_CHANGE NETWORK_CHANGE USER_IDLE USER_PRESENT FileReference uploadUnencoded() HTTPStatusEvent HTTP_RESPONSE_STATUS responseURL responseHeaders KeyboardEvent commandKey controlKey LoaderContext allowLoadBytesCodeExecution VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 53 Nové funkce v aplikaci Adobe AIR Třída Vlastnost nebo Metoda LoaderInfo parentSandboxBridge childSandboxBridge NetStream resetDRMVouchers() setDRMAuthenticationCredentials() URLRequest followRedirects manageCookies shouldAuthenticate shouldCacheResponse userAgent userCache setLoginCredentials() URLStream událost httpResponseStatus Stage nativeWindow Security APPLICATION Většina z těchto nových vlastností a metod je dostupných pouze pro obsah v karanténě zabezpečení aplikace AIR. Avšak nové položky v třídě URLRequest jsou dostupné také pro obsah běžící v jiných karanténách. Metody ByteArray.compress() a ByteArray.uncompress() zahrnují nový parametr algorithm, který umožňuje volbu mezi komprimačním algoritmem deflate a zlib. Třídy rámců pro monitorování služeb Balíček air.net obsahuje třídy pro detekci sítě. Tento balíček je dostupný pouze pro obsah běžící v aplikaci Adobe AIR. Balíček je součástí souboru ServiceMonitor.swc. Balíček obsahuje následující třídy: • ServiceMonitor • SocketMonitor • URLMonitor 54 Kapitola 10: Práce s nativními okny Třídy, které jsou k dispozici v rozhraní API pro nativní okna aplikace Adobe® AIR®, slouží k vytváření a řízení oken pracovní plochy. Další informace o nativních oknech online Více informací týkajících se nativních oken rozhraní API pro nativní okna a práce s nativními okny naleznete v následujících zdrojích: Rychlé úvody (Adobe AIR Developer Connection) • Interaktivní práce s oknem • Přizpůsobení vzhledu a stylu nativního okna • Vytváření vysunovacích oken • Řízení pořadí zobrazení oken • Vytváření nepravoúhlých oken s měnitelnou velikostí Referenční příručka jazyka • NativeWindow • NativeWindowInitOptions Články a ukázky aplikace Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (hledat „AIR windows“) Základní koncepce oken v aplikaci AIR Aplikace AIR poskytuje rozhraní API pro okna, které je snadno použitelné nezávisle na platformě a slouží pro vytváření nativních oken operačního systému pomocí programovacích metod aplikací Flash®, Flex™ a jazyka HTML. Aplikace AIR zajišťuje velkou volnost při vývoji vzhledu aplikace. Vytvořená okna mohou vypadat jako standardní aplikace, která při použití v systému Mac odpovídá stylu společnosti Apple a při použití v systému Windows vyhovuje konvencím společnosti Microsoft. Nebo lze použít rozšiřitelné systémové prvky umožňující změnu vzhledu, které jsou k dispozici v technologii Flex, a vytvořit si vlastní styl bez ohledu na to, kde je aplikace spuštěna. Můžete dokonce kreslit vlastní okna pomocí vektorové a bitmapové grafiky s plnou podporou průhlednosti a prolínání alfa s pracovní plochou. Už vás unavují pravoúhlá okna? Nakreslete si kulaté. Okna v aplikaci AIR Aplikace AIR podporuje tři různá rozhraní API pro práci s okny: třídu NativeWindow zaměřenou na jazyk ActionScript, třídy mx:WindowedApplication a mx:Window technologie Flex (které „sdružují“ třídu NativeWindow) a, v prostředí HTML, třídu Window jazyka JavaScript. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 55 Práce s nativními okny okna v jazyce ActionScript Při vytváření oken pomocí třídy NativeWindow můžete přímo použít plochu a seznam zobrazení přehrávače Flash Player. Chcete-li do objektu NativeWindow přidat vizuální objekt, přidejte objekt do seznamu zobrazení plochy okna nebo do jiného objektu zobrazení na ploše. Okna technologie Flex Technologie Flex definuje vlastní komponenty oken, jež sdružují rozhraní API NativeWindow. Tyto komponenty, mx:WindowedApplication a mx:Window, nelze používat mimo tuto technologii, proto je není možné použít v aplikacích AIR vytvořených pomocí vývojové aplikace Flash. okna HTML Při vytváření oken HTML se k zobrazení obsahu používá HTML, CSS a JavaScript. Pokud chcete do okna HTML přidat vizuální objekt, přidejte tento obsah do DOM HTML. Okna HTML jsou zvláštní kategorií objektů NativeWindow. Hostitel aplikace AIR definuje v oknech HTML vlastnost nativeWindow, která zajišťuje přístup k základní instanci objektu NativeWindow. Pomocí této vlastnosti lze přistupovat ke zde popsaným vlastnostem, metodám a událostem objektu NativeWindow. Poznámka: Objekt Window jazyka JavaScript má rovněž metody pro tvorbu skriptů okna, které je obsahuje, například moveTo() a close(). Jsou-li k dispozici překrývající se metody, lze použít tu, která je nejvhodnější. Úvodní okno aplikace První okno v aplikaci vytvoří aplikace AIR automaticky. Aplikace AIR nastaví vlastnosti a obsah okna pomocí parametrů stanovených v elementu initialWindow souboru deskriptoru aplikace. Pokud je základním obsahem soubor SWF, vytvoří aplikace AIR instanci objektu NativeWindow, načte soubor SWF a přidá jej na plochu okna. Je-li základním obsahem soubor HTML, aplikace AIR vytvoří okno HTML a načte obsah HTML. Další informace o vlastnostech okna určených v deskriptoru aplikace naleznete v sekci „Struktura souboru deskriptoru aplikace“ na stránce 42. Třídy nativních oken Rozhraní API pro nativní okna obsahuje následující třídy: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 56 Práce s nativními okny Balíček Třídy flash.display • NativeWindow • NativeWindowInitOptions • NativeWindowDisplayState • NativeWindowResize • NativeWindowSystemChrome • NativeWindowType Konstanty řetězců oken jsou definovány v následujících třídách: flash.events • NativeWindowDisplayState • NativeWindowResize • NativeWindowSystemChrome • NativeWindowType • NativeWindowBoundsEvent • NativeWindowDisplayStateEvent Tok událostí nativních oken Nativní okna odesílají události, jež zúčastněné komponenty informují, že brzy dojde nebo již došlo k významné změně. Řada událostí týkajících se oken se odesílá ve dvojicích. První událost upozorňuje, že brzy dojde ke změně. Druhá událost oznamuje, že změna byla provedena. Událost upozornění lze zrušit, událost oznámení však nikoliv. Následující posloupnost znázorňuje tok událostí, jež nastanou po klepnutí na tlačítko maximalizace okna. 1 Objekt NativeWindow odešle událost displayStateChanging. 2 Nedojde-li ke zrušení této události některým ze zaregistrovaných posluchačů, okno se maximalizuje. 3 Objekt NativeWindow odešle událost displayStateChange. Kromě toho objekt NativeWindow odešle také události pro související změny velikosti a polohy okna. Okno neodešle události upozornění pro tyto související změny. Související události jsou následující: a Událost move se odešle, pokud se v důsledku operace maximalizace posunul levý horní roh okna. b Událost resize se odešle, pokud se v důsledku operace maximalizace změnila velikost okna. Objekt NativeWindow odešle podobnou posloupnost událostí také při minimalizaci, obnovení, zavření, přesunu a změně velikosti okna. Události upozornění se odesílají jen v případě, že změna byla zahájena pomocí systémových prvků okna či jiného mechanismu řízeného operačním systémem. Když vyvoláte metodu okna, aby změnila velikost či polohu okna nebo stav zobrazení, okno odešle pouze událost oznamující změnu. Pokud chcete, můžete odeslat událost upozornění pomocí metody dispatchEvent() okna a potom ještě před provedením změny zkontrolovat, zda byla událost upozornění zrušena. Podrobné informace o třídách, metodách, vlastnostech a událostech rozhraní API pro okna naleznete v Referenční příručce jazyka ActionScript 3.0 a jeho komponent (http://www.adobe.com/go/learn_flash_aslr_cz). Všeobecné informace o použití seznamu zobrazení Flash naleznete v sekci „Programování zobrazení“ v příručce Programování v jazyce ActionScript 3.0 (http://www.adobe.com/go/programmingAS3_cz). VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 57 Práce s nativními okny Vlastnosti řídící styl a chování nativního okna Následující vlastnosti řídí základní vzhled a chování okna: • type • systemChrome • transparent Při vytváření okna se tyto vlastnosti nastaví u objektu NativeWindowInitOptions předávaného do konstruktoru okna. Aplikace AIR čte vlastnosti pro úvodní okno aplikace z deskriptoru aplikace. (Kromě vlastnosti type, kterou nelze nastavit v deskriptoru aplikace a která je vždy nastavena na hodnotu normal.) Po vytvoření okna již není možné tyto vlastnosti změnit. Některá nastavení těchto vlastností jsou vzájemně neslučitelná: vlastnost systemChrome nelze nastavit na hodnotu standard, když je vlastnost transparent nastavena na hodnotu true nebo vlastnost type je nastavena na hodnotu lightweight. Typy oken Typy oken aplikace AIR kombinují atributy systémových prvků a viditelnosti nativního operačního systému za účelem vytvoření tří funkčních typů oken. Pomocí konstant definovaných ve třídě NativeWindowType lze v kódu vytvořit odkazy na názvy typů. Aplikace AIR poskytuje následující typy oken: Typ Popis Normální Typické okno. Normální okna plně využívají standardní styl systémových prvků a zobrazují se na hlavním panelu operačního systému Windows a v hlavní nabídce operačního systému Mac OS X. Pomocné Paleta nástrojů. Pomocná okna používají užší verzi systémových prvků a nezobrazují se na hlavním panelu operačního systému Windows ani v hlavní nabídce operačního systému Mac OS X. Zjednodušené Zjednodušená okna nemají žádné systémové prvky a nezobrazují se na hlavním panelu operačního systému Windows ani v hlavní nabídce operačního systému Mac OS X. Zjednodušená okna navíc nemají v operačním systém Windows systémovou nabídku (Alt+mezerník). Zjednodušená okna jsou vhodná pro oznámení a ovládací prvky, například rozbalovací seznamy, které otevřou krátkodobou obrazovou oblast. Při použití vlastnosti type u zjednodušených oken musí být vlastnost systemChrome nastavena na hodnotu none. Systémové prvky okna Systémové prvky okna představuje sada ovladačů, pomocí nichž může uživatel ovládat okno v prostředí pracovní plochy. Elementy systémových prvků zahrnují titulní pruh, tlačítka titulního pruhu, okraj a záchytné pruhy pro změnu velikosti. Systémové prvky operačního systému Vlastnost systemChrome lze nastavit na hodnotu standard nebo none. Hodnotu standard zvolte pro systémové prvky operačního systému v případě, že má mít okno sadu standardních ovladačů vytvořených a upravených operačním systémem uživatele. Hodnotu none zvolte, pokud chcete okno vybavit vlastními systémovými prvky. Pomocí konstant definovaných ve třídě NativeWindowSystemChrome lze v kódu vytvořit odkazy na nastavení systémových prvků operačního systému. Systémové prvky operačního systému spravuje systém. Aplikace nemá přímý přístup k samotným ovladačům, ale může reagovat na události odesílané při použití ovladačů. Když se pro okno použijí standardní systémové prvky, musí být vlastnost transparent nastavena na hodnotu false a vlastnost type musí být nastavena na hodnotu normal nebo utility. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 58 Práce s nativními okny Vlastní systémové prvky Při vytváření okna bez systémových prvků operačního systému je potřeba přidat vlastní ovládací prvky, které uživateli umožní interaktivní práci s oknem. Rovněž můžete svobodně vytvářet okna průhledná a nepravoúhlá. Průhlednost okna Chcete-li u okna umožnit prolínání alpha s pracovní plochou či jinými okny, nastavte vlastnost transparent tohoto okna na hodnotu true. Vlastnost transparent je nezbytné nastavit ještě před vytvořením okna a nelze ji změnit. Průhledné okno nemá žádné výchozí pozadí. Veškerá plocha okna, která neobsahuje žádné objekty nakreslené aplikací, je neviditelná. Pokud má zobrazený objekt v nastavení alfa zadánu hodnotu nižší než jedna, bude jím prosvítat všechno, co se nachází pod ním, včetně ostatních objektů zobrazení umístěných ve stejném okně, ostatních oken a pracovní plochy. Vykreslování velkých ploch s prolínáním alfa může být pomalé, proto je vhodné používat tento efekt s mírou. Průhledná okna jsou užitečná při vytváření aplikací s okraji, jejichž tvar je nepravidelný nebo se postupně „ztrácí“, případně se jeví neviditelný. Průhlednost nelze použít u oken používajících systémové prvky operačního systému. Navíc se v průhledných oknech nezobrazuje obsah SWF a PDF v HTML. Další informace naleznete v sekci „Zohlednění při načítání obsahu SWF nebo PDF na stránce HTML“ na stránce 232. Některé operační systémy nemusí průhlednost podporovat v důsledku konfigurace hardwaru či softwaru nebo vlastních voleb zobrazení. Není-li průhlednost podporována, skládá se aplikace na černém pozadí. V takovém případě se zcela průhledná oblast aplikace zobrazí neprůhlednou černou barvou. Statická vlastnost NativeWindow.supportsTransparency značí, zda je možné použít průhledná okna. Jestliže bude tato vlastnost například otestována jako false, je možné zobrazit dialogové okno s upozorněním pro uživatele nebo lze zobrazit nouzové, pravoúhlé, neprůhledné uživatelské rozhraní. Všimněte si, že operační systémy Mac a Windows průhlednost oken vždy podporují. U operačního systému Linux podpora průhlednosti vyžaduje použití správce průhlednosti oken, rovněž však nemusí být k dispozici v důsledku vlastních voleb zobrazení nebo konfigurace hardwaru. Průhlednost v okně aplikace HTML Pozadí obsahu HTML zobrazovaného v oknech HTML a objektech HTMLLoader je standardně neprůhledné, a to i v případě, že okno, které jej obsahuje, je průhledné. Jestliže chcete výchozí pozadí zobrazované pro obsah HTML vypnout, nastavte vlastnost paintsDefaultBackground na hodnotu false. Následující příklad vytvoří objekt HTMLLoader a vypne výchozí pozadí: var html:HTMLLoader = new HTMLLoader(); html.paintsDefaultBackground = false; V tomto příkladu se výchozí pozadí okna HTML vypne pomocí jazyka JavaScript: window.htmlLoader.paintsDefaultBackground = false; Pokud element v dokumentu HTML nastavuje barvu pozadí, není pozadí tohoto elementu průhledné. Nastavení hodnoty částečné průhlednosti (nebo neprůhlednosti) není podporováno. Podobného vizuálního efektu je však možné dosáhnout použitím průhledné grafiky ve formátu PNG jako pozadí stránky nebo elementu stránky. Vizuální katalog okna V následující tabulce jsou znázorněny vizuální efekty různých kombinací nastavení vlastností okna v operačních systémech Mac OS X a Windows: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 59 Práce s nativními okny Nastavení oken Mac OS X Microsoft Windows Type: normal SystemChrome: standard Transparent: false Type: utility SystemChrome: standard Transparent: false Type: Any SystemChrome: none Transparent: false Type: Any SystemChrome: none Transparent: true mxWindowedApplication nebo mx:Window Type: Any SystemChrome: none Transparent: true Poznámka: Aplikace AIR nepodporuje následující elementy systémových prvků operačního systému: panel nástrojů systému OS X, ikonu proxy systému OS X, ikony hlavního panelu systému Windows a alternativní systémové prvky operačního systému. Vytváření oken Aplikace AIR vytvoří první okno pro aplikaci automaticky, podle potřeby je však možné vytvořit další okna. Chcete-li vytvořit nativní okno, použijte metodu konstruktoru NativeWindow. Pokud chcete vytvořit okno HTML, použijte buď metodu createRootWindow() objektu HTMLLoader, nebo z dokumentu HTML vyvolejte metodu window.open() jazyka JavaScript. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 60 Práce s nativními okny Určování inicializačních vlastností okna Po vytvoření okna pracovní plochy již nelze inicializační vlastnosti okna změnit. Tyto nezměnitelné vlastnosti a jejich výchozí hodnoty jsou následující: Vlastnost Výchozí hodnota systemChrome standard type normal transparent false maximizable true minimizable true resizable true V souboru deskriptoru aplikace nastavte vlastnosti pro úvodní okno vytvořené aplikací AIR. Hlavní okno aplikace AIR bude vždy typu normal. (V souboru deskriptoru lze nastavit i další vlastnosti okna, například visible, width a height, ale tyto vlastnosti je možné kdykoliv změnit.) Vlastnosti pro ostatní nativní okna a okna HTML vytvořená danou aplikací lze nastavit pomocí třídy NativeWindowInitOptions. Při vytváření okna je potřeba předat objekt NativeWindowInitOptions, který určuje vlastnosti okna, do funkce konstruktoru NativeWindow nebo do metody createRootWindow() objektu HTMLLoader. Následující kód vytvoří objekt NativeWindowInitOptions pro pomocné okno: var options:NativeWindowInitOptions = new NativeWindowInitOptions(); options.systemChrome = NativeWindowSystemChrome.STANDARD; options.type = NativeWindowType.UTILITY options.transparent = false; options.resizable = false; options.maximizable = false; Nastavení vlastnosti systemChrome na hodnotu standard při nastavení vlastnosti transparent na hodnotu true nebo vlastnosti type na hodnotu lightweight není podporováno. Poznámka: Pro okno vytvořené pomocí funkce window.open() jazyka JavaScript nelze nastavit inicializační vlastnosti. Avšak způsob vytváření těchto oken je možné změnit zavedením vlastní třídy HTMLHost. Další informace naleznete v sekci „Zpracovávání volání jazyka JavaScript window.open()“ na stránce 240. Vytváření úvodního okna aplikace Aplikace AIR vytvoří úvodní okno aplikace na základě vlastností určených v deskriptoru aplikace a načte soubor, na který se odkazuje v elementu obsahu. Obsah musí být soubor SWF nebo HTML. Úvodní okno může být hlavním oknem aplikace nebo může sloužit pouze k otevření jednoho či několika dalších oken. Nemusí být vůbec viditelné. Vývojový nástroj Flash automaticky vytvoří soubor SWF a při testování nebo publikování projektu pro aplikaci AIR přidá do deskriptoru aplikace příslušný odkaz. Hlavní časová osa slouží jako vstupní bod pro danou aplikaci. Po spuštění aplikace vytvoří aplikace AIR okno a načte soubor SWF aplikace. Chcete-li ovládat okno pracovní plochy pomocí jazyka ActionScript, můžete pomocí vlastnosti nativeWindow objektu Stage získat odkaz na objekt NativeWindow. Pak můžete nastavit vlastnosti okna a vyvolat metody okna. Následující příklad aktivuje hlavní okno v maximalizovaném stavu (z prvního snímku souboru FLA aplikace Flash): VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 61 Práce s nativními okny import flash.display.NativeWindow; var mainWindow:NativeWindow = this.stage.nativeWindow; mainWindow.maximize(); mainWindow.activate(); Vytvoření objektu NativeWindow Chcete-li vytvořit objekt NativeWindow, předejte do konstruktoru NativeWindow objekt NativeWindowInitOptions: var options:NativeWindowInitOptions = new NativeWindowInitOptions(); options.systemChrome = NativeWindowSystemChrome.STANDARD; options.transparent = false; var newWindow:NativeWindow = new NativeWindow(options); Okno se zobrazí až po nastavení vlastnosti visible na hodnotu true nebo vyvolání metody activate(). Po vytvoření okna lze inicializovat jeho vlastnosti a načíst do něho obsah pomocí vlastnosti pracovní plochy a metod seznamu zobrazení aplikace Flash. Vlastnost scaleMode pracovní plochy nového nativního okna by měla být téměř vždy nastavena na hodnotu noScale (použijte konstantu StageScaleMode.NO_SCALE). Režimy změny velikosti aplikace Flash jsou určeny pro situace, kdy autor aplikace předem nezná poměr stran prostoru zobrazení v dané aplikaci. Pomocí režimů změny velikosti může autor zvolit cestu nejmenšího zla: obsah oříznout, roztáhnout nebo stlačit, případně ho vyplnit prázdným místem. Vzhledem k tomu, že v aplikaci AIR řídíte prostor zobrazení (rám okna), můžete upravit velikost okna podle obsahu nebo velikost obsahu podle okna bez jakýchkoliv kompromisů. Poznámka: Jestliže chcete určit maximální a minimální velikost okna povolenou v aktuálním operačním systému, použijte následující statické vlastnosti objektu NativeWindow: var maxOSSize:Point = NativeWindow.systemMaxSize; var minOSSize:Point = NativeWindow.systemMinSize; Vytvoření okna HTML Pokud chcete vytvořit okno HTML, můžete vyvolat metodu Window.open() jazyka JavaScript nebo můžete vyvolat metodu createRootWindow() třídy HTMLLoader aplikace AIR. Obsah HTML v jakékoliv karanténě zabezpečení může použít standardní metodu Window.open() jazyka JavaScript. Jestliže je obsah spuštěný mimo aplikační karanténu, lze metodu open() vyvolat pouze v odezvě na interakci uživatele, například po kliknutí myší nebo stisknutí klávesy. Po vyvolání metody open() se vytvoří okno se systémovými prvky operačního systému, v němž bude zobrazen obsah na určené adrese URL. Například: newWindow = window.open("xmpl.html", "logWindow", "height=600, width=400, top=10, left=10"); Poznámka: Třídu HTMLHost lze v jazyce ActionScript rozšířit, aby bylo možné přizpůsobit okno vytvořené pomocí funkce window.open() jazyka JavaScript. Viz sekce „O rozšiřování třídy HTMLHost“ na stránce 236. Obsah v aplikační karanténě zabezpečení má přístup k výkonnější metodě pro vytváření oken, a to HTMLLoader.createRootWindow(). Pomocí této metody lze určit všechny možnosti vytváření pro nové okno. Následující kód jazyka JavaScript například vytvoří zjednodušené okno bez systémových prvků operačního systému, o velikosti 300 x 400 obrazových bodů: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 62 Práce s nativními okny var options = new air.NativeWindowInitOptions(); options.systemChrome = "none"; options.type = "lightweight"; var windowBounds = new air.Rectangle(200,250,300,400); newHTMLLoader = air.HTMLLoader.createRootWindow(true, options, true, windowBounds); newHTMLLoader.load(new air.URLRequest("xmpl.html")); Poznámka: Pokud se obsah načtený novým oknem nachází mimo aplikační karanténu zabezpečení, nemusí mít objekt window vlastnosti aplikace AIR: runtime, nativeWindow ani htmlLoader. Okna vytvořená pomocí metody createRootWindow() zůstávají nezávislá na otevíraném okně. Vlastnosti parent a opener objektu Window v jazyce JavaScript jsou nastaveny na hodnotu null. Otevírané okno má přístup k objektu Window nového okna pomocí odkazu na objekt HTMLLoader vrácený funkcí createRootWindow(). V kontextu předchozího příkladu by příkaz newHTMLLoader.window odkazoval na objekt Window v jazyce JavaScript vytvořeného okna. Poznámka: Funkci createRootWindow() je možné volat z jazyka JavaScript i z jazyka ActionScript. Přidávání obsahu do okna Způsob přidávání obsahu do okna aplikace AIR závisí na typu okna. Je možné vytvořit filmový klip a pomocí časové osy řídit stav aplikace. V případě HTML lze deklarativně definovat základní obsah okna. Zdroje je možné vložit do souboru SWF aplikace nebo je lze načíst ze samostatných aplikačních souborů. Obsah Flash a HTML lze vytvářet za chodu a dynamicky ho přidávat do okna. Při načítání obsahu SWF nebo obsahu HTML obsahujícího JavaScript, je třeba vzít v úvahu model zabezpečení aplikace AIR. Jakýkoliv obsah umístěný v aplikační karanténě zabezpečení, tedy obsah instalovaný společně s aplikací, který lze načíst pomocí schématu URL app:, má veškerá přístupová práva ke všem rozhraním API aplikace AIR. Jakýkoliv obsah načtený z místa mimo tuto karanténu nemá k rozhraním API aplikace AIR přístup. Obsah v jazyce JavaScript umístěný mimo aplikační karanténu nemůže používat vlastnosti runtime, nativeWindow ani htmlLoader objektu Window v jazyce JavaScript. Jestliže chcete zajistit bezpečné vytváření křížových skriptů, můžete pomocí mostu karantény zajistit omezené rozhraní mezi aplikačním obsahem a neaplikačním obsahem. V obsahu HTML je rovněž možné mapovat stránky aplikace do neaplikační karantény a tím kódu na dané stránce umožnit vytváření křížových skriptů s externím obsahem. Viz sekce „Zabezpečení aplikace AIR“ na stránce 23. Načtení souboru SWF nebo obrazu Obsah Flash nebo obrázky lze načíst do souboru zobrazení nativního okna pomocí třídy flash.display.Loader: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 63 Práce s nativními okny package { import import import import flash.display.Sprite; flash.events.Event; flash.net.URLRequest; flash.display.Loader; public class LoadedSWF extends Sprite { public function LoadedSWF(){ var loader:Loader = new Loader(); loader.load(new URLRequest("visual.swf")); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadFlash); } private function loadFlash(event:Event):void{ addChild(event.target.loader); } } } Je možné načíst soubor SWF obsahující kód knihovny pro použití v aplikaci založené na HTML. Nejjednodušší způsob načtení souboru SWF do okna HTML je použít tag script, lze však také použít přímo rozhraní API objektu Loader. Poznámka: Starší soubory SWF vytvořené pomocí verze ActionScript 1 nebo 2 sdílejí při načtení do stejného okna globální stavy, například definice stavů, objekty singleton a globální proměnné. Pokud tento typ souboru SWF spoléhá na správnou funkčnost nedotčených globálních stavů, nelze jej do stejného okna načíst více než jednou ani jej nelze do stejného okna načíst jako jiný soubor SWF pomocí překrývajících se definic tříd nebo proměnných. Tento obsah lze načíst do různých oken. Načtení obsahu HTML do objektu NativeWindow Chcete-li načíst obsah HTML do objektu NativeWindow, můžete na pracovní plochu okna přidat objekt HTMLLoader a načíst obsah HTML do objektu HTMLLoader nebo můžete pomocí metody HTMLLoader.createRootWindow() vytvořit okno, které již bude objekt HTMLLoader obsahovat. V následujícím příkladu se obsah HTML zobrazí na ploše nativního okna v oblasti zobrazení o velikosti 300 x 500 obrazových bodů: //newWindow is a NativeWindow instance var htmlView:HTMLLoader = new HTMLLoader(); html.width = 300; html.height = 500; //set the stage so display objects are added to the top-left and not scaled newWindow.stage.align = "TL"; newWindow.stage.scaleMode = "noScale"; newWindow.stage.addChild( htmlView ); //urlString is the URL of the HTML page to load htmlView.load( new URLRequest(urlString) ); Poznámka: Obsah SWF nebo PDF v souboru HTML se nezobrazí, pokud okno používá průhlednost (tj. vlastnost transparent daného okna je nastavena na hodnotu true) nebo pokud se změní velikost ovladače HTMLLoader. Přidání obsahu SWF do okna HTML jako překrytí Vzhledem k tomu, že jsou okna HTML obsažena v instanci objektu NativeWindow, lze přidávat objekty zobrazení aplikace Flash nad a pod vrstvu HTML v seznamu zobrazení. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 64 Práce s nativními okny Pokud chcete přidat objekt zobrazení nad vrstvu HTML, použijte metodu addChild() vlastnosti window.nativeWindow.stage. Metoda addChild() přidá obsah navrstvený nad jakýmkoliv existujícím obsahem v okně. Jestliže chcete objekt zobrazení přidat pod vrstvu HTML, použijte metodu addChildAt() vlastnosti window.nativeWindow.stage a předejte do ní nulovou hodnotu pro parametr index. Při umístění objektu do nulového indexu se existující obsah, včetně zobrazení HTML, posune o jednu vrstvu nahoru a nový obsah se vloží na nejnižší vrstvu. Aby byl obsah navrstvený pod stránkou HTML viditelný, je potřeba nastavit vlastnost paintsDefaultBackground objektu HTMLlLoader na hodnotu false. Kromě toho všechny elementy stránky, jež nastavují barvu pozadí, nebudou průhledné. Bude-li například nastavena barva pozadí pro element těla stránky, nebude žádná část stránky průhledná. Následující příklad ilustruje způsob přidávání objektů zobrazení aplikace Flash na stránku HTML jako překrytí nebo jako podklad. Příklad vytvoří dva objekty jednoduchého tvaru, přičemž přidá jeden z nich pod obsah HTML a druhý nad něj. Navíc příklad aktualizuje polohu tvaru na základě události enterFrame. <html> <head> <title>Bouncers</title> <script src="AIRAliases.js" type="text/javascript"></script> <script language="JavaScript" type="text/javascript"> air.Shape = window.runtime.flash.display.Shape; function Bouncer(radius, color){ this.radius = radius; this.color = color; //velocity this.vX = -1.3; this.vY = -1; //Create a Shape object and draw a circle with its graphics property this.shape = new air.Shape(); this.shape.graphics.lineStyle(1,0); this.shape.graphics.beginFill(this.color,.9); this.shape.graphics.drawCircle(0,0,this.radius); this.shape.graphics.endFill(); //Set the starting position this.shape.x = 100; this.shape.y = 100; //Moves the sprite by adding (vX,vY) to the current position this.update = function(){ this.shape.x += this.vX; this.shape.y += this.vY; //Keep the sprite within the window if( this.shape.x - this.radius < 0){ this.vX = -this.vX; } if( this.shape.y - this.radius < 0){ this.vY = -this.vY; } if( this.shape.x + this.radius > window.nativeWindow.stage.stageWidth){ VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 65 Práce s nativními okny this.vX = -this.vX; } if( this.shape.y + this.radius > window.nativeWindow.stage.stageHeight){ this.vY = -this.vY; } }; } function init(){ //turn off the default HTML background window.htmlLoader.paintsDefaultBackground = false; var bottom = new Bouncer(60,0xff2233); var top = new Bouncer(30,0x2441ff); //listen for the enterFrame event window.htmlLoader.addEventListener("enterFrame",function(evt){ bottom.update(); top.update(); }); //add the bouncing shapes to the window stage window.nativeWindow.stage.addChildAt(bottom.shape,0); window.nativeWindow.stage.addChild(top.shape); } </script> <body onload="init();"> <h1>de Finibus Bonorum et Malorum</h1> <p>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.</p> <p style="background-color:#FFFF00; color:#660000;">This paragraph has a background color.</p> <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga.</p> </body> </html> Tento příklad poskytuje základní úvod do některých pokročilých metod, jež v aplikaci AIR překračují hranice mezi jazyky JavaScript a ActionScript. Nejste-li obeznámeni s použitím objektů zobrazení v jazyce ActionScript, další informace naleznete v příručce Programování v jazyce ActionScript 3.0 v sekci Programování zobrazení. Příklad: Vytvoření nativního okna Následující příklad ilustruje postup při vytváření nativního okna: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 66 Práce s nativními okny public function createNativeWindow():void { //create the init options var options:NativeWindowInitOptions = new NativeWindowInitOptions(); options.transparent = false; options.systemChrome = NativeWindowSystemChrome.STANDARD; options.type = NativeWindowType.NORMAL; //create the window var newWindow:NativeWindow = new NativeWindow(options); newWindow.title = "A title"; newWindow.width = 600; newWindow.height = 400; newWindow.stage.align = StageAlign.TOP_LEFT; newWindow.stage.scaleMode = StageScaleMode.NO_SCALE; //activate and show the new window newWindow.activate(); } Správa oken Pomocí vlastností a metod třídy NativeWindow se řídí vzhled, chování a životní cyklus oken pracovní plochy. Získání instance objektu NativeWindow Aby bylo možné s oknem pracovat, je nejprve potřeba získat instanci tohoto okna. Instanci okna lze získat z následujícího umístění: Konstruktor okna Například konstruktor okna pro nový objekt NativeWindow. Pracovní plocha okna Například stage.nativeWindow. Libovolný objekt zobrazení na pracovní ploše Například myDisplayObject.stage.nativeWindow. Událost okna Vlastnost target objektu události odkazuje na okno, jež tuto událost odeslalo. Globální vlastnost nativeWindow objektu HTMLLoader nebo okna HTML Například window.nativeWindow. Objekt NativeApplication NativeApplication.nativeApplication.activeWindow odkazuje na aktivní okno aplikace (ale vrátí hodnotu null, pokud aktivní okno není okno této aplikace AIR). Pole NativeApplication.nativeApplication.openedWindows obsahuje všechna okna v aplikaci AIR, jež dosud nebyla zavřena. Aktivace, zobrazení a skrývání oken Jestliže chcete okno aktivovat, vyvolejte metodu activate() objektu NativeWindow. Po aktivaci se okno dostane do popředí, začne být aktivní pro klávesnici a myš a v případě potřeby se zviditelní obnovením okna nebo nastavením vlastnosti visible na hodnotu true. Aktivace okna nezmění pořadí zobrazení ostatních oken v aplikaci. Bude-li vyvolána metoda activate(), okno odešle událost activate. Pokud chcete zobrazit skryté okno bez toho, aby bylo aktivováno, nastavte vlastnost visible na hodnotu true. Tím se okno přenese do popředí, ale nebude aktivováno. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 67 Práce s nativními okny Chcete-li zobrazené okno skrýt, nastavte jeho vlastnost visible na hodnotu false. Skrytím okna se potlačí zobrazení okna, s ním souvisejících ikon hlavního panelu a u systému Mac OS X také položky v nabídce Windows. Poznámka: V systému Mac OS X není možné zcela skrýt minimalizované okno s ikonou ukotvení. Jestliže je vlastnost visible nastavena u minimalizovaného okna na hodnotu false, zůstane ikona ukotvení pro toto okno nadále zobrazena. Po klepnutí na tuto ikonu se okno obnoví do viditelného stavu a zobrazí se. Změna pořadí zobrazení oken Aplikace AIR poskytuje několik metod, pomocí nichž lze přímo změnit pořadí zobrazení oken. Okno je možné posunout v pořadí zobrazení dopředu nebo dozadu; okno lze posunout nad jiné okno nebo za ně. Současně lze okna aktivovat a tím změnit jejich uspořádání. Chcete-li, aby bylo okno neustále zobrazeno před ostatními okny, nastavte jeho vlastnost alwaysInFront na hodnotu true. Pokud bude mít více oken toto nastavení, bude se pořadí jejich zobrazení vzájemně měnit, tato okna však budou vždy uspořádána nad okny, u nichž bude vlastnost alwaysInFront nastavena na hodnotu. Okna v nejhornější skupině jsou také vždy zobrazena nad okny jiných aplikací, a to i v případě, že aplikace AIR není aktivní. Vzhledem k tomu, že toto chování může uživatele rušit, doporučuje se nastavovat vlastnost alwaysInFront na hodnotu true jen tehdy, když je to nezbytné a vhodné. Příklady oprávněného použití jsou následující: • Dočasná rozbalovací okna pro ovládací prvky, jako je například bublinová nápověda, rozbalovací seznamy či kombinovaná pole. Vzhledem k tomu, že by se tato okna měla po deaktivaci zavřít, lze zamezit tomu, aby uživateli bránila v prohlížení ostatních oken. • Extrémně naléhavé chybové zprávy a výstrahy Pokud by mohlo dojít k nevratné změně, kdyby uživatel včas nezareagoval, může být vhodné umístit okno s výstrahou do popředí. Většinu chyb a výstrah je však možné zpracovat v běžném pořadí zobrazení oken. • Krátkodobá vysunovací okna Poznámka: Aplikace AIR neprosazuje správné použití vlastnosti alwaysInFront. Jestliže však bude aplikace narušovat práci uživatele, s největší pravděpodobností skončí v jeho nádobě na odpadky. Třída NativeWindow poskytuje následující vlastnosti a metody pro nastavení pořadí zobrazení okna vzhledem k ostatním oknům: Člen Popis vlastnost alwaysInFront Určuje, zda je okno zobrazeno v nejhornější skupině oken. Téměř vždy je nejvhodnějším nastavením hodnota false. Při změně hodnoty z false na true se okno zobrazí ze všech oken nejvýše (ale neaktivuje se). Při změně hodnoty z true na false se okno umístí za zbývající okna v nejhornější skupině, ale stále bude umístěno před ostatními okny. Nastavením vlastnosti na aktuální hodnotu pro okno se pořadí zobrazení oken nezmění. orderToFront() Přenese okno do popředí. orderInFrontOf() Přenese okno přímo před určité okno. orderToBack() Odešle okno za ostatní okna. orderBehind() Odešle okno přímo za určité okno. activate() Přenese okno do popředí (přičemž okno současně zviditelní a aktivuje). Poznámka: Je-li okno skryté (vlastnost visible je nastavena na hodnotu false) nebo minimalizované, nebude mít vyvolání metod pořadí zobrazení žádný účinek. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 68 Práce s nativními okny Zavření okna Jestliže chcete okno zavřít, použijte metodu NativeWindow.close(). Zavřením okna se zruší zavedení jeho obsahu, pokud však jiné objekty mají odkazy na tento obsah, nebudou objekty obsahu vymazány. Metoda NativeWindow.close() probíhá asynchronně, aplikace obsažená v okně je v průběhu procesu zavírání okna stále spuštěná. Jakmile bude operace zavření dokončena, metoda close odešle událost close. Objekt NativeWindow je, technicky vzato, stále platný, ale pokus o přístup k většině vlastností a metod u zavřeného okna vyvolá chybu IllegalOperationError. Zavřené okno nelze znovu otevřít. Chcete-li zjistit, zda bylo okno zavřeno, zkontrolujte jeho vlastnost closed. Pokud chcete zobrazené okno jen skrýt, nastavte vlastnost NativeWindow.visible na hodnotu false. V případě, že je vlastnost Nativeapplication.autoExit nastavena na hodnotu true, což je výchozí nastavení, pak se aplikace ukončí po zavření jejího posledního okna. Povolení zrušení operací okna Jestliže okno používá systémové prvky operačního systému, je možné interakci uživatele s oknem zrušit posloucháním příslušných událostí a zrušením jejich výchozího chování. Když uživatel například v systémových prvcích operačního systému klepne na tlačítko zavření, odešle se událost closing. Pokud některý ze zaregistrovaných posluchačů vyvolá metodu preventDefault() této události, okno se nezavře. V případě, že okno systémové prvky operačního systému nepoužívá, nebudou se před provedením záměrných změn automaticky odesílat události upozornění na tyto změny. Vyvoláte-li tedy metody pro zavření okna či změnu stavu okna nebo nastavíte-li některou z vlastností okrajů okna, nebude možné změnu zrušit. Jestliže chcete upozornit komponenty v aplikaci před tím, než bude v okně provedena změna, může logika aplikace odeslat příslušnou událost upozornění pomocí metody dispatchEvent() daného okna. Následující logika například implementuje zrušitelné zpracování události pro tlačítko zavření okna: public function onCloseCommand(event:MouseEvent):void{ var closingEvent:Event = new Event(Event.CLOSING,true,true); dispatchEvent(closing); if(!closingEvent.isDefaultPrevented()){ win.close(); } } Metoda dispatchEvent() vrátí hodnotu false, pokud bude metoda preventDefault() události vyvolána posluchačem. Hodnotu false však může vrátit také z jiných důvodů, proto je vhodnější explicitně použít metodu isDefaultPrevented() a otestovat, zda má být změna zrušena. Maximalizace, minimalizace a obnovení okna Pokud chcete okno maximalizovat, použijte metodu maximize() objektu NativeWindow. myWindow.maximize(); Jestliže chcete okno minimalizovat, použijte metodu minimize() objektu NativeWindow. myWindow.minimize(); Chcete-li okno obnovit (tj. vrátit mu velikost, kterou mělo před provedením minimalizace nebo maximalizace), použijte metodu restore() objektu NativeWindow. myWindow.restore(); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 69 Práce s nativními okny Poznámka: Chování vyplývající z maximalizace okna aplikace AIR se liší od standardního chování systému Mac OS X. Místo toho, aby se okna aplikace AIR přepínala mezi „standardní“ velikostí definovanou aplikací a poslední velikostí nastavenou uživatelem, přepínají se mezi poslední velikostí nastavenou aplikací nebo uživatelem a celou využitelnou oblastí obrazovky. Příklad: Minimalizace, maximalizace, obnovení a zavření okna Následující příklad v jazyce ActionScript pro aplikaci Flash vytvoří čtyři textová pole umožňující klepnutí, která spustí metody minimize(), maximize(), restore() a close() objektu NativeWindow: package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; public class MinimizeExample extends Sprite { public function MinimizeExample():void { var minTextBtn:TextField = new TextField(); minTextBtn.x = 10; minTextBtn.y = 10; minTextBtn.text = "Minimize"; minTextBtn.background = true; minTextBtn.border = true; minTextBtn.selectable = false; addChild(minTextBtn); minTextBtn.addEventListener(MouseEvent.CLICK, onMinimize); var maxTextBtn:TextField = new TextField(); maxTextBtn.x = 120; maxTextBtn.y = 10; maxTextBtn.text = "Maximize"; maxTextBtn.background = true; maxTextBtn.border = true; maxTextBtn.selectable = false; addChild(maxTextBtn); maxTextBtn.addEventListener(MouseEvent.CLICK, onMaximize); var restoreTextBtn:TextField = new TextField(); restoreTextBtn.x = 230; restoreTextBtn.y = 10; restoreTextBtn.text = "Restore"; restoreTextBtn.background = true; restoreTextBtn.border = true; restoreTextBtn.selectable = false; addChild(restoreTextBtn); restoreTextBtn.addEventListener(MouseEvent.CLICK, onRestore); var closeTextBtn:TextField = new TextField(); closeTextBtn.x = 340; closeTextBtn.y = 10; closeTextBtn.text = "Close Window"; closeTextBtn.background = true; closeTextBtn.border = true; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 70 Práce s nativními okny closeTextBtn.selectable = false; addChild(closeTextBtn); closeTextBtn.addEventListener(MouseEvent.CLICK, onCloseWindow); } function onMinimize(event:MouseEvent):void { this.stage.nativeWindow.minimize(); } function onMaximize(event:MouseEvent):void { this.stage.nativeWindow.maximize(); } function onRestore(event:MouseEvent):void { this.stage.nativeWindow.restore(); } function onCloseWindow(event:MouseEvent):void { this.stage.nativeWindow.close(); } } } Přemísťování a změna velikosti okna Když okno používá systémové prvky operačního systému, jsou k dispozici ovladače umožňující přemísťování okna po pracovní ploše a změnu jeho velikosti. V případě, že okno systémové prvky operačního systému nepoužívá, je nezbytné přidat vlastní ovladače, které uživateli umožní přemísťování a změnu velikosti okna. Poznámka: Aby bylo možné okno přemístit nebo změnit jeho velikost, je nejprve nutné získat odkaz na instanci objektu NativeWindow. Informace o způsobu získání odkazu na okno naleznete v sekci „Získání instance objektu NativeWindow“ na stránce 66. Změna velikosti okna Velikost okna je možné změnit pomocí metody startResize() objektu NativeWindow. Když je tato metoda volána z události mouseDown, operace změny velikosti se řídí podle myši a skončí, jakmile operační systém přijme událost mouseUp. Při vyvolání metody startResize() se do ní předává argument, který určuje okraj nebo roh, z něhož se má měnit velikost okna. Režim změny velikosti plochy určuje, jak se bude při změně velikosti okna chovat pracovní plocha okna a její obsah. Je třeba mít na paměti, že režimy změny velikosti pracovní plochy jsou určeny pro situace, jako je například webový prohlížeč, kdy aplikace nemá pod kontrolou velikost nebo poměr stran jeho prostoru zobrazení. Nejlepších výsledků lze obvykle dosáhnout nastavením vlastnosti scaleMode pracovní plochy na možnost StageScaleMode.NO_SCALE. Pokud se má měnit velikost obsahu okna, lze přesto nastavit parametry scaleX a scaleY v reakci na změnu okrajů okna. Přemísťování okna Chcete-li okno přemístit bez změny jeho velikosti, použijte metodu NativeWindow startMove(). Stejně jako u metody startResize() i zde platí, že při vyvolání metody startMove() z události mouseDown se proces přemísťování řídí podle myši a skončí, jakmile operační systém přijme událost mouseUp. Další informace týkající se metod startResize a startMove naleznete v Referenční příručce jazyka ActionScript 3.0 a jeho komponent (http://www.adobe.com/go/learn_air_aslr_cz). VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 71 Práce s nativními okny Příklad: Změna velikosti a přemísťování oken V následujícím příkladu je znázorněno, jak se pro okno spouští operace změny velikosti a přemístění: package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.display.NativeWindowResize; public class NativeWindowResizeExample extends Sprite { public function NativeWindowResizeExample():void { // Fills a background area. this.graphics.beginFill(0xFFFFFF); this.graphics.drawRect(0, 0, 400, 300); this.graphics.endFill(); // Creates a square area where a mouse down will start the resize. var resizeHandle:Sprite = createSprite(0xCCCCCC, 20, this.width - 20, this.height - 20); resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartResize); // Creates a square area where a mouse down will start the move. var moveHandle:Sprite = createSprite(0xCCCCCC, 20, this.width - 20, 0); moveHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartMove); } public function createSprite(color:int, size:int, x:int, y:int):Sprite { var s:Sprite = new Sprite(); s.graphics.beginFill(color); s.graphics.drawRect(0, 0, size, size); s.graphics.endFill(); s.x = x; s.y = y; this.addChild(s); return s; } public function onStartResize(event:MouseEvent):void { this.stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT); } public function onStartMove(event:MouseEvent):void { this.stage.nativeWindow.startMove(); } } } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 72 Práce s nativními okny Poslouchání událostí oken Chcete-li poslouchat události odeslané oknem, zaregistrujte u instance okna posluchače. Jestliže například chcete poslouchat událost closing, zaregistrujte posluchače pro okno následujícím způsobem: myWindow.addEventListener(Event.CLOSING, onClosingEvent); Při odeslání události odkazuje vlastnost target na okno odesílající událost. Většina událostí okna má dvě související zprávy. První zpráva značí, že brzy dojde ke změně okna (a lze ji zrušit), zatímco druhá zpráva značí, že byla provedena změna. Když uživatel například klepne na tlačítko zavření okna, odešle se zpráva události closing. Pokud žádný posluchač tuto událost nezruší, okno se zavře a všem posluchačům se odešle událost close. Události upozornění, například closing, se obvykle odesílají jen v případě, že byla událost spuštěna pomocí systémových prvků operačního systému. Například vyvolání metody close() okna událost closing automaticky neodesílá – odešle se jen událost close. Lze však vytvořit objekt události closing a odeslat událost pomocí metody dispatchEvent() okna. Události okna, které spouští objekt Event, jsou následující: Událost Popis activate Odešle se při aktivaci okna. deactivate Odešle se při deaktivaci okna. closing Odešle se těsně před zavřením okna. K tomu dojde automaticky jen při stisknutí tlačítka zavření v systémových prvcích operačního systému nebo u systému Mac OS X při vyvolání příkazu Konec. close Odešle se po zavření okna. Události okna, které spouští objekt NativeWindowBoundsEvent, jsou následující: Událost Popis moving Odešle se těsně před tím, než se změní poloha levého horního rohu okna následkem přemístění, změny velikosti nebo změny stavu zobrazení okna. move Odešle se poté, co se změní poloha levého horního rohu. resizing Odešle se těsně před tím, než se změní šířka nebo výška okna následkem změny velikosti nebo změny stavu zobrazení. resize Odešle se poté, co se změní velikost okna. Pro události NativeWindowBoundsEvent lze pomocí vlastností beforeBounds a afterBounds určit ohraničení okna před blížící se změnou a po provedení změny. Události okna, které spouští objekt NativeWindowDisplayStateEvent, jsou následující: Událost Popis displayStateChanging Odešle se těsně před tím, než se změní stav zobrazení okna. displayStateChange Odešle se poté, co se změní stav zobrazení okna. Pro události NativeWindowDisplayStateEvent lze pomocí vlastností beforeDisplayState a afterDisplayState určit stav zobrazení okna před blížící se změnou a po provedení změny. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 73 Práce s nativními okny Zobrazení oken na celou obrazovku Po nastavení vlastnosti displayState plochy na možnost StageDisplayState.FULL_SCREEN_INTERACTIVE se okno přepne do režimu zobrazení na celou obrazovku. V tomto režimu je povolen vstup z klávesnice. (U obsahu SWF spuštěného v prohlížeči není vstup z klávesnice povolen.) Režim zobrazení na celou obrazovku může uživatel ukončit stisknutím klávesy Esc. V následujícím příkladu jazyka ActionScript pro aplikaci Flash je znázorněna simulace jednoduchého terminálu pro zobrazení textu na celou obrazovku: import import import import flash.display.Sprite; flash.display.StageDisplayState; flash.text.TextField; flash.text.TextFormat; public class FullScreenTerminalExample extends Sprite { public function FullScreenTerminalExample():void { var terminal:TextField = new TextField(); terminal.multiline = true; terminal.wordWrap = true; terminal.selectable = true; terminal.background = true; terminal.backgroundColor = 0x00333333; this.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; addChild(terminal); terminal.width = 550; terminal.height = 400; terminal.text = "Welcome to the dumb terminal application. Press the ESC key to exit.\n_"; var tf:TextFormat = new TextFormat(); tf.font = "Courier New"; tf.color = 0x00CCFF00; tf.size = 12; terminal.setTextFormat(tf); terminal.setSelection(terminal.text.length - 1, terminal.text.length); } } 74 Kapitola 11: Obrazovky Pomocí třídy Screen prostředí Adobe® AIR® získáte přístup k informacím o obrazovkách zobrazujících plochu připojených k počítači. Další online informace o obrazovkách Další informace o třídě Screen a o práci s obrazovkami můžete vyhledat v těchto zdrojích: Stručné úvody (Adobe AIR Developer Connection) • Měření virtuální pracovní plochy Jazykové reference • Obrazovka Články a ukázky na webu Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (vyhledejte „Obrazovky prostředí AIR“) Základní informace o obrazovkách Rozhraní API obrazovky obsahuje jednu třídu, Screen, která poskytuje statické členy pro získávání informací o obrazovkách systému a členech instancí pro popis konkrétní obrazovky. K počítačovému systému může být připojeno několik monitorů nebo displejů, které mohou odpovídat několika obrazovkám na ploše rozmístěných ve virtuálním prostoru. Třída Screen prostředí AIR poskytuje informace o obrazovkách, jejich vzájemném uspořádání a využitelném místě. Je-li na stejnou obrazovku mapováno více monitorů, pak existuje pouze jedna obrazovka. Pokud je tato obrazovka větší než oblast zobrazení monitoru, nelze zjistit, která část obrazovky je právě viditelná. Obrazovka představuje nezávislou oblast zobrazení na pracovní ploše. Obrazovky jsou popisovány jako obdélníky v rámci virtuální pracovní plochy. Levý horní roh obrazovky určené jako primární displej je počátkem souřadného systému virtuální pracovní plochy. Všechny hodnoty použité k popisu obrazovky jsou vyjádřeny v obrazových bodech. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 75 Obrazovky Screen bounds Virtual screen Usable bounds V tomto uspořádání obrazovky se na virtuální pracovní ploše nacházejí dvě obrazovky. Souřadnice levého horního rohu hlavní obrazovky (č. 1) mají vždy hodnotu (0,0). Pokud se uspořádání obrazovky změní tak, že určuje obrazovku č. 2 jako hlavní, pak jsou souřadnice obrazovky č. 1 záporné. Pruhy nabídek, hlavní panely a doky jsou při oznamování využitelného ohraničení obrazovky vyloučeny. Podrobné informace o třídě rozhraní API obrazovky, metodách, vlastnostech a událostech naleznete v dokumentu Referenční příručka jazyka ActionScript 3.0 a jeho součástí (http://www.adobe.com/go/learn_air_aslr_cz). Výčet obrazovek Výčet obrazovek virtuální pracovní plochy můžete vytvořit pomocí následujících metod a vlastností obrazovek: Metoda nebo vlastnost Popis Screen.screens Poskytuje pole objektů Screen popisující dostupné obrazovky. Povšimněte si, že pořadí pole není důležité. Screen.mainScreen Poskytuje objekt Screen pro hlavní obrazovku. V operačním systému Mac OS X je hlavní obrazovkou ta, která zobrazuje pruh nabídek. V operačním systému Windows je hlavní obrazovkou primární obrazovka určená systémem. Screen.getScreensForRectangle() Poskytuje pole objektů Screen popisující obrazovky protnuté daným obdélníkem. Obdélník předaný této metodě je vyjádřen souřadnicemi v obrazových bodech na virtuální pracovní ploše. Pokud žádné obrazovky neprotínají daný obdélník, pak je pole prázdné. Tuto metodu můžete použít ke zjištění, na kterých obrazovkách je zobrazeno okno. Hodnoty vrácené metodami a vlastnostmi třídy Screen není vhodné ukládat. Uživatel nebo operační systém může kdykoli změnit dostupné obrazovky a jejich uspořádání. V následujícím příkladu je rozhraní API obrazovky použito k přesouvání okna mezi několika obrazovkami vyvolanému stisknutím kláves se šipkami. Aby mohlo být okno přesunuto na další obrazovku, je v příkladu získáno pole screens, které je tříděno vertikálně nebo horizontálně (podle stisknuté klávesy se šipkou). Kód pak prochází roztříděným polem a porovnává jednotlivé obrazovky se souřadnicemi aktuální obrazovky. Aby byla identifikována aktuální obrazovka okna, je v příkladu vyvolána metoda Screen.getScreensForRectangle() procházející ohraničením okna. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 76 Obrazovky package { import import import import import import flash.display.Sprite; flash.display.Screen; flash.events.KeyboardEvent; flash.ui.Keyboard; flash.display.StageAlign; flash.display.StageScaleMode; public class ScreenExample extends Sprite { public function ScreenExample() { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey); } private function onKey(event:KeyboardEvent):void{ if(Screen.screens.length > 1){ switch(event.keyCode){ case Keyboard.LEFT : moveLeft(); break; case Keyboard.RIGHT : moveRight(); break; case Keyboard.UP : moveUp(); break; case Keyboard.DOWN : moveDown(); break; } } } private function moveLeft():void{ var currentScreen = getCurrentScreen(); var left:Array = Screen.screens; left.sort(sortHorizontal); for(var i:int = 0; i < left.length - 1; i++){ if(left[i].bounds.left < stage.nativeWindow.bounds.left){ stage.nativeWindow.x += left[i].bounds.left - currentScreen.bounds.left; stage.nativeWindow.y += left[i].bounds.top - currentScreen.bounds.top; } } } private function moveRight():void{ var currentScreen:Screen = getCurrentScreen(); var left:Array = Screen.screens; left.sort(sortHorizontal); for(var i:int = left.length - 1; i > 0; i--){ if(left[i].bounds.left > stage.nativeWindow.bounds.left){ stage.nativeWindow.x += VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 77 Obrazovky left[i].bounds.left - currentScreen.bounds.left; stage.nativeWindow.y += left[i].bounds.top - currentScreen.bounds.top; } } } private function moveUp():void{ var currentScreen:Screen = getCurrentScreen(); var top:Array = Screen.screens; top.sort(sortVertical); for(var i:int = 0; i < top.length - 1; i++){ if(top[i].bounds.top < stage.nativeWindow.bounds.top){ stage.nativeWindow.x += top[i].bounds.left - currentScreen.bounds.left; stage.nativeWindow.y += top[i].bounds.top - currentScreen.bounds.top; break; } } } private function moveDown():void{ var currentScreen:Screen = getCurrentScreen(); var top:Array = Screen.screens; top.sort(sortVertical); for(var i:int = top.length - 1; i > 0; i--){ if(top[i].bounds.top > stage.nativeWindow.bounds.top){ stage.nativeWindow.x += top[i].bounds.left - currentScreen.bounds.left; stage.nativeWindow.y += top[i].bounds.top - currentScreen.bounds.top; break; } } } private function sortHorizontal(a:Screen,b:Screen):int{ if (a.bounds.left > b.bounds.left){ return 1; } else if (a.bounds.left < b.bounds.left){ return -1; } else {return 0;} } private function sortVertical(a:Screen,b:Screen):int{ if (a.bounds.top > b.bounds.top){ return 1; } else if (a.bounds.top < b.bounds.top){ return -1; } else {return 0;} } private function getCurrentScreen():Screen{ var current:Screen; var screens:Array = Screen.getScreensForRectangle(stage.nativeWindow.bounds); (screens.length > 0) ? current = screens[0] : current = Screen.mainScreen; return current; } } } 78 Kapitola 12: Práce s nativními nabídkami Třídy v nativní nabídce rozhraní API slouží k definování nabídek aplikace, nabídek okna, kontextových nabídek a rozbalovacích nabídek. Další informace o nativních nabídkách online Více informací týkajících se nativních nabídek rozhraní API a práce s nativními nabídkami naleznete v následujících zdrojích: Rychlé úvody (Adobe AIR Developer Connection) • Přidávání nativních nabídek do aplikace AIR Referenční příručka jazyka • NativeMenu • NativeMenuItem Články a ukázky aplikace Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (hledat „nabídky AIR“) Základní koncepce nabídky AIR Třídy nativních nabídek umožňují přístup k funkcím nativních nabídek operačního systému, v němž je aplikace spuštěna. Objekty NativeMenu lze použít pro nabídky aplikace (k dispozici v systému Mac OS X), nabídky okna (k dispozici v systému Windows), kontextové nabídky a rozbalovací nabídky. Třídy nabídek AIR Třídy nabídek aplikace Adobe® AIR™ zahrnují: Balíček Třídy flash.display • NativeMenu • NativeMenuItem • ContextMenu • ContextMenuItem • Událost • ContextMenuEvent flash.ui flash.events VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 79 Práce s nativními nabídkami Druhy nabídek Aplikace AIR podporuje následující typy nabídek: Nabídky aplikace Nabídka aplikace je globální nabídka, která se vztahuje k celé aplikaci. Nabídky aplikace jsou podporovány v systému Mac OS X, ale ne v systému Windows. V systému Mac OS X vytvoří operační systém nabídku aplikace automaticky. Pomocí nabídky rozhraní API aplikace AIR lze do standardních nabídek přidávat položky a podnabídky. Je možné přidat posluchače pro zpracování existujících příkazů nabídky. Nebo lze odstranit existující položky. Nabídky okna Nabídka okna je spojena s jediným oknem a zobrazuje se pod titulním pruhem. Do okna lze přidávat nabídky vytvořením objektu NativeMenu a jeho přiřazením k vlastnosti menu objektu NativeWindow. Nabídky okna jsou podporovány v systému Windows, ale ne v systému Mac OS X. Nativní nabídky lze používat pouze u oken, jež mají standardní systémové prvky. Kontextové nabídky Kontextové nabídky se otevírají po klepnutí na interaktivní objekt v obsahu SWF nebo na element dokumentu v obsahu HTML pravým tlačítkem myši nebo se stisknutou klávesou Apple. Kontextovou nabídku lze vytvořit pomocí třídy NativeMenu aplikace AIR. (Rovněž je možné použít starší třídu ContextMenu aplikace Adobe® Flash®.) Do obsahu HTML lze kontextové nabídky přidávat pomocí Webkit HTML a rozhraní API v jazyce JavaScript. Nabídky ikon ukotvení a hlavního panelu systému Tyto nabídky ikon se podobají kontextovým nabídkám a přiřazují se k ikoně aplikace v ukotvení systému Mac OS X nebo v oznamovací oblasti systému Windows. Nabídky ikony ukotvení a hlavního panelu systému používají třídu NativeMenu. V systému Mac OS X se položky v nabídce přidávají nad standardní položky operačního systému. V systému Windows žádná standardní nabídka neexistuje. Rozbalovací nabídky Rozbalovací nabídka aplikace AIR je jako kontextová nabídka, ale nemusí být nutně spojena s určitým objektem nebo komponentou aplikace. Rozbalovací nabídky lze zobrazit kdekoliv v okně vyvoláním metody display() objektu NativeMenu. Vlastní nabídky Nativní nabídky kreslí výhradně operační systém a jako takové existují mimo vykreslovací modely Flash a HTML. Máte možnost vytvářet vlastní nenativní nabídky pomocí jazyka MXML, ActionScript nebo JavaScript. Třídy nabídek aplikace AIR neposkytují žádné prostředky pro řízení kreslení nativních nabídek. Výchozí nabídky Operační systém nebo vestavěná třída AIR poskytuje tyto výchozí nabídky: • Nabídka aplikace v systému Mac OS X • Nabídka ikony ukotvení v systému Mac OS X • Kontextová nabídka pro vybraný text a obrázky v obsahu HTML • Kontextová nabídka pro vybraný text v objektu TextField (nebo v objektu rozšiřujícím třídu TextField) Struktura nabídek Nabídky jsou ve své podstatě hierarchické. Objekty NativeMenu obsahují podřízené objekty NativeMenuItem. Objekty NativeMenuItem, jež představují podnabídky, zase mohou obsahovat objekty NativeMenu. Objekt nabídky na nejvyšší nebo kořenové úrovni ve struktuře představuje pruh nabídek pro nabídky aplikace a okna. (Kontextové nabídky, nabídky ikon a rozbalovací nabídky pruh nabídek nemají.) VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 80 Práce s nativními nabídkami Následující schéma znázorňuje strukturu typické nabídky. Kořenová nabídka představuje pruh nabídek a obsahuje dvě položky nabídky odkazující na podnabídku File a podnabídku Edit. Podnabídka File v této struktuře obsahuje dvě položky příkazů a jednu položku odkazující na podnabídku Open Recent Menu, která samotná obsahuje tři položky. Podnabídka Edit obsahuje tři příkazy a oddělovač. NativeMenu Root Menu NativeMenuItem “File” NativeMenu File Menu NativeMenuItem “New” NativeMenuItem “Save” NativeMenuItem “Open Recent” NativeMenu NativeMenuItem NativeMenu Open Recent Menu NativeMenuItem “GreatGatsby.pdf” NativeMenuItem “WarAndPeace.pdf” NativeMenuItem “Iliad.pdf” “Edit” Edit Menu NativeMenuItem “Copy” NativeMenuItem “Paste” NativeMenuItem Separator NativeMenuItem “Preferences” Definice podnabídky vyžaduje objekt NativeMenu i NativeMenuItem. Objekt NativeMenuItem definuje popis zobrazený v nadřazené nabídce a umožňuje uživateli otevřít podnabídku. Objekt NativeMenu slouží jako kontejner pro položky v podnabídce. Objekt NativeMenuItem odkazuje na objekt NativeMenu pomocí vlastnosti submenu objektu NativeMenuItem. Chcete-li zobrazit vzorový kód, který vytvoří tuto nabídku, přečtěte si sekci „Příklad: Nabídka okna a aplikace“ na stránce 90. Události nabídky Oba objekty NativeMenu i NativeMenuItem odesílají události displaying a select: Displaying: Těsně před tím, než se zobrazí nabídka, odešle tato nabídka a její položky událost displaying do všech zaregistrovaných posluchačů. Událost displaying poskytuje možnost aktualizovat obsah nebo vzhled nabídky dříve, než se zobrazí uživateli. Například v posluchači pro událost displaying nabídky „Open Recent“ lze změnit položky nabídky, aby odrážely aktuální seznam nedávno prohlížených dokumentů. Vlastnost target objektu události je vždy nabídka, jež má být zobrazena. currentTarget je objekt, u kterého je zaregistrován posluchač: buď samotná nabídka, nebo jedna z jejích položek. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 81 Práce s nativními nabídkami Poznámka: Událost displaying se rovněž odešle při každém přístupu do stavu nabídky nebo některé z jejích položek. Select: Když uživatel zvolí položku příkazu, odešle položka událost select do všech zaregistrovaných posluchačů. Položky podnabídky a oddělovač není možné vybrat, proto nikdy neodešlou událost select. Událost select probublá z položky nabídky do nabídky, která ji obsahuje, až ke kořenové nabídce. Události select lze poslouchat přímo u položky a na vyšších úrovních ve struktuře nabídky. Při poslouchání události select v nabídce lze určit vybranou položku pomocí vlastnosti target. S tím, jak událost probublává hierarchií nabídky, vlastnost currentTarget objektu události určuje aktuální objekt nabídky. Poznámka: Objekty ContextMenu a ContextMenuItem odesílají události menuItemSelect a menuSelect, jakož i události select a displaying. Klávesové ekvivalenty příkazů nabídky K příkazu nabídky je možné přiřadit klávesový ekvivalent (někdy označovaný jako klávesová zkratka). Po stisku této klávesy nebo kombinace kláves odešle položka nabídky událost select do všech zaregistrovaných posluchačů. Nabídka obsahující tuto položku musí být součástí nabídky aplikace nebo aktivního okna, aby se příkaz vyvolal. Klávesové ekvivalenty mají dvě části: řetězec představující primární klávesu a pole modifikačních kláves, které musí být také stisknuty. Chcete-li přiřadit primární klávesu, nastavte vlastnost keyEquivalent dané položky nabídky na řetězec s jediným znakem pro tuto klávesu. Použijete-li velké písmeno, přidá se do pole modifikátoru automaticky klávesa Shift. V systému Mac OS X je výchozím modifikátorem klávesa Apple (Keyboard.COMMAND). V systému Windows je to klávesa Ctrl (Keyboard.CONTROL). Tyto výchozí klávesy se automaticky přidají do pole modifikátoru. Jestliže chcete přiřadit jiné modifikační klávesy, přiřaďte k vlastnosti keyEquivalentModifiers nové pole obsahující požadované kódy kláves. Výchozí pole se přepíše. Bez ohledu na to, zda použijete výchozí modifikátory nebo přiřadíte vlastní pole modifikátoru, pokud bude řetězcem přiřazeným k vlastnosti keyEquivalent velké písmeno, přidá se klávesa Shift. Konstanty pro kódy kláves, které se mají použít pro modifikační klávesy, jsou definovány ve třídě Keyboard. Přiřazený řetězec klávesového ekvivalentu se automaticky zobrazí vedle názvu položky nabídky. Formát závisí na operačním systému uživatele a na předvolbách systému. Poznámka: Jestliže v operačním systému Windows přiřadíte poli modifikační klávesy hodnotu Keyboard.COMMAND, nezobrazí se v nabídce žádný klávesový ekvivalent. Příkaz nabídky však bude nezbytné aktivovat pomocí klávesy Ctrl. V následujícím příkladu se položce nabídky přiřadí klávesový ekvivalent Ctrl+Shift+G: var item:NativeMenuItem = new NativeMenuItem("Ungroup"); item.keyEquivalent = "G"; V tomto příkladu se přiřadí klávesový ekvivalent Ctrl+Shift+G přímo nastavením pole modifikátoru: var item:NativeMenuItem = new NativeMenuItem("Ungroup"); item.keyEquivalent = "G"; item.keyEquivalentModifiers = [Keyboard.CONTROL]; Poznámka: Klávesové ekvivalenty se spouští pouze u nabídek aplikace a okna. Přidáte-li klávesový ekvivalent ke kontextové nebo rozbalovací nabídce, zobrazí se klávesový ekvivalent v popisu nabídky, ale připojený příkaz nabídky se nikdy nevyvolá. Mnemotechnické značky Mnemotechnické značky jsou součástí rozhraní klávesnice operačního systému k nabídkám. V obou systémech Mac OS X i Windows může uživatel otevírat nabídky a volit příkazy pomocí klávesnice, jsou zde však drobné rozdíly. V systému Mac OS X uživatel zadá první jedno nebo dvě písmena nabídky nebo příkazu a potom zadá zpětnou klávesu. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 82 Práce s nativními nabídkami V systému Windows je významné jen jedno písmeno. Standardně je tímto významným písmenem první znak v popisu, pokud však přiřadíte položce nabídky mnemotechnickou značku, stane se významným písmenem označené písmeno. Mají-li dvě položky v nabídce stejný významný znak (bez ohledu na to, zda byla přiřazena mnemotechnická značka či nikoliv), je interakce mezi klávesnicí uživatele a nabídkou poněkud odlišná. Místo zvolení nabídky nebo příkazu stisknutím jediného písmene musí uživatel stisknout toto písmeno několikrát podle potřeby, až se zvýrazní požadovaná položka a potom výběr dokončit stisknutím klávesy Enter. Pro zachování stejného chování je vhodné u nabídek okna přiřadit jedinečnou mnemotechnickou značku ke každé položce v nabídce. Zadejte mnemotechnický znak jako index do řetězce popisu. Index prvního znaku v popisu je 0. Aby tedy bylo možné použít „r“ jako mnemotechnickou značku pro položku nabídky označenou popisem „Format“, je třeba nastavit vlastnost mnemonicIndex na hodnotu 2. var item:NativeMenuItem = new NativeMenuItem("Format"); item.mnemonicIndex = 2; Stav položek nabídky Položky nabídky mají dvě vlastnosti stavu, checked a enabled: checked Po nastavení na hodnotu true se vedle popisu položky zobrazí značka zaškrtnutí. var item:NativeMenuItem = new NativeMenuItem("Format"); item.checked = true; enabled Přepínáním mezi hodnotami true a false lze určit, zda je příkaz aktivován. Neaktivní položky jsou zobrazeny „šedě“ a neodesílají události select. var item:NativeMenuItem = new NativeMenuItem("Format"); item.enabled = false; Přiřazení objektu k položce nabídky Vlastnost data třídy NativeMenuItem umožňuje vytvoření odkazu na libovolný objekt v jednotlivých položkách. Například v nabídce „Open Recent“ lze pro jednotlivé dokumenty přiřadit k jednotlivým položkám nabídky objekt File. var file:File = File.applicationStorageDirectory.resolvePath("GreatGatsby.pdf") var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name)); menuItem.data = file; Vytváření nativních nabídek V tomto tématu je popsán způsob vytváření různých typů nativních nabídek podporovaných aplikací AIR. Vytvoření objektu kořenové nabídky Chcete-li vytvořit objekt NativeMenu, který má sloužit jako kořen nabídky, učiňte tak pomocí konstruktoru NativeMenu: var root:NativeMenu = new NativeMenu(); U nabídek aplikace a okna představuje kořenová nabídka pruh nabídek a měla by obsahovat pouze položky, které otevírají podnabídky. Kontextové a rozbalovací nabídky žádný pruh nabídek nemají, proto může kořenová nabídka kromě podnabídek obsahovat i příkazy a oddělovače. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 83 Práce s nativními nabídkami Po vytvoření nabídky lze přidat položky nabídky. Položky budou v nabídce zobrazeny ve stejném pořadí, v jakém byly přidány, pokud jim nebude pomocí metody addItemAt() objektu nabídky přiřazen specifický index. Nabídku je možné přiřadit jako nabídku aplikace, okna, ikony nebo kontextovou nabídku nebo ji lze zobrazit jako rozbalovací nabídku, jak je znázorněno v následujících sekcích. Nastavení nabídky aplikace NativeApplication.nativeApplication.menu = root; Poznámka: Systém Mac OS X definuje nabídku obsahující standardní položky pro jednotlivé aplikace. Po přiřazení nového objektu NativeMenu k vlastnosti menu objektu NativeApplication bude nahrazena standardní nabídka. Standardní nabídku je rovněž možné místo jejího nahrazení využít. Nastavení nabídky okna nativeWindowObject.menu = root; Nastavení kontextové nabídky u interaktivního objektu interactiveObject.contextMenu = root; Nastavení nabídky ikony ukotvení DockIcon(NativeApplication.nativeApplication.icon).menu = root; Poznámka: Systém Mac OS X definuje standardní nabídku pro ikonu ukotvení aplikace. Po přiřazení nového objektu NativeMenu k vlastnosti menu objektu DockIcon budou položky v této nabídce zobrazeny nad standardními položkami. Standardní položky nabídky není možné odstranit, upravit ani k nim nelze získat přístup. Nastavení nabídky ikony hlavního panelu systému SystemTrayIcon(NativeApplication.nativeApplication.icon).menu = root; Zobrazení nabídky jako rozbalovací nabídky root.display(stage, x, y); Vytvoření podnabídky Chcete-li vytvořit podnabídku, přidáte do nadřazené nabídky objekt NativeMenuItem a potom přiřadíte objekt NativeMenu definující podnabídku k vlastnosti submenu dané položky. Aplikace AIR poskytuje dva způsoby vytváření položek podnabídky a s nimi spojených objektů nabídky: Položku nabídky a s ní spojený objekt nabídky lze vytvořit v jednom kroku pomocí metody addSubmenu(): var editMenuItem:NativeMenuItem = root.addSubmenu(new NativeMenu(), "Edit"); Rovněž je možné vytvořit položku nabídky a přiřadit objekt nabídky k její vlastnosti submenu v samostatných krocích: var editMenuItem:NativeMenuItem = root.addItem("Edit", false); editMenuItem.submenu = new NativeMenu(); Vytvoření příkazu nabídky Jestliže chcete vytvořit příkaz nabídky, přidejte do nabídky objekt NativeMenuItem a přidejte posluchače událostí, který bude odkazovat na funkci implementující příkaz nabídky: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 84 Práce s nativními nabídkami var copy:NativeMenuItem = new NativeMenuItem("Copy", false); copy.addEventListener(Event.SELECT, onCopyCommand); editMenu.addItem(copy); Událost select je možné poslouchat u samotné položky příkazu (jak je znázorněno v příkladu) nebo lze událost select poslouchat u objektu nadřazené nabídky. Poznámka: Položky nabídky představující podnabídky a oddělovače neodesílají události select, proto je nelze použít jako příkazy. Vytvoření oddělovače nabídky Pokud chcete vytvořit oddělovač, vytvořte objekt NativeMenuItem a nastavte v konstruktoru parametr isSeparator na hodnotu true. Potom přidejte položku oddělovače na požadované místo v nabídce: var separatorA:NativeMenuItem = new NativeMenuItem("A", true); editMenu.addItem(separatorA); Popis určený pro oddělovač, pokud existuje, se nezobrazuje: Kontextové nabídky V obsahu SWF lze jakémukoliv objektu, který dědí z objektu InteractiveObject, přidat kontextovou nabídku přiřazením objektu nabídky k jeho vlastnosti contextMenu. Objekt nabídky přiřazený k vlastnosti contextMenu může být typu NativeMenu nebo ContextMenu. U starších tříd kontextové nabídky rozhraní API lze použít existující kód jazyka ActionScript, který již obsahuje kontextové nabídky. V případě použití třídy ContextMenu je nezbytné spolu s ní použít třídu ContextMenuItem; nelze přidávat objekty NativeMenuItem k objektu ContextMenu ani objekty ContextMenuItem k objektu NativeMenu. Hlavní nevýhodou použití kontextové nabídky rozhraní API je to, že nepodporuje podnabídky. Přestože třída ContextMenu zahrnuje metody, jako je např. addItem(), které jsou zděděné z třídy NativeMenu, tyto metody přidávají položky k nesprávnému poli položek. V kontextové nabídce musí být všechny položky přidány k poli customItems, nikoliv k poli položky. Buď použijte objekty NativeMenu pro kontextové nabídky, nebo použijte pouze nezděděné metody a vlastnosti třídy ContextMenu pro přidávání a správu položek v nabídce. Následující příklad vytvoří objekt Sprite a přidá jednoduchou kontextovou nabídku pro úpravy: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 85 Práce s nativními nabídkami var sprite:Sprite = new Sprite(); sprite.contextMenu = createContextMenu() private function createContextMenu():ContextMenu{ var editContextMenu:ContextMenu = new ContextMenu(); var cutItem:ContextMenuItem = new ContextMenuItem("Cut") cutItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCutCommand); editContextMenu.customItems.push(cutItem); var copyItem:ContextMenuItem = new ContextMenuItem("Copy") copyItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCopyCommand); editContextMenu.customItems.push(copyItem); var pasteItem:ContextMenuItem = new ContextMenuItem("Paste") pasteItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doPasteCommand); editContextMenu.customItems.push(pasteItem); return editContextMenu } private function doCutCommand(event:ContextMenuEvent):void{trace("cut");} private function doCopyCommand(event:ContextMenuEvent):void{trace("copy");} private function doPasteCommand(event:ContextMenuEvent):void{trace("paste");} Poznámka: Na rozdíl od obsahu SWF zobrazeného v prostředí prohlížeče nemají kontextové nabídky v aplikaci AIR žádné vestavěné příkazy. Kontextové nabídky v HTML V obsahu HTML lze pomocí události contextmenu zobrazit kontextovou nabídku. Kontextová nabídka se ve výchozím nastavení zobrazí automaticky po vyvolání události kontextové nabídky u vybraného textu (klepnutím na text pravým tlačítkem myši nebo se stisknutou klávesou Apple). Otevření výchozí nabídky je možné zamezit posloucháním události contextmenu a vyvoláním metody preventDefault() objektu události: function showContextMenu(event){ event.preventDefault(); } Potom lze zobrazit vlastní kontextovou nabídku pomocí metod DHTML nebo zobrazením nativní kontextové nabídky aplikace AIR. V následujícím příkladu se zobrazí nativní kontextová nabídka vyvoláním metody display() nabídky v odezvě na událost contextmenu HTML: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 86 Práce s nativními nabídkami <html> <head> <script src="AIRAliases.js" language="JavaScript" type="text/javascript"></script> <script language="javascript" type="text/javascript"> function showContextMenu(event){ event.preventDefault(); contextMenu.display(window.nativeWindow.stage, event.clientX, event.clientY); } function createContextMenu(){ var menu = new air.NativeMenu(); var command = menu.addItem(new air.NativeMenuItem("Custom command")); command.addEventListener(air.Event.SELECT, onCommand); return menu; } function onCommand(){ air.trace("Context command invoked."); } var contextMenu = createContextMenu(); </script> </head> <body> <p oncontextmenu="showContextMenu(event)" style="-khtml-user-select:auto;">Custom context menu.</p> </body> </html> Definování nativních nabídek deklarativním způsobem Kódování vlastností nabídky a položek nabídky může být poměrně pracné. Jelikož však mají nabídky přirozenou hierarchickou strukturu, je jednodušší napsat funkci, která vytvoří nabídky pomocí definice ve formátu XML. Následující třída rozšiřuje třídu NativeMenu, pomocí objektu XML ve svém konstruktoru, právě pro provedení této operace: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 87 Práce s nativními nabídkami package { import flash.display.NativeMenu; import flash.display.NativeMenuItem; import flash.events.Event; public class DeclarativeMenu extends NativeMenu { public function DeclarativeMenu(XMLMenuDefinition:XML):void { super(); addChildrenToMenu(this, XMLMenuDefinition.children()); } private function addChildrenToMenu(menu:NativeMenu, children:XMLList):NativeMenuItem { var menuItem:NativeMenuItem; var submenu:NativeMenu; for each (var child:XML in children) { if (String(child.@label).length > 0) { menuItem = new NativeMenuItem(child.@label); menuItem.name = child.name(); } else { menuItem = new NativeMenuItem(child.name()); menuItem.name = child.name(); } menu.addItem(menuItem); if (child.children().length() > 0) { menuItem.submenu = new NativeMenu(); addChildrenToMenu(menuItem.submenu,child.children()); } } return menuItem; } } //End class } //End package Chcete-li vytvořit nabídku pomocí této třídy, předejte definici nabídky XML následujícím způsobem: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 88 Práce s nativními nabídkami var menuDefinition:XML = <root> <FileMenu label='File'> <NewMenu label='New'> <NewTextFile label='Text file'/> <NewFolder label='Folder'/> <NewProject label='Project'/> </NewMenu> <OpenCommand label='Open'/> <SaveCommand label='Save'/> </FileMenu> <EditMenu label='Edit'> <CutCommand label='Cut'/> <CopyCommand label='Copy'/> <PasteCommand label='Paste'/> </EditMenu> <FoodItems label='Food Items'> <Jellyfish/> <Tripe/> <Gizzard/> </FoodItems> </root>; var test:DeclarativeMenu = new DeclarativeMenu(menuDefinition); Jestliže chcete poslouchat události nabídky, je možné poslouchat na úrovni kořenové nabídky a pomocí vlastnosti event.target.name určit, který příkaz byl zvolen. Rovněž je možné vyhledat položky v nabídce podle názvu a přidat posluchače jednotlivých událostí. Zobrazení rozbalovacích nabídek Kterýkoliv objekt NativeMenu lze zobrazit v libovolném čase a na libovolném místě nad oknem, vyvoláním metody display() nabídky. Tato metoda vyžaduje odkaz na plochu, proto pouze obsah v aplikační karanténě může zobrazit nabídku jako rozbalovací. Následující metoda zobrazí nabídku definovanou objektem NativeMenu s názvem popupMenu v reakci na klepnutí myší: private function onMouseClick(event:MouseEvent):void { popupMenu.display(event.target.stage, event.stageX, event.stageY); } Poznámka: Nabídku není nutné zobrazit jako bezprostřední reakci na událost. Funkci display() může vyvolat kterákoliv metoda. Zpracování událostí nabídky Nabídka odesílá události, když uživatel zvolí nabídku nebo když zvolí položku nabídky. Souhrn událostí pro třídy nabídky K nabídkám nebo k jednotlivým položkám přidejte posluchače událostí pro zpracování událostí nabídky. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 89 Práce s nativními nabídkami Objekt Odeslané události NativeMenu NativeMenuEvent.DISPLAYING NativeMenuEvent.SELECT (přenesena z podřízených položek a podnabídek) NativeMenuItem NativeMenuEvent.SELECT NativeMenuEvent.DISPLAYING (přenesena z nadřízené nabídky) ContextMenu ContextMenuEvent.MENU_SELECT ContextMenuItem ContextMenuEvent.MENU_ITEM_SELECT NativeMenu.SELECT Výběr událostí nabídky Chcete-li zpracovávat klepnutí na položku nabídky, přidejte k objektu NativeMenuItem posluchače událostí pro událost select: var menuCommandX:NativeMenuItem = new NativeMenuItem("Command X"); menuCommand.addEventListener(Event.SELECT, doCommandX) Vzhledem k tomu, že události select probublávají do nabídek, které je obsahují, lze události select poslouchat i v nadřazené nabídce. Při poslouchání na úrovni nabídky lze určit, který příkaz nabídky byl zvolen, pomocí vlastnosti target objektu události. V následujícím příkladu se sleduje popis zvoleného příkazu: var colorMenuItem:NativeMenuItem = new NativeMenuItem("Choose a color"); var colorMenu:NativeMenu = new NativeMenu(); colorMenuItem.submenu = colorMenu; var red:NativeMenuItem = new NativeMenuItem("Red"); var green:NativeMenuItem = new NativeMenuItem("Green"); var blue:NativeMenuItem = new NativeMenuItem("Blue"); colorMenu.addItem(red); colorMenu.addItem(green); colorMenu.addItem(blue); if(NativeApplication.supportsMenu){ NativeApplication.nativeApplication.menu.addItem(colorMenuItem); NativeApplication.nativeApplication.menu.addEventListener(Event.SELECT, colorChoice); } else if (NativeWindow.supportsMenu){ var windowMenu:NativeMenu = new NativeMenu(); this.stage.nativeWindow.menu = windowMenu; windowMenu.addItem(colorMenuItem); windowMenu.addEventListener(Event.SELECT, colorChoice); } function colorChoice(event:Event):void { var menuItem:NativeMenuItem = event.target as NativeMenuItem; trace(menuItem.label + " has been selected"); } Při použití třídy ContextMenuItem je možné poslouchat buď událost select, nebo událost menuItemSelect. Událost menuItemSelect poskytuje dodatečné informace o objektu, k němuž kontextová nabídka patří, ale neprobublává do nabídek, které ji obsahují. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 90 Práce s nativními nabídkami Zobrazení událostí nabídky Jestliže chcete řídit otevření nabídky, můžete přidat posluchače pro událost displaying, která se odešle před zobrazením nabídky. Pomocí události displaying lze nabídku aktualizovat například přidáním či odstraněním položek nebo aktualizací stavů aktivace nebo zvolení jednotlivých položek. Příklad: Nabídka okna a aplikace Následující příklad vytvoří nabídku zobrazenou v sekci „Struktura nabídek“ na stránce 79. Nabídka je vytvořena tak, aby fungovala jak v systému Windows, pro který jsou podporovány nabídky okna, tak i v systému Mac OS X, pro který jsou podporovány pouze nabídky aplikace. Kvůli jejich rozlišení zaškrtne konstruktor třídy MenuExample statické vlastnosti supportsMenu tříd NativeWindow a NativeApplication. Pokud je vlastnost NativeWindow.supportsMenu nastavena na hodnotu true, vytvoří konstruktor pro okno objekt NativeMenu a potom vytvoří a přidá podnabídky File a Edit. Jestliže je vlastnost NativeApplication.supportsMenu nastavena na hodnotu true, pak konstruktor vytvoří a přidá nabídky File a Edit do existující nabídky poskytnuté operačním systémem Mac OS X. Tento příklad rovněž znázorňuje zpracování událostí nabídky. Událost select se zpracovává na úrovni položky a také na úrovni nabídky. Na událost select reaguje každá nabídka v řetězci, od nabídky obsahující vybranou položku až po kořenovou nabídku. Událost displaying se používá u nabídky „Open Recent“. Těsně před otevřením nabídky se položky v nabídce obnoví z aktuálního pole dokumentů (které se v tomto příkladu ve skutečnosti nezmění). Přestože to v tomto příkladu není znázorněno, u jednotlivých položek lze rovněž poslouchat události displaying. package { import import import import import import import flash.display.NativeMenu; flash.display.NativeMenuItem; flash.display.NativeWindow; flash.display.Sprite; flash.events.Event; flash.filesystem.File; flash.desktop.NativeApplication; public class MenuExample extends Sprite { private var recentDocuments:Array = new Array(new File("app-storage:/GreatGatsby.pdf"), new File("app-storage:/WarAndPeace.pdf"), new File("app-storage:/Iliad.pdf")); public function MenuExample() { var fileMenu:NativeMenuItem; var editMenu:NativeMenuItem; if (NativeWindow.supportsMenu){ stage.nativeWindow.menu = new NativeMenu(); stage.nativeWindow.menu.addEventListener(Event.SELECT, selectCommandMenu); fileMenu = stage.nativeWindow.menu.addItem(new NativeMenuItem("File")); fileMenu.submenu = createFileMenu(); editMenu = stage.nativeWindow.menu.addItem(new NativeMenuItem("Edit")); editMenu.submenu = createEditMenu(); } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 91 Práce s nativními nabídkami if (NativeApplication.supportsMenu){ NativeApplication.nativeApplication.menu.addEventListener(Event.SELECT, selectCommandMenu); fileMenu = NativeApplication.nativeApplication.menu.addItem(new NativeMenuItem("File")); fileMenu.submenu = createFileMenu(); editMenu = NativeApplication.nativeApplication.menu.addItem(new NativeMenuItem("Edit")); editMenu.submenu = createEditMenu(); } } public function createFileMenu():NativeMenu { var fileMenu:NativeMenu = new NativeMenu(); fileMenu.addEventListener(Event.SELECT, selectCommandMenu); var newCommand:NativeMenuItem = fileMenu.addItem(new NativeMenuItem("New")); newCommand.addEventListener(Event.SELECT, selectCommand); var saveCommand:NativeMenuItem = fileMenu.addItem(new NativeMenuItem("Save")); saveCommand.addEventListener(Event.SELECT, selectCommand); var openRecentMenu:NativeMenuItem = fileMenu.addItem(new NativeMenuItem("Open Recent")); openRecentMenu.submenu = new NativeMenu(); openRecentMenu.submenu.addEventListener(Event.DISPLAYING, updateRecentDocumentMenu); openRecentMenu.submenu.addEventListener(Event.SELECT, selectCommandMenu); return fileMenu; } public function createEditMenu():NativeMenu { var editMenu:NativeMenu = new NativeMenu(); editMenu.addEventListener(Event.SELECT, selectCommandMenu); var copyCommand:NativeMenuItem = editMenu.addItem(new NativeMenuItem("Copy")); copyCommand.addEventListener(Event.SELECT, selectCommand); copyCommand.keyEquivalent = "c"; var pasteCommand:NativeMenuItem = editMenu.addItem(new NativeMenuItem("Paste")); pasteCommand.addEventListener(Event.SELECT, selectCommand); pasteCommand.keyEquivalent = "v"; editMenu.addItem(new NativeMenuItem("", true)); var preferencesCommand:NativeMenuItem = editMenu.addItem(new NativeMenuItem("Preferences")); preferencesCommand.addEventListener(Event.SELECT, selectCommand); return editMenu; } private function updateRecentDocumentMenu(event:Event):void { trace("Updating recent document menu."); var docMenu:NativeMenu = NativeMenu(event.target); for each (var item:NativeMenuItem in docMenu.items) { docMenu.removeItem(item); } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 92 Práce s nativními nabídkami for each (var file:File in recentDocuments) { var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name)); menuItem.data = file; menuItem.addEventListener(Event.SELECT, selectRecentDocument); } } private function selectRecentDocument(event:Event):void { trace("Selected recent document: " + event.target.data.name); } private function selectCommand(event:Event):void { trace("Selected command: " + event.target.label); } private function selectCommandMenu(event:Event):void { if (event.currentTarget.parent != null) { var menuItem:NativeMenuItem = findItemForMenu(NativeMenu(event.currentTarget)); if (menuItem != null) { trace("Select event for \"" + event.target.label + "\" command handled by menu: " + menuItem.label); } } else { trace("Select event for \"" + event.target.label + "\" command handled by root menu."); } } private function findItemForMenu(menu:NativeMenu):NativeMenuItem { for each (var item:NativeMenuItem in menu.parent.items) { if (item != null) { if (item.submenu == menu) { return item; } } } return null; } } } 93 Kapitola 13: Ikony na hlavním panelu Mnohé operační systémy poskytují hlavní panel, např. dock v systému Mac OS X, který může obsahovat ikony zastupující různé aplikace. Aplikace Adobe® AIR® poskytuje rozhraní pro interakci s ikonami hlavního panelu aplikace prostřednictvím vlastnosti NativeApplication.nativeApplication.icon. Doplňující online informace o ikonách na hlavním panelu Další informace o práci s hlavními panely můžete získat z následujících zdrojů: Rychlé úvody (Adobe AIR Developer Connection) • Používání ikon oznamovací oblasti a doku Referenční příručka jazyka • DockIcon • SystemTrayIcon Články a Ukázky k Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (hledání „ikon hlavního panelu aplikace AIR“) O ikonách na hlavním panelu Aplikace AIR automaticky vytvoří objekt NativeApplication.nativeApplication.icon. Typ objektu je buď DockIcon nebo SystemTrayIcon, podle operačního systému. Můžete určit, které z těchto podtříd InteractiveIcon, které aplikace AIR podporuje na aktuálním operačním systému používajícím vlastnosti NativeApplication.supportsDockIcon a NativeApplication.supportsSystemTrayIcon. Základní třída InteractiveIcon poskytuje vlastnosti width, height a bitmaps, které můžete použít ke změně obrazu používaného pro ikonu. Avšak přístup k vlastnostem náležejícím k třídě DockIcon, resp. SystemTrayIcon v nesprávném operačním systému generuje chybu za běhu. Chcete-li nastavit obraz pro použití pro ikonu, nastavte pole obsahující jeden nebo více obrazů a přiřaďte je k vlastnosti NativeApplication.nativeApplication.icon.bitmaps. Velikost ikon na hlavním panelu může být v různých operačních systémech různá. Chcete-li se vyhnout zhoršení kvality vlivem změny velikosti, můžete do pole bitmaps přidat více velikostí příslušných obrazů. Poskytnete-li více než jeden obraz, aplikace AIR zvolí velikost nejbližší aktuální velikosti zobrazení ikony na hlavním panelu a tuto velikost změní pouze v případě nutnosti. V následujícím příkladu je nastaven obraz pro ikonu hlavního panelu pomocí dvou obrazů: NativeApplication.nativeApplication.icon.bitmaps = [bmp16x16.bitmapData, bmp128x128.bitmapData]; Chcete-li změnit obraz ikony, přiřaďte k vlastnosti bitmaps pole obsahující nový obraz nebo obrazy. Ikonu můžete animovat změnou jejího obrazu v odpovědi na událost enterFrame nebo timer. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 94 Ikony na hlavním panelu Chcete-li odstranit ikonu z oznamovací oblasti systému Windows nebo obnovit výchozí vzhled ikony v systému Mac OS X, nastavte vlastnost bitmaps na prázdné pole: NativeApplication.nativeApplication.icon.bitmaps = []; Ikony doku Aplikace AIR podporuje ikony doku, když je vlastnost NativeApplication.supportsDockIcon nastavena na hodnotu true. Vlastnost NativeApplication.nativeApplication.icon představuje aplikační ikonu v doku (ne ikona doku okna). Poznámka: Aplikace AIR nepodporuje změnu ikon okna na doku v systému Mac OS X. Změny u aplikační ikony doku také platí, pouze dokud aplikace běží – jakmile je aplikace ukončena, ikona obnoví svůj běžný vzhled. Nabídky ikon doku Do standardní nabídky doku můžete přidávat příkazy tak, že vytvoříte objekt NativeMenu obsahující příkazy a přiřadíte jej k vlastnosti NativeApplication.nativeApplication.icon.menu. Položky v nabídce jsou zobrazeny nad standardními položkami nabídky ikony doku. Poskakování doku Vyvoláním metody NativeApplication.nativeApplication.icon.bounce() můžete ikonu doku přimět, aby poskočila. Nastavíte-li parametr bounce() priorityna informační, ikona jednou poskočí. Nastavíte-li jej na kritický, ikona bude poskakovat, dokud uživatel příslušnou aplikaci neaktivuje. Konstanty pro parametr priority jsou definovány ve třídě NotificationType. Poznámka: Ikona neposkočí, je-li aplikace již aktivní. Události ikony doku Jakmile klepnete na ikonu doku, objekt NativeApplication odešle událost invoke. Jestliže aplikace neběží, systém ji spustí. Jinak bude událost invoke doručena instanci běžící aplikace. Ikony oznamovací oblasti Aplikace AIR podporuje ikony oznamovací oblasti, když je vlastnost NativeApplication.supportsSystemTrayIcon nastavena na hodnotu true, což je v současné době pouze případ Windows. V systému Windows jsou ikony oznamovací oblasti zobrazeny v oznamovací oblasti hlavního panelu. Implicitně tam není zobrazena žádná ikona. Chcete-li v oblasti zobrazit nějakou ikonu, přiřaďte vlastnosti bitmaps ikony pole obsahující objekty BitmapData. Chcete-li změnit obraz ikony, přiřaďte k vlastnosti bitmaps pole obsahující nové obrazy. Chcete-li ikonu odstranit, nastavte vlastnost bitmaps na hodnotu null. Nabídky ikony oznamovací oblasti K ikoně oznamovací oblasti můžete přidat nabídku tak, že vytvoříte objekt NativeMenu a přiřadíte jej k vlastnosti NativeApplication.nativeApplication.icon.menu (operační systém neposkytuje žádnou výchozí nabídku). Do nabídky ikony oznamovací oblasti se dostanete, když klepnete pravým tlačítkem myši. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 95 Ikony na hlavním panelu Tipy nástrojů ikony oznamovací oblasti Přidejte k ikoně tip nástroje nastavením vlastnosti tipu nástroje: NativeApplication.nativeApplication.icon.tooltip = "Application name"; Události ikony oznamovací oblasti Objekt SystemTrayIcon, na který se odkazuje vlastnost NativeApplication.nativeApplication.icon, odešle událost ScreenMouseEvent pro události click, mouseDown, mouseUp, rightClick, rightMouseDown a rightMouseUp. Tyto události, spolu s nabídkou ikony, můžete použít, chcete-li uživatelům umožnit interakci s vaší aplikací, když nemá žádná viditelná okna. Příklad: Vytvoření aplikace bez oken V následujícím příkladu je vytvořena aplikace AIR, která má ikonu oznamovací oblasti, ale žádná viditelná okna. Ikona oznamovací oblasti má nabídku s jediným příkazem pro ukončení aplikace. package { import import import import import import import import import import flash.display.Loader; flash.display.NativeMenu; flash.display.NativeMenuItem; flash.display.NativeWindow; flash.display.Sprite; flash.desktop.DockIcon; flash.desktop.SystemTrayIcon; flash.events.Event; flash.net.URLRequest; flash.desktop.NativeApplication; public class SysTrayApp extends Sprite { public function SysTrayApp():void{ NativeApplication.nativeApplication.autoExit = false; var icon:Loader = new Loader(); var iconMenu:NativeMenu = new NativeMenu(); var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit")); exitCommand.addEventListener(Event.SELECT, function(event:Event):void { NativeApplication.nativeApplication.icon.bitmaps = []; NativeApplication.nativeApplication.exit(); }); if (NativeApplication.supportsSystemTrayIcon) { NativeApplication.nativeApplication.autoExit = false; icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete); icon.load(new URLRequest("icons/AIRApp_16.png")); var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 96 Ikony na hlavním panelu systray.tooltip = "AIR application"; systray.menu = iconMenu; } if (NativeApplication.supportsDockIcon){ icon.contentLoaderInfo.addEventListener(Event.COMPLETE,iconLoadComplete); icon.load(new URLRequest("icons/AIRApp_128.png")); var dock:DockIcon = NativeApplication.nativeApplication.icon as DockIcon; dock.menu = iconMenu; } stage.nativeWindow.close(); } private function iconLoadComplete(event:Event):void { NativeApplication.nativeApplication.icon.bitmaps = [event.target.content.bitmapData]; } } } Poznámka: V příkladu se předpokládá, že v podadresáři icons dané aplikace jsou obrazy s názvy AIRApp_16.png a AIRApp_128.png. (Ukázkové soubory ikony, které můžete zkopírovat do vaší projektové složky, jsou zahrnuty v SDK AIR.) Ikony hlavního panelu a tlačítka okna Zastoupení oken zmenšené na ikony jsou běžně zobrazena v oblasti okna hlavního panelu nebo doku, aby umožňovala uživateli snadný přístup k pozadí nebo minimalizovaným oknům. V doku systému Mac OS X je zobrazena ikona pro vaši aplikaci spolu s ikonami pro jednotlivá minimalizovaná okna. Na hlavním panelu systému Windows je zobrazeno tlačítko obsahující ikonu programu a název pro každé okno normálního typu ve vaší aplikaci. Zvýraznění tlačítka okna hlavního panelu Když je okno v pozadí, můžete uživateli oznámit, že se vyskytla nějaká zajímavá událost týkající se daného okna. V systému Mac OS X můžete uživatele informovat poskočením aplikační ikony doku (jak je popsáno v části „Poskakování doku“ na stránce 94). V systému Windows můžete zvýraznit tlačítko hlavního panelu okna vyvoláním metody notifyUser() instance NativeWindow. Naléhavost příslušného oznámení určuje parametr type předaný metodě: • NotificationType.CRITICAL: ikona okna bude blikat, dokud uživatel nepřepne příslušné okno do popředí. • NotificationType.INFORMATIONAL: ikona okna bude zvýrazněna měnící se barvou. Následující příkaz zvýrazní tlačítko hlavního panelu okna: stage.nativeWindow.notifyUser(NotificationType.CRITICAL); Vyvolání metody NativeWindow.notifyUser() v operačním systému, který nepodporuje oznamování na úrovni okna, nebude mít žádný účinek. Vlastnost NativeWindow.supportsNotification slouží k určení, zda je podporováno oznamování okna. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 97 Ikony na hlavním panelu Vytváření oken bez tlačítek nebo ikon hlavního panelu V operačním systému Windows se okna vytvořená s typy utility nebo lightweight nezobrazují na hlavním panelu. Na hlavním panelu se neobjevují ani neviditelná okna. Protože počáteční okno je nutně typu normal, aby byla vytvořena aplikace bez oken, která by se objevila na hlavním panelu, musíte počáteční okno buď zavřít nebo je ponechat neviditelné. Chcete-li zavřít všechna okna ve vaší aplikaci bez ukončení aplikace, nastavte před zavřením posledního okna vlastnost autoExit objektu NativeApplication na hodnotu false. Chcete-li jen zabránit, aby se počáteční okno stalo neviditelným, přidejte kód <visible>false</visible> k elementu <initalWindow> souboru deskriptoru aplikace (a nenastavujte vlastnost visible na hodnotu true ani nevolejte metodu activate() daného okna). V nových oknech otevřených aplikací nastavte vlastnost type objektu NativeWindowInitOption předaného konstruktoru okna na hodnotu NativeWindowType.UTILITY nebo NativeWindowType.LIGHTWEIGHT. V systému Mac OS X jsou okna, která jsou minimalizována, zobrazena na hlavním panelu doku. Chcete-li zabránit, aby byla minimalizovaná ikona zobrazena, tak okno skryjte, místo abyste jej minimalizovali. V následujícím příkladu je poslouchána událost změny vlastnosti nativeWindowDisplayState, která je zrušena, dojde-li k minimalizaci okna. Místo toho program zpracování nastaví vlastnost visible příslušného okna na hodnotu false: private function preventMinimize(event:NativeWindowDisplayStateEvent):void{ if(event.afterDisplayState == NativeWindowDisplayState.MINIMIZED){ event.preventDefault(); event.target.visible = false; } } Je-li okno minimalizováno v doku systému Mac OS X, když nastavíte vlastnost visible na hodnotu false, nebude ikona doku odstraněna. Uživatel může přesto klepnout na ikonu a okno se znovu objeví. 98 Kapitola 14: Práce se systémem souborů Třídy obsažené v systému souborů Adobe® AIR™ API pro přístup k systému souborů hostitelského počítače. Pomocí těchto tříd můžete přistupovat k adresářům a souborům a provádět jejich správu, vytvářet adresáře a soubory, zapisovat do souborů data atd. Další online informace o souborovém API aplikace AIR Další informace o používání souborových tříd API naleznete na těchto odkazech: Stručný úvod (Adobe AIR Developer Connection) • Vytváření textového editorů Referenční příručka jazyka • Soubor • Datový tok souboru • Režim souboru Články a Ukázky Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (hledejte 'souborový systém AIR') Základy souborů aplikace AIR Aplikace Adobe AIR poskytuje třídy, které můžete používat pro přístup, vytváření a správu souborů a adresářů. Tyto třídy obsažení v balíku flash.filesystem jsou použity takto: Třídy File Popis Soubor Objekt File představuje cestu k souboru nebo adresáři. Objekt file můžete použít pro vytvoření ukazatele na soubor nebo složku a aktivovat tak interakci se souborem nebo složkou. FileMode Třída FileMode definuje konstanty řetězce použité v parametru fileMode metod open() a openAsync() třídy FileStream. Parametr fileMode těchto metod stanoví možnosti dostupné v objektu FileStream, jakmile je soubor otevřen, což zahrnuje zápis, čtení, připojování a aktualizaci. FileStream Objekt FileStream se používá pro otevírání souborů pro čtení a zápis. Jakmile vytvoříte objekt File, který ukazuje na nový nebo stávající soubor, předáte tento ukazatel objektu FileStream tak, že budete moci otevřít a pak manipulovat s daty v rámci souboru. Některé metody třídy File mají synchronní i asynchronní verzi: • File.copyTo() a File.copyToAsync() • File.deleteDirectory() a File.deleteDirectoryAsync() • File.deleteFile() a File.deleteFileAsync() • File.getDirectoryListing() a File.getDirectoryListingAsync() VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 99 Práce se systémem souborů • File.moveTo() a File.moveToAsync() • File.moveToTrash() a File.moveToTrashAsync() Operace FileStream také pracují synchronně nebo asynchronně v závislosti na tom, zda objekt FileStream soubor otevře: zavoláním metody open() nebo metody openAsync(). Asynchronní verze umožňuje inicializovat proces, který je spouštěn na pozadí a odesílá události po dokončení (nebo když dojde k chybové události). Jiný kód je možné spustit v době, kdy probíhají tyto asynchronní procesy na pozadí. V případě asynchronní verze operací musíte nastavit funkce posluchačů událostí pomocí metody addEventListener() objektu File nebo FileStream, který funkci volá. Synchronní verze umožňuje zapisovat jednodušší kód, které se zcela nespoléhá na nastavení posluchačů událostí. Protože však jiný kód není možné vykonat během spouštění synchronní metody, mohou být pozastaveny důležité procesy, jako jsou například vykreslování objektů zobrazení a animace. Práce s objekty File Objekt File je ukazatelem souboru nebo adresáře v systému souborů. Třída File rozšiřuje třídu FileReference. Třída FileReference, která je dostupná v aplikaci Adobe® Flash® Player stejně jako v aplikaci AIR, představuje ukazatel souboru, ale třída File přidává vlastnosti a metody, které nejsou v aplikaci Flash Player volně přístupné (v SWF spuštěném v prohlížeči); důvodem je zabezpečení. O třídě File Třídu File můžete použít pro následující: • Získání cesty do speciálních adresářů, včetně uživatelských adresářů, adresářů uživatelských dokumentů, adresáře, ze které byla spuštěna aplikace a adresáře samotné aplikace. • Kopírování souborů a adresářů • Přesouvání souborů a adresářů • Odstraňování souborů a adresářů (nebo jejich přesouvání do koše) • Vypisování seznamu souborů a adresářů umístěných v adresáři • Vytváření dočasných souborů a adresářů Jakmile objekt File ukazuje na cestu souboru, můžete jej použít pro načtení a zápis dat souboru pomocí třídy FileStream. Objekt File může ukazovat na cestu souboru a adresáře, který ještě neexistuje. Takový objekt File můžete použít pro vytváření souboru nebo adresáře. Cesty objektu File Každý objekt File má dvě vlastnosti, které definují dráhu: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 100 Práce se systémem souborů Vlastnost Popis nativePath Specifikujte cestu k souboru, specifickou pro danou platformu. Například u systému Windows může být cesta „c:\Vzorový_adresář\test.txt“, zatímco u systému Mac OS může být cesta „/Vzorový_adresář/test.txt“. Vlastnost nativePath používá jako oddělovač adresářů zpětné lomítko (\) u systému Windows a lomítko (/) u systému Mac OS. url Schéma URL souboru může být použito pro odkázání na soubor. Například u systému Windows může být cesta „file:///c:/Vzorový%20adresář/test.txt“, zatímco u systému Mac OS může být cesta „file:///Vzorový%20adresář/test.txt“. Spuštění programu zahrnuje další speciální schémata URL kromě file, která jsou popsána v kapitole „Podporovaná schémata URL“ na stránce 104 Třída File zahrnuje vlastnosti pro odkázání na standardní adresáře u systémů Mac i Windows. Odkázání objektu File na adresář Existují různé způsoby, jak nastavit objekt File, aby ukazoval na adresář. Odkázání na domovský adresář uživatele Objekt File můžete odkázat na domovský adresář uživatele. V systému Windows je domovský adresář uživatele nadřazený adresář pro „Moje dokumenty“ (například „C:\Documents and Settings\jméno_uživatele\Moje dokumenty“). U systému Mac OS se jedná o adresář Users/jméno_uživatele. Následující kód nastavuje objekt File tak, aby ukazoval na podadresář AIR test v domovském adresáři: var file:File = File.userDirectory.resolvePath("AIR Test"); Odkázání na adresář dokumentů uživatele Objekt File můžete odkázat na adresář dokumentů uživatele. V systému Windows se typicky jedná o adresář „Moje dokumenty“ (například „C:\Documents and Settings\jméno_uživatele\Moje dokumenty“). U systému Mac OS se jedná o adresář Users/jméno_uživatele/Documents. Následující kód nastavuje objekt File tak, aby ukazoval na podadresář AIR test v adresáři dokumentů: var file:File = File.documentsDirectory.resolvePath("AIR Test"); Odkázání na adresář plochy Objekt File můžete odkázat na plochu. Následující kód nastavuje objekt File tak, aby odkazoval na podadresář AIR test plochy: var file:File = File.desktopDirectory.resolvePath("AIR Test"); Odkázání na adresář uložení dat aplikace Objekt File můžete odkázat na adresář uložení dat aplikace. Pro aplikaci AIR existuje jedinečná přiřazená cesta, která definuje adresář uložení dat aplikace. Tento adresář je jedinečný pro každou aplikaci a uživatele. Můžete tento adresář použít pro uložení dat specifických pro uživatele nebo aplikaci (například uživatelská data nebo soubory předvoleb). Například následující kód odkazuje objekt File na soubor předvoleb, prefs.xml, obsažený v adresáři uložení dat aplikace: var file:File = File.applicationStorageDirectory; file = file.resolvePath("prefs.xml"; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 101 Práce se systémem souborů Místo adresáře uložení dat 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 URL (a vlastnost url) pro soubor File vytvořený s File.applicationStorageDirectory používá schéma URL appstorage (viz „Podporovaná schémata URL“ na stránce 104), jako v následujícím příkladu: var dir:File = File.applicationStorageDirectory; dir = dir.resolvePath("preferences"); trace(dir.url); // app-storage:/preferences Odkázání na adresář aplikace Objekt File můžete odkázat na adresář, ve kterém byla aplikace nainstalována, kterému se říká adresář aplikace. Tento adresář můžete odkazovat pomocí vlastnosti File.applicationDirectory. Tento adresář můžete také použít pro prověření popisovacího souboru aplikace, nebo jiných zdrojů nainstalovaných s aplikací. Například následující kód odkazuje objekt File na adresář pojmenovaný images v adresáři aplikace: var dir:File = File.applicationDirectory; dir = dir.resolvePath("images"); URL (a vlastnost url) pro soubor File vytvořený s File.applicationDirectory používá schéma URL app (viz „Podporovaná schémata URL“ na stránce 104), jako v následujícím příkladu: var dir:File = File.applicationDirectory; dir = dir.resolvePath("images"); trace(dir.url); // app:/images Odkázání na kořenový adresář systému souborů Metoda File.getRootDirectories() uvádí všechny kořenové svazky, například C: a připojené svazky v počítači se systémem Windows. V systému Mac tato metoda vždy vrací jedinečný kořenový adresář pro počítač (adresář „/“). Odkázání na výslovně definovaný adresář Objekt File můžete odkázat na výslovně definovaný adresář nastavením vlastnosti nativePath objektu File, jako v následujícím příkladu (systém Windows): var file:File = new File(); file.nativePath = "C:\\AIR Test\"; Navigace relativních cest Metodu resolvePath() můžete použít pro získání cesty relativní vzhledem k jiné dané cestě. Například následující kód nastavuje objekt File tak, aby odkazoval na podadresář „AIR test“ v domovském adresáři uživatele: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 102 Práce se systémem souborů var file:File = File.userDirectory; file = file.resolvePath("AIR Test"); Můžete také použít vlastnost url objektu File tak, aby odkazoval na adresář založený na řetězci URL, jako v následujícím příkladu: var urlStr:String = "file:///C:/AIR Test/"; var file:File = new File() file.url = urlStr; Další informace, viz „Modifikování cest souboru“ na stránce 104. Umožnění uživateli procházením vybírat adresář Třída File zahrnuje metodu browseForDirectory(), která zobrazuje systémové dialogové okno, ve kterém může uživatel volit adresář pro přiřazení k objektu. Metoda browseForDirectory() je asynchronní. Odesílá událost select v případě, že uživatel zvolí adresář a klepne na tlačítko Otevřít, nebo odešle událost cancel v případě, že uživatel klepne na tlačítko Zrušit. Například následující kód umožňuje uživateli vybrat adresář a po vybrání odešle na výstup cestu adresáře: var file:File = new File(); file.addEventListener(Event.SELECT, dirSelected); file.browseForDirectory("Select a directory"); function dirSelected(e:Event):void { trace(file.nativePath); } Odkázání na adresář, ze kterého byla aplikace vyvolána Můžete získat umístění adresáře, ze kterého byla vyvolána aplikace, a to zkontrolováním vlastnosti currentDirectory objektu InvokeEvent, odeslaného, když byla aplikace vyvolána. Podrobnosti viz také „Zachycení argumentů příkazového řádku“ na stránce 260. Odkázání objektu File na soubor Existují různé způsoby, jak nastavit soubor, na který objekt File ukazuje. Odkázání na explicitní cestu souboru Metodu resolvePath() můžete použít pro získání cesty relativní vzhledem k jiné dané cestě. Například následující kód nastavuje objekt File tak, aby odkazoval na soubor log.txt v adresáři ukládání dat aplikace: var file:File = File.applicationStorageDirectory; file = file.resolvePath("log.txt"); Můžete použít vlastnost url objektu File tak, aby odkazoval na soubor nebo adresář založený na řetězci URL, jako v následujícím příkladu: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File() file.url = urlStr; Můžete také předat adresu URL funkci konstruktoru File(), jako v následujícím příkladu. var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File(urlStr); Vlastnost url vždy vrací verzi adresy URL zakódovanou URI (například prázdný znak je nahrazen symbolem "%20): VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 103 Práce se systémem souborů file.url = "file:///c:/AIR Test"; trace(file.url); // file:///c:/AIR%20Test Můžete také použít vlastnost nativePath objektu File a nastavit explicitní cestu. Například následující kód, po spuštění v systému Windows, nastaví objekt File na soubor test.txt v podadresáři AIR Test na jednotce C: var file:File = new File(); file.nativePath = "C:/AIR Test/test.txt"; Můžete také předat tuto cestu funkci konstruktoru File(), jako v následujícím příkladu. var file:File = new File("C:/AIR Test/test.txt"); V systému Windows můžete použít dopředné lomítko (/) nebo zpětné lomítko (\) jako oddělovač cesty pro vlastnost nativePath. U systému Mac OS použijte dopředné lomítko (/) jako oddělovač cesty pro vlastnost nativePath: var file:File = new File(/Users/dijkstra/AIR Test/test.txt"); Další informace, viz „Modifikování cest souboru“ na stránce 104. Vypsání souborů v adresáři Metodu getDirectoryListing() objektu File můžete použít pro získání objektů File odkazujících na soubory a podadresáře v kořenové úrovni adresáře. Další informace naleznete v kapitole „Vypsání adresářů“ na stránce 108. Umožnění uživateli procházením vybírat soubor Třída File zahrnuje následující metody, které zobrazují systémové dialogové okno, ve kterém může uživatel volit adresář pro přiřazení k objektu. • browseForOpen() • browseForSave() • browseForOpenMultiple() Tyto metody jsou všechny asynchronní. Metody browseForOpen() a browseForSave() odesílají událost select, když uživatel zvolí soubor (nebo cílovou cestu, v případě metody browseForSave()). Pomocí metod browseForOpen() a browseForSave() po výběru cíle objekt File odkáže na vybrané soubory. Metoda browseForOpenMultiple() odesílá událost selectMultiple, když uživatel zvolí soubory. Událost selectMultiple je typu FileListEvent, která má vlastnost files, která je polem objektů File (odkazujících na vybrané soubory). Například následující kód předkládá uživateli dialogové okno “Otevřít”, ve kterém může uživatel volit soubor: var fileToOpen:File = File.documentsDirectory; selectTextFile(fileToOpen); function selectTextFile(root:File):void { var txtFilter:FileFilter = new FileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml"); root.browseForOpen("Open", [txtFilter]); root.addEventListener(Event.SELECT, fileSelected); } function fileSelected(event:Event):void { trace(fileToOpen.nativePath); } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 104 Práce se systémem souborů Pokud má aplikace otevřené jiné dialogové okno prohlížeče, když zavoláte metodu browse, chod aplikace odešle výjimku Error. Modifikování cest souboru Můžete také změnit cestu stávajícího objektu File zavoláním metody resolvePath() nebo modifikováním objektu nativePath nebo vlastnosti url objektu, jako v následujícím příkladu (v systému Windows): var file1:File = File.documentsDirectory; file1 = file1.resolvePath("AIR Test"); trace(file1.nativePath); // C:\Documents and Settings\userName\My Documents\AIR Test var file2:File = File.documentsDirectory; file2 = file2.resolvePath(".."); trace(file2.nativePath); // C:\Documents and Settings\userName var file3:File = File.documentsDirectory; file3.nativePath += "/subdirectory"; trace(file3.nativePath); // C:\Documents and Settings\userName\My Documents\subdirectory var file4:File = new File(); file4.url = "file:///c:/AIR Test/test.txt"; trace(file4.nativePath); // C:\AIR Test\test.txt Při použití vlastnosti nativePath můžete použít dopředné lomítko (/) nebo zpětné lomítko (\) jako oddělovač adresářů v systému Windows; v systému Mac OS použijte dopředné lomítko (/). V systému Windows nezapomeňte zadat znak zpětného lomítka dvakrát v řetězcové konstantě. Podporovaná schémata URL Můžete použít kterékoliv z následujících schémat URl při definování vlastnosti url objektu File: schéma URL Popis file Používá se pro specifikování cesty relativní vzhledem ke kořenu systému souborů. Například: file:///c:/AIR Test/test.txt Standardní URL specifikuje, že URL souboru má tvar file://<host>/<path>. Speciální případ je, kdy <host> může být prázdný řetězec, což je interpretováno jako „počítač, ze kterého je adresa URl interpretována.“ Z tohoto důvodu URL souboru často mohou mít tři lomítka (///). app Slouží z určení relativní cesty do kořenového adresáře nainstalované aplikace (adresář, který obsahuje soubor application.xml pro nainstalovanou aplikaci). Například následující cesta ukazuje na podadresář obrázků v adresáři nainstalované aplikace: app:/images app-storage Slouží k určení cesty vzhledem k uklá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. 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 Vyhledání relativní cesty mezi dvěma soubory Metodu getRelativePath() můžete použít pro vyhledání relativní cesty mezi dvěma soubory: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 105 Práce se systémem souborů var file1:File = File.documentsDirectory.resolvePath("AIR Test"); var file2:File = File.documentsDirectory file2 = file2.resolvePath("AIR Test/bob/test.txt"); trace(file1.getRelativePath(file2)); // bob/test.txt Druhý parametr metody getRelativePath(), parametr useDotDot, umožňuje navrácení následující .. syntaxe ve výsledcích, které indikují nadřízené adresáře: var file1:File = File.documentsDirectory; file1 = file1.resolvePath("AIR Test"); var file2:File = File.documentsDirectory; file2 = file2.resolvePath("AIR Test/bob/test.txt"); var file3:File = File.documentsDirectory; file3 = file3.resolvePath("AIR Test/susan/test.txt"); trace(file2.getRelativePath(file1, true)); // ../.. trace(file3.getRelativePath(file2, true)); // ../../bob/test.txt Získání kanonických verzí názvů souborů Názvy souboru a cesty obvykle nerozlišují malá a velká písmena. V následujícím příkladu dva objekty File odkazují na stejný soubor: File.documentsDirectory.resolvePath("test.txt"); File.documentsDirectory.resolvePath("TeSt.TxT"); Nicméně názvy dokumentů a adresářů malá a velká písmena rozlišují. Následující příklad předpokládá, že existuje složka pojmenovaná AIR Test v adresáři dokumentů, jako na následujícím příkladu: var file:File = File.documentsDirectory.resolvePath("AIR test"); trace(file.nativePath); // ... AIR test file.canonicalize(); trace(file.nativePath); // ... AIR Test Metoda canonicalize převádí objekt nativePath pro použití správné velikosti písmen pro název souboru nebo adresáře. Metodu canonicalize() můžete také použít pro převod krátkých názvů souboru (názvy „8.3“) na dlouhé názvy systému Windows, jako v následujících příkladech: var path:File = new File(); path.nativePath = "C:\\AIR~1"; path.canonicalize(); trace(path.nativePath); // C:\AIR Test Práce s balíčky a symbolickými odkazy Různé operační systémy podporují balíčky souborů a soubory se symbolickými odkazy: BalíčkyV systémech Mac OS lze adresáře označit jako balíčky a zobrazit ve vyhledávači jako jeden soubor namísto adresáře. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 106 Práce se systémem souborů Symbolické odkazySymbolické odkazy umožňují souboru ukázat na jiný soubor nebo adresář na disku. I když jsou podobné, symbolické odkazy nejsou shodné jako aliasy. Alias (zástupce) je vždy hlášen jako soubor (spíše než adresář) a čtení nebo zápis aliasu nebo zástupce nikdy neovlivňuje původní soubor nebo adresář, na které odkazují. Na druhou stranu se symbolický odkaz chová přesně jako soubor nebo adresář, na který odkazuje. Může být hlášen jako soubor nebo adresář, a čtení nebo zápis do symbolického odkazu ovlivňuje soubor nebo adresář, na který odkazuje, ale nikoliv samotný symbolický odkaz. Třída File zahrnuje vlastnosti isPackage a isSymbolicLink pro kontrolu, zda objekt File odkazuje balíček nebo symbolický odkaz. Následující kód provádí iterace adresáře pracovní plochy uživatele, vypisuje podadresáře, které nejsou balíčky: var desktopNodes:File = File.desktopDirectory.getDirectoryListing(); for (var i:uint = 0; i < desktopNodes.length; i++) { if (desktopNodes[i].isDirectory && !!desktopNodes[i].isPackage) { trace(desktopNodes[i].name); } } Následující kód provádí iterace adresáře pracovní plochy uživatele, vypisuje soubory a adresáře, které nejsou symbolickými odkazy: var desktopNodes:File = File.desktopDirectory.getDirectoryListing(); for (var i:uint = 0; i < desktopNodes.length; i++) { if (!desktopNodes[i].isSymbolicLink) { trace(desktopNodes[i].name); } } Metoda canonicalize() mění cestu symbolického odkazu tak, aby směřoval na soubor nebo adresář, na který odkaz ukazuje. Následující kód provádí iterace adresáře pracovní plochy uživatele a hlásí cesty odkazované soubory, které jsou symbolickými odkazy: var desktopNodes:File = File.desktopDirectory.getDirectoryListing(); for (var i:uint = 0; i < desktopNodes.length; i++) { if (desktopNodes[i].isSymbolicLink) { var linkNode:File = desktopNodes[i] as File; linkNode.canonicalize(); trace(linkNode.nativePath); } } Stanovení prostoru dostupného ve svazku Vlastnost spaceAvailable objektu File popisuje prostor dostupný pro použití v umístění souboru File v bajtech. Například následující kód kontroluje prostor dostupný v adresáři uložení dat aplikace: trace(File.applicationStorageDirectory.spaceAvailable); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 107 Práce se systémem souborů Pokud objekt File odkazuje na adresář, udává vlastnost spaceAvailable volné místo v adresáři, které mohou soubory využít. Pokud objekt File odkazuje na soubor, udává vlastnost spaceAvailable volné místo pro růst tohoto souboru. Pokud toto umístění souboru neexistuje, má vlastnost spaceAvailable hodnotu 0. Pokud objekt File odkazuje na symbolický odkaz, udává vlastnost spaceAvailable volné místo dostupné v umístění, na které ukazuje symbolický odkaz. Obvykle se volné dostupné místo pro adresář nebo soubor shoduje s dostupným volným místem v jednotce, která tento adresář nebo složku obsahuje. Dostupné místo ale může brát v úvahu i kvóty účtu a omezení jednotlivých adresářů. Když přidáváte soubor nebo adresář do nějaké jednotky, obvykle se vyžaduje víc volného místa, než je skutečná velikost tohoto souboru nebo velikost obsahu tohoto adresáře. Například pro uložení informací indexu může operační systém vyžadovat více volného místa. Také požadované sektory disku mohou využívat dodatečné volné místo. Kromě toho se dostupné volné místo dynamicky mění. Z těchto důvodů nemůžete očekávat, že alokujete pro úložiště souborů veškeré hlášené volné místo. Informace o zápisu do systému souborů naleznete v kapitole „Čtení a zápis souborů“ na stránce 112. Získání informací o systému souborů Třída File zahrnuje následující statické vlastnosti, které poskytují některé užitečné informace o systému souborů: Vlastnost Popis File.lineEnding Posloupnost znaků zakončujících řádek, použitá hostitelským operačním systémem. V systémech Mac OS se jedná o znak posuvu o řádek (LF). V systémech Windows se jedná o znak návratu vozíku tiskárny (CR), následovaný znakem posuvu o řádek (LF). File.separator Oddělovací znak součásti cesty hostitelského operačního systému. V systémech Mac OS se jedná o znak dopředného lomítka (/). V systémech Windows se jedná o znak zpětného lomítka (\). File.systemCharset Výchozí kódování použité pro soubory hostitelským operačním systémem. Toto se týká znakové sady použité operačním systémem, která odpovídá jeho jazyku. Třída Capabilities rovněž zahrnuje užitečné systémové informace, které mohou být užitečné při práci se soubory: Vlastnost Popis Capabilities.hasIME Určuje, zda je přehrávač spuštěný v systému, který obsahuje (true) nebo neobsahuje (false) nainstalovaný editor vstupní metody IME (input method editor). Capabilities.language Určuje jazykový kód systému, na kterém je spuštěný přehrávač. Capabilities.os Určuje aktuální operační systém. Práce s adresáři Chod aplikace poskytne možnosti práce s adresáři v místním systému souborů. Podrobnosti o vytváření objektů File, které odkazují na adresáře, viz také „Odkázání objektu File na adresář“ na stránce 100. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 108 Práce se systémem souborů Vytváření adresářů Metoda File.createDirectory() umožňuje vytvářet adresář. Například následující kód vytváří adresář pojmenovaný AIR Test jako podadresář uživatelského výchozího adresáře: var dir:File = File.userDirectory.resolvePath("AIR Test"); dir.createDirectory(); Pokud adresáře existuje, metoda createDirectory() nic neprovede. V některých režimech objekt FileStream vytváří adresáře při otevření souborů. Chybějící adresáře jsou vytvářeny při konkretizaci instance FileStream parametrem fileMode konstruktoru FileStream() nastaveným na FileMode.APPEND nebo FileMode.WRITE. Další informace viz „Pracovní kroky při čtení a zápisu souborů“ na stránce 112. Vytváření dočasného adresáře Třída File zahrnuje metodu createTempDirectory(), která vytváří adresář v dočasném adresáři systému, jako v následujícím příkladu: var temp:File = File.createTempDirectory(); Metoda createTempDirectory() automaticky vytvoří jedinečný dočasný adresář (úspora práce při stanovení nového jedinečného umístění). Můžete použít dočasný adresář pro dočasné uložení dočasných souborů pro relaci aplikace. Povšimněte si, že existuje metoda createTempFile() pro vytváření nových, jedinečných dočasných souborů v dočasném adresáři systému. Dočasný adresář můžete odstranit před uzavřením aplikace, protože není odstraňován automaticky. Vypsání adresářů Můžete použít metodu getDirectoryListing() nebo getDirectoryListingAsync() objektu File k získání pole objektů File, odkazujících na soubory a podsložky v adresáři. Například následující kód uvádí obsah adresáře dokumentů uživatele (bez prověření podadresářů): var directory:File = File.documentsDirectory; var contents:Array = directory.getDirectoryListing(); for (var i:uint = 0; i < contents.length; i++) { trace(contents[i].name, contents[i].size); } Při použití asynchronní verze metody má objekt události directoryListing vlastnost files, která je polem objektů File, týkajících se adresářů: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 109 Práce se systémem souborů var directory:File = File.documentsDirectory; directory.getDirectoryListingAsync(); directory.addEventListener(FileListEvent.DIRECTORY_LISTING, dirListHandler); function dirListHandler(event:FileListEvent):void { var contents:Array = event.files; for (var i:uint = 0; i < contents.length; i++) { trace(contents[i].name, contents[i].size); } } Kopírování a přesouvání adresářů Adresář můžete zkopírovat nebo přesunout pomocí stejných metod, jako při kopírování souboru. Například, následující kód kopíruje adresář synchronně: var sourceDir:File = File.documentsDirectory.resolvePath("AIR Test"); var resultDir:File = File.documentsDirectory.resolvePath("AIR Test Copy"); sourceDir.copyTo(resultDir); Když specifikujete hodnotu true pro parametr overwrite metody copyTo(), všechny soubory a složky ve stávajícím cílovém adresáři budou odstraněny a nahrazeny soubory ve zdrojovém adresáři (i v případě, že cílový soubor ve zdrojovém adresáři neexistuje). Adresář, který zadáte jako parametr newLocation metody copyTo() stanoví cestu do výsledného adresáře; nespecifikujenadřízený adresář, který bude obsahovat výsledný adresář. Podrobnosti naleznete v kapitole „Kopírování a přesouvání souborů“ na stránce 110. Odstraňování obsahu adresáře Třída File zahrnuje metodu deleteDirectory() a deleteDirectoryAsync(). Tyto metody odstraňují adresáře, přičemž první pracuje synchronně, druhá asynchronně (viz „Základy souborů aplikace AIR“ na stránce 98). Obě metody zahrnují parametr deleteDirectoryContents (který přebírá booleovskou hodnotu); když je tento parametr nastaven na hodnotu true (výchozí hodnota je false), volání metody odstraní adresáře, které nejsou prázdné; jinak jsou odstraněny pouze prázdné adresáře. Například následující kód synchronně odstraní podadresář AIR Test v adresáři dokumentů uživatele: var directory:File = File.documentsDirectory.resolvePath("AIR Test"); directory.deleteDirectory(true); Následující kód asynchronně odstraní podadresář AIR Test v adresáři dokumentů uživatele: var directory:File = File.documentsDirectory.resolvePath("AIR Test"); directory.addEventListener(Event.COMPLETE, completeHandler) directory.deleteDirectoryAsync(true); function completeHandler(event:Event):void { trace("Deleted.") } Součástí jsou rovněž metody moveToTrash() a moveToTrashAsync(), které můžete použít pro přesunutí adresáře do koše. Podrobnosti viz „Přesouvání souborů do koše“ na stránce 112. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 110 Práce se systémem souborů Práce se soubory Pomocí souborového rozhraní API aplikace AIR můžete do vaší aplikace přidat základní možnosti interakce se soubory. Například můžete číst a zapisovat, kopírovat a odstraňovat soubory atd. Protože vaše aplikace mohou přistupovat k místnímu systému souborů, viz také kapitola „Zabezpečení aplikace AIR“ na stránce 23, pokud jste si ji ještě neprostudovali. Poznámka: Můžete připojit typ souborů k aplikaci AIR (tak, že poklepáním aplikaci otevřete). Podrobnosti viz také „Správa asociací souboru“ na stránce 267. Získání informací o souboru Třída File zahrnuje následující vlastnosti, které poskytují informace o souboru nebo adresáři, na který objekt File odkazuje: Vlastnost File Popis creationDate Datum vytvoření souboru na lokálním disku. creator Zastaralé—použijte vlastnost extension. (Tato vlastnost hlásí typ tvůrce souboru v počítači Macintosh, který je používán pouze ve verzích Mac OS před Mac OS X.) exists Informace, zda existuje odkazovaný soubor nebo adresář. extension Přípona souboru je část názvu následující za poslední tečkou („.“, tečka není součástí přípony). Pokud v názvu souboru není tečka, je přípona null. icon Objekt Icon obsahující ikony definované pro soubor. isDirectory Informace, zda odkaz objektu File směřuje na adresář. modificationDate Datum poslední změny souboru nebo adresáře na lokálním disku. name Název souboru nebo adresáře (včetně přípon, pokud existuje) na místním disku. nativePath Úplná cesta ve vyjádření hostitelského operačního systému. Viz také „Cesty objektu File“ na stránce 99. parent Složka, která obsahuje složku nebo soubor představovaný objektem File. Tato vlastnost je null v případě, že objekt File odkazuje na soubor nebo adresář v kořenu systému souborů. size Velikost souboru na lokálním disku v bytech. type Zastaralé—použijte vlastnost extension. (V počítači Macintosh tato vlastnost je čtyřznakový typ souboru, který je používán pouze ve verzi Mac OS před Mac OS X.) url Adresa URL pro soubor nebo adresář. Viz také „Cesty objektu File“ na stránce 99. Podrobnosti o těchto vlastnostech, viz také záznam třídy File v Referenční příručka jazyka ActionScript 3.0 (http://www.adobe.com/go/learn_air_aslr_cz). Kopírování a přesouvání souborů Třída File zahrnuje dvě metody pro kopírování souborů nebo adresářů: copyTo() a copyToAsync(). Třída File zahrnuje dvě metody pro přesouvání souborů nebo adresářů: moveTo() a moveToAsync(). Metody copyTo() a moveTo() pracují synchronně a metody copyToAsync() a moveToAsync() pracují asynchronně (viz „Základy souborů aplikace AIR“ na stránce 98). Chcete-li kopírovat nebo přesouvat soubor, nastavujete dva objekty File. Jeden ukazuje na soubor pro kopírování nebo přesouvání, a je to objekt, který volá metodu copy nebo move druhý ukazuje na cílovou cestu. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 111 Práce se systémem souborů Následující kód kopíruje soubor test.txt z podadresáře AIR Test adresáře dokumentů uživatele do souboru pojmenovaného copy.txt ve stejném adresáři: var original:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var newFile:File = File.resolvePath("AIR Test/copy.txt"); original.copyTo(newFile, true); V tomto příkladu je hodnota parametru overwrite metody copyTo() (druhý parametr) nastavena na true. Nastavením tohoto parametru na hodnotu true, je stávající cílový soubor přepsán. Tento parametr je nepovinný. Pokud nastavíte hodnotu false (výchozí hodnota), operace odešle událost IOErrorEvent v případě, že cílový soubor existuje (a soubor není nakopírován). Verze “Async” metod copy a move pracuje asynchronně. Metodu addEventListener() použijte pro sledování dokončení úkolu nebo chybového stavu, jako v následujícím kódu: var original = File.documentsDirectory; original = original.resolvePath("AIR Test/test.txt"); var destination:File = File.documentsDirectory; destination = destination.resolvePath("AIR Test 2/copy.txt"); original.addEventListener(Event.COMPLETE, fileMoveCompleteHandler); original.addEventListener(IOErrorEvent.IO_ERROR, fileMoveIOErrorEventHandler); original.moveToAsync(destination); function fileMoveCompleteHandler(event:Event):void { trace(event.target); // [object File] } function fileMoveIOErrorEventHandler(event:IOErrorEvent):void { trace("I/O Error."); } Třída File rovněž zahrnuje metody File.moveToTrash() a File.moveToTrashAsync(), které přesouvají soubor nebo adresář do koše. Odstranění souboru Třída File zahrnuje metodu deleteFile() a deleteFileAsync(). Tyto metody odstraňují soubory, přičemž první pracuje synchronně, druhá asynchronně (viz „Základy souborů aplikace AIR“ na stránce 98). Například následující kód synchronně odstraní soubor test.txt v adresáři dokumentů uživatele: var file:File = File.documentsDirectory.resolvePath("test.txt"); file.deleteFile(); Následující kód asynchronně odstraní soubor test.txt v adresáři dokumentů uživatele: var file:File = File.documentsDirectory.resolvePath("test.txt"); file.addEventListener(Event.COMPLETE, completeHandler) file.deleteFileAsync(); function completeHandler(event:Event):void { trace("Deleted.") } Součástí jsou rovněž metody moveToTrash() a moveToTrashAsync(), které můžete použít pro přesunutí souboru nebo adresáře do koše. Podrobnosti viz „Přesouvání souborů do koše“ na stránce 112. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 112 Práce se systémem souborů Přesouvání souborů do koše Třída File zahrnuje metodu moveToTrash() a moveToTrashAsync(). Tyto metody odesílají soubor nebo adresář do koše, první pracuje synchronně, druhý pracuje asynchronně (viz „Základy souborů aplikace AIR“ na stránce 98). Například následující kód synchronně přesouvá soubor test.txt v adresáři dokumentace uživatele do koše: var file:File = File.documentsDirectory.resolvePath("test.txt"); file.moveToTrash(); Vytváření dočasného souboru Třída File zahrnuje metodu createTempFile(), která vytváří soubor v dočasném adresáři systému, jako v následujícím příkladu: var temp:File = File.createTempFile(); Metoda createTempFile() automaticky vytvoří jedinečný dočasný soubor (úspora práce při stanovení nového jedinečného umístění). Můžete použít dočasný soubor pro dočasné uložení informací pro relaci aplikace. Povšimněte si, že existuje metoda createTempDirectory() pro vytváření jedinečných dočasných adresářů v dočasném adresáři systému. Dočasný soubor můžete odstranit před uzavřením aplikace, protože není odstraňován automaticky. Čtení a zápis souborů Třída FileStream umožňuje aplikacím AIR číst a zapisovat do systému souborů. Pracovní kroky při čtení a zápisu souborů Pracovní kroky pro čtení a zápis souborů jsou následující. Inicializace objektu File, který ukazuje cestu. Toto je cesta souboru, se kterým chcete pracovat (nebo souboru, který vytvoříte později). var file:File = File.documentsDirectory; file = file.resolvePath("AIR Test/testFile.txt"); Tento příklad používá vlastnost File.documentsDirectory a metodu resolvePath() objektu File pro inicializaci objektu File. Nicméně existuje mnoho jiných způsobů pro odkázání objektu File na soubor. Další informace viz „Odkázání objektu File na soubor“ na stránce 102. Inicializace objektu FileStream. Zavolejte metodu open() nebo openAsync() objektu FileStream. Volaná metoda závisí na tom, zda chcete otevřít soubor pro synchronní nebo asynchronní operace. Použijte objekt File jako parametr file metody open. Pro parametr fileMode specifikujte konstantu z třídy FileMode, která specifikuje způsob, kterým budete soubor používat. Například následující kód inicializuje objekt FileStream, který se používá pro vytvoření souboru a přepsání všech stávajících dat: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 113 Práce se systémem souborů var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.WRITE); Další informace viz „Inicializace objektu FileStream a otevření a uzavření souborů“ na stránce 114 a „Režimy open objektu FileStream“ na stránce 113. Pokud jste otevřeli soubor asynchronně (pomocí metody openAsync()), přidejte a nastavte posluchače událostí pro objekt FileStream. Tyto posluchače událostí odpovídají na události odeslané objektem FileStream v různých situacích, například při načtení dat ze souboru, když se vyskytnou chyby I/O, nebo když je nutné zapsat celý objem dat. Podrobnosti viz také „Asynchronnní programování a události generované objektem FileStream otevřeným asynchronně“ na stránce 118 . Zahrňte kód pro čtení a zápis dat podle potřeby. Existuje mnoho metod třídy FileStream související s čtením a zápisem. (Všechny začínají „read“ nebo „write“.) Zvolená metoda použitá pro čtení nebo zápis dat závisí na formátu dat v cílovém souboru. Pokud například data v cílovém souboru budou textem v kódování UTF, můžete použít metody readUTFBytes() a writeUTFBytes(). Pokud chcete pracovat s daty formou bajtových polí, můžete použít metody readByte(), readBytes(), writeByte() a writeBytes(). Podrobnosti viz také kapitola „Datové formáty a výběr metody čtení a zápisu“ na stránce 118. Pokud otevřete soubor asynchronně, zajistěte, aby pro zavolání metody read byl k dispozici dostatek dat. Podrobnosti viz také „Vyrovnávací paměť čtení a vlastnost bytesAvailable objektu FileStream“ na stránce 116. Před zápisem do souboru, pokud chcete zkontrolovat objem dostupného diskového prostoru, si můžete ověřit vlastnost spaceAvailable objektu File. Další informace viz „Stanovení prostoru dostupného ve svazku“ na stránce 106. Jakmile jste dokončili práci se souborem, zavolejte metodu close() objektu FileStream. To soubor zpřístupní pro ostatní aplikace. Podrobnosti viz „Inicializace objektu FileStream a otevření a uzavření souborů“ na stránce 114. Chcete-li shlédnout ukázku využívající třídy FileStream k načtení a zápisu souborů, viz následující články ve vývojářském středisku Adobe AIR Developer Center: • Vytváření textového editorů Práce s objekty FileStream Třída FileStream definuje metody pro otevírání, čtení a zápis souborů. Režimy open objektu FileStream Metody open() a openAsync() objektu FileStream zahrnují parametr fileMode, který definuje některé vlastnosti datového toku souboru, včetně následujících: • Schopnost číst ze souboru • Schopnost zápisu do souboru • Zda data budou vždy připojena na konec souboru (při zápisu) • Co udělat, když soubor neexistuje (a kdy neexistují nadřízené adresáře) VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 114 Práce se systémem souborů Následující jsou různé režimy souboru (což můžete specifikovat jako parametr fileMode metod open() a openAsync()): Režim souboru Popis FileMode.READ Stanoví, že soubor je otevřený pouze pro čtení. FileMode.WRITE Stanoví, že soubor je otevřený pouze pro zápis. Pokud soubor neexistuje, je vytvořen při otevření objektu FileStream. Pokud soubor existuje, jsou stávající data odstraněna. FileMode.APPEND Stanoví, že soubor je otevřený pouze pro připojení. Soubor je vytvořen, pokud neexistuje. Pokud soubor existuje, stávající data nejsou přepsána a veškeré zápisy začínají na konci souboru. FileMode.UPDATE Stanoví, že soubor je otevřený pro čtení a zápis. Pokud soubor neexistuje, je vytvořen. Specifikujte tento režim pro náhodný přístup k zápisu/čtení souboru. Můžete číst z libovolné pozice souboru a při zápisu do souboru přepíší stávající bajty pouze zapsané bajty (všechny ostatní bajty zůstanou nezměněné). Inicializace objektu FileStream a otevření a uzavření souborů Když otevřete objekt FileStream, zpřístupníte jej ke čtení a zápisu dat do souboru. Objekt FileStream otevřete předáním objektu File metodě open() nebo openAsync() objektu FileStream: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.open(myFile, FileMode.READ); Parametr fileMode (druhý parametr metody open() a openAsync()), specifikuje režim, ve kterém se soubor otevírá: pro čtení, zápis, připojení nebo aktualizaci. Podrobnosti viz také předchozí kapitola, „Režimy open objektu FileStream“ na stránce 113. Pokud použijete metodu openAsync() k otevření souboru pro asynchronní operace se souborem, nastavte posluchače událostí ke zpracování asynchronních událostí: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(Event.COMPLETE, completeHandler); myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); myFileStream.addEventListener(IOErrorEvent.IOError, errorHandler); myFileStream.open(myFile, FileMode.READ); function completeHandler(event:Event):void { // ... } function progressHandler(event:ProgressEvent):void { // ... } function errorHandler(event:IOErrorEvent):void { // ... } Soubor je otevřen pro synchronní nebo asynchronní operace, v závislosti na tom, zda použijete metodu open() nebo openAsync(). Podrobnosti viz „Základy souborů aplikace AIR“ na stránce 98. Pokud nastavíte parametr fileMode na FileMode.READ nebo FileMode.UPDATE v metodě open objektu FileStream, data jsou načtena do vyrovnávací paměti čtení, jakmile otevřete objekt FileStream. Podrobnosti viz také „Vyrovnávací paměť čtení a vlastnost bytesAvailable objektu FileStream“ na stránce 116. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 115 Práce se systémem souborů Metodu close() objektu FileStream můžete uzavřít související soubor, čímž jej zpřístupníte pro použití pro ostatní aplikace. Vlastnost position objektu FileStream Vlastnost position objektu FileStream stanoví, zda jsou data načtena nebo zapsána následující metodou čtení nebo zápisu. Před operací čtení nebo zápisu nastavte vlastnost position na libovolnou platnou polohu v souboru. Například následující kód zapíše řetězec „hello" (v kódování UTF) v poloze 8 v souboru: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.open(myFile, FileMode.UPDATE); myFileStream.position = 8; myFileStream.writeUTFBytes("hello"); Když poprvé otevřete objekt FileStream, vlastnost position je nastavena na 0. Před operací čtení musí být hodnota position alespoň 0 a nižší než počet bajtů v souboru (což jsou pozice v souboru). Hodnota vlastnosti position je změněna pouze za následujících podmínek: • Když výslovně nastavíte vlastnost position. • Když zavoláte metodu read. • Když zavoláte metodu write. Když zavoláte metodu read nebo write objektu FileStream, vlastnost position je ihned zvýšena o počet bajtů, které načtete nebo zapíšete. V závislosti na metodě čtení, kterou použijete, vlastnost position se zvýší o počet bajtů specifikovaných k načtení, nebo o počet dostupných bajtů. Když poté zavoláte metodu read nebo write dojde k načtení nebo zápisu počínaje novou polohou. var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.open(myFile, FileMode.UPDATE); myFileStream.position = 4000; trace(myFileStream.position); // 4000 myFileStream.writeBytes(myByteArray, 0, 200); trace(myFileStream.position); // 4200 Existuje však jedna výjimka: pro FileStream otevřený v režimu připojení se vlastnost position nemění po zavolání metody write. (V režimu připojení jsou data vždy zapsána na konec souboru, nezávisle na hodnotě vlastnosti position.) Pro soubor otevřený pro asynchronní operace nebude operace zápisu dokončena před vykonáním následující řádky kódu. Nicméně můžete zavolat několik asynchronních metod po sobě, a za běhu je program vykoná v pořadí: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 116 Práce se systémem souborů var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.openAsync(myFile, FileMode.WRITE); myFileStream.writeUTFBytes("hello"); myFileStream.writeUTFBytes("world"); myFileStream.addEventListener(Event.CLOSE, closeHandler); myFileStream.close(); trace("started."); closeHandler(event:Event):void { trace("finished."); } Sledování výstupu tohoto kódu je následující: started. finished. Můžete specifikovat hodnotu position ihned poté, co zavoláte metodu read nebo write (nebo kdykoliv), a následující operace čtení nebo zápisu proběhne počínaje touto polohou. Například si povšimněte, že následující kód nastavuje vlastnost position ihned po zavolání operace writeBytes() a position je nastavena na hodnotu (300) i poté, co byla operace zápisu dokončena: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.openAsync(myFile, FileMode.UPDATE); myFileStream.position = 4000; trace(myFileStream.position); // 4000 myFileStream.writeBytes(myByteArray, 0, 200); myFileStream.position = 300; trace(myFileStream.position); // 300 Vyrovnávací paměť čtení a vlastnost bytesAvailable objektu FileStream Když je otevřen objekt FileStream s možností čtení (ve kterém je parametr fileMode metody open() nebo openAsync() nastavený na READ nebo UPDATE), program za chodu uloží data do vnitřní vyrovnávací paměti. Objekt FileStream začne načítat data do vyrovnávací pamětí, jakmile otevřete soubor (zavoláním metody open() nebo openAsync() objektu FileStream). Pro soubor otevřený pro synchronní operace (pomocí metodyopen()), můžete vždy nastavit ukazatel position na kteroukoliv platnou polohu (v rámci mezí souboru) a začít čtení kteréhokoliv objemu dat (v rámci mezí souboru), jak je vidět v následujícím kódu (který předpokládá, že sobor obsahuje alespoň 100 bajtů): var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.open(myFile, FileMode.READ); myFileStream.position = 10; myFileStream.readBytes(myByteArray, 0, 20); myFileStream.position = 89; myFileStream.readBytes(myByteArray, 0, 10); Když je soubor otevřen pro synchronní nebo asynchronní operace, metody read vždy čtou z „dostupných“ bajtů, představovaných vlastností bytesAvalable. Při synchronním čtení jsou všechny bajty souboru kdykoliv dostupné. Při asynchronním čtení se zpřístupní bajty počínaje polohou stanovené vlastností position, v řadě asynchronních naplnění vyrovnávací paměti signalizovaných událostmi progress. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 117 Práce se systémem souborů Pro soubory otevřené pro synchronní operace je vlastnost bytesAvailable nastavena tak, aby vyjadřovala počet bajtů z vlastnosti position na konci souboru (všechny bajty v souboru jsou vždy k dispozici pro čtení). Pro soubory otevření pro asynchronní operace musíte zajistit, aby vyrovnávací paměť čtení spotřebovala dostatek volání metody read. Pro soubor otevíraný asynchronně, v průběhu operace čtení, data ze souboru, počínaje v pozici specifikované při spuštění operace čtení, jsou přidána do vyrovnávací paměti a vlastnost bytesAvailable zvýší svou hodnotu s každým načteným bajtem. Vlastnost bytesAvailable označuje dostupné bajty počínaje bajtem na pozici stanovené vlastností position na konci vyrovnávací paměti. Pravidelně pak objekt FileStream odesílá událost progress. Pro soubor otevíraný asynchronně, když jsou data dostupná ve vyrovnávací paměti, objekt FileStream pravidelně odesílá událost progress. Například následující kód načte data do objektu ByteArray, bytes, když jsou načítána do vyrovnávací paměti. var bytes:ByteArray = new ByteArray(); var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); myFileStream.openAsync(myFile, FileMode.READ); function progressHandler(event:ProgressEvent):void { myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable); } Pro soubor otevíraný asynchronně mohou být načítána pouze data ve vyrovnávací paměti. Dále, když načtete data, jsou odebrána z vyrovnávací paměti. Pro operace čtení musíte zajistit, aby data byla k dispozici ve vyrovnávací paměti ještě před zavoláním operace čtení. Například následující kód načte 8000 bajtů dat, počínaje pozici 4000 v souboru: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); myFileStream.addEventListener(Event.COMPLETE, completed); myFileStream.openAsync(myFile, FileMode.READ); myFileStream.position = 4000; var str:String = ""; function progressHandler(event:Event):void { if (myFileStream.bytesAvailable > 8000 ) { str += myFileStream.readMultiByte(8000, "iso-8859-1"); } } Během operace zápisu objekt FileStream nenačte data do vyrovnávací paměti. Když je operace zápisu dokončena (všechna data ve vyrovnávací paměti jsou zapsána do souboru), objekt FileStream začne načítat novou vyrovnávací paměti (předpokládá se, že přidružený objekt FileStream byl otevřen se schopností čtení) a dále začne načítat data do vyrovnávací paměti, počínaje polohou stanovenou ve vlastnosti position. Vlastnost position může být polohou posledního zapsaného bajtu, nebo se může jednat o jinou polohu, pokud uživatel stanoví jinou hodnotu pro objekt position po operaci načtení. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 118 Práce se systémem souborů Asynchronnní programování a události generované objektem FileStream otevřeným asynchronně Když je soubor otevřen asynchronně (pomocí metody openAsync()), čtení nebo zápis souborů je proveden asynchronně. Když jsou data načtena do vyrovnávací paměti a výstupní data jsou zapsána, může být spuštěn jiný kód jazyka ActionScript. To znamená, že musíte registrovat události generované objektem FileStream otevřené asynchronně. Zaregistrováním události progress můžete být informováni o dostupnosti nových dat pro čtení, jako v následujícím kódu: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); myFileStream.openAsync(myFile, FileMode.READ); var str:String = ""; function progressHandler(event:ProgressEvent):void { str += myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1"); } Můžete načíst všechna data zaregistrováním události complete, jako v následujícím kódu. var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(Event.COMPLETE, completed); myFileStream.openAsync(myFile, FileMode.READ); var str:String = ""; function completeHandler(event:Event):void { str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1"); } Stejným způsobem, kterým jsou vstupní data ukládána do vyrovnávací paměti, aby bylo možné provést asynchronní čtení, zapsaná data v asynchronním datovém toku jsou uložena do vyrovnávací paměti a zapsána do souboru asynchronně. Když jsou data zapsána do souboru, objekt FileStream pravidelně odesílá objekt OutputProgressEvent. Objekt OutputProgressEvent zahrnuje vlastnost bytesPending, která je nastavena na počet bajtů zbývajících k zápisu. Můžete zaregistrovat informování o události outputProgress, protože vyrovnávací paměti je ve skutečnosti zapisována do souboru, patrně pro zobrazení dialogového okna průběhu. Nicméně obecně toto není nutné provádět. Obzvláště můžete zavolat metodu close() bez starosti o nezapsané bajty. Objekt FileStream bude i nadále zapisovat data a událost close bude doručena po zapsání koncového bajtu do souboru a příslušný soubor je uzavřen. Datové formáty a výběr metody čtení a zápisu Každý soubor je souborem bajtů na disku. Ve skriptu ActionScript mohou být data ze soubory vždy vyjádřena pomocí ByteArray. Například následující kód načte data ze souboru do objektu ByteArray pojmenovaného bytes: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 119 Práce se systémem souborů var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(Event.COMPLETE, completeHandler); myFileStream.openAsync(myFile, FileMode.READ); var bytes:ByteArray = new ByteArray(); function completeHandler(event:Event):void { myFileStream.readBytes(bytes, 0, myFileStream.bytesAvailable); } Podobně následující kód zapisuje data z objektu ByteArray pojmenovaného bytes do souboru: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.open(myFile, FileMode.WRITE); myFileStream.writeBytes(bytes, 0, bytes.length); Nicméně, často nebudete chtít ukládat data do objektu ByteArray skriptu ActionScript. A často data souboru budou ve specifikovaném formátu souboru. Například data v souboru mohou být v textovém formátu a můžete požadovat vyjádření těchto dat objektem String. Z tohoto důvodu třída FileStream zahrnuje metody read a write pro čtení a zápis dat do jiných typů objektů ByteArray nebo z nich. Například metoda readMultiByte() umožňuje načítat data ze souboru a uložit je do řetězce, jako v následujícím kódu: var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); var myFileStream:FileStream = new FileStream(); myFileStream.addEventListener(Event.COMPLETE, completed); myFileStream.openAsync(myFile, FileMode.READ); var str:String = ""; function completeHandler(event:Event):void { str = myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1"); } Druhý parametr metody readMultiByte() specifikuje textový formát, který jazyk ActionScript používá pro interpretaci dat (v příkladu „iso-8859-1“). Jazyk ActionScript podporuje běžné kódování znakových sad, které jsou uvedeny v Referenční příručce jazyka ActionScript 3.0 (viz Podporované jazykové sadyPodporované jazykové sady na adrese http://livedocs.macromedia.com/flex/2/langref/charset-codes.html). Třída FileStream rovněž zahrnuje metodu readUTFBytes(), která načte data z vyrovnávací paměti čtení do řetězce pomocí znakové sady UTF-8. Protože znaky ve znakové sadě UTF-8 jsou proměnné délky, nepoužívejte readUTFBytes() v metodě, která odpovídá na událost progress, protože data na konci vyrovnávací paměti čtení mohou představovat neúplný znak. (To je pravda při použití metody readMultiByte() s kódováním znaků proměnné délky.) Z tohoto důvodu načtěte celou sadu dat, když objekt FileStream odešle událost complete. Existují také podobné metody zápisu, writeMultiByte() a writeUTFBytes(), pro práci s objekty String a textovými soubory. Metody readUTF() a writeUTF() (nezaměňovat s readUTFBytes() a writeUTFBytes()) také načítají a zapisují textová data do souboru, ale předpokládají, že textovým datům předchází data specifikující délku textových dat, což není u standardních textových souborů běžné. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 120 Práce se systémem souborů Některé textové soubory s kódováním UTFzačínají znakem „UTF-BOM“ (značka pořadí bajtů), který definuje zakončení a také formát kódování (například UTF-16 nebo UTF-32). Například čtení nebo zápis textového souboru, viz také „Příklad: Čtení souboru XML v objektu XML“ na stránce 120. readObject() a writeObject() jsou pohodlné způsoby uložení a načtení dat pro komplexní objekty jazyka ActionScript. Data jsou zakódovaná ve formátu AMF (ActionScript Message Format). Tento formát je vlastním formátem jazyka ActionScript. Aplikace jiné než AIR, Flash Player, Flash Media Server a Flex Data Services nemají vestavěné rozhraní API pro práci s daty v tomto formátu. Existují některé jiné metody čtení a zápisu (jako například readDouble() a writeDouble()). Pokud je však použijete, ujistěte se, že formát souboru odpovídá formátu definovanému těmito metodami. Formáty souborů jsou často složitější, než jednoduché textové formáty. Například soubor MP3 obsahuje komprimovaná data, která mohou být pouze interpretována s dekompresními a dekódovacími algoritmy, specifickými pro soubory MP3. Soubory MP3 mohou také zahrnovat značky ID3, které obsahuje informace metaznaček o souboru (například název a interpret skladby). Existují různé verze formátu ID3, ale nejjednodušší (ID3 verze 1) je popsána v kapitole „Příklad: čtení a zápis dat s náhodným přístupem“ na stránce 121. Ostatní formáty souborů (pro obrázky, databáze, dokumenty aplikací atd.) mají jiné struktury a pro práci s jejich daty v jazyce ActionScript musíte porozumět, jak jsou data strukturovaná. Příklad: Čtení souboru XML v objektu XML Následující příklady ukazují, jak číst a zapisovat textové soubory obsahující data XML. Chcete-li načíst obsah souboru, inicializujte objekty File a FileStream, zavolejte metodu readUTFBytes() objektu FileStream a převeďte řetězec na objekt XML: var file:File = File.documentsDirectory.resolvePath("AIR Test/preferences.xml"); var fileStream:FileStream = new FileStream(); fileStream.open(file, FileMode.READ); var prefsXML:XML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable)); fileStream.close(); Podobně zápis dat do souboru je snadný, stejně jako nastavení příslušných objektů File a FileStream, a pak zavolání metody objektu FileStream. Předejte verzi řetězce dat XML metodě write, jako v následujícím kódu: var prefsXML:XML = <prefs><autoSave>true</autoSave></prefs>; var file:File = File.documentsDirectory.resolvePath("AIR Test/preferences.xml"); fileStream = new FileStream(); fileStream.open(file, FileMode.WRITE); var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n'; outputString += prefsXML.toXMLString(); fileStream.writeUTFBytes(outputString); fileStream.close(); Tyto příklady používají metody readUTFBytes() a writeUTFBytes(), protože předpokládají, že soubory jsou ve formátu UTF-8. Pokud tomu tak není, může být nutné použít jiný způsob (viz „Datové formáty a výběr metody čtení a zápisu“ na stránce 118). Předchozí příklad používají objekty FileStream otevření pro synchronní operaci. Můžete také otevřít soubory pro asynchronní operace (které se při reakci na události spoléhají na funkce posluchače událostí). Například následující kód ukazuje, jak číst soubor XML asynchronně: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 121 Práce se systémem souborů var file:File = File.documentsDirectory.resolvePath("AIR Test/preferences.xml"); var fileStream:FileStream = new FileStream(); fileStream.addEventListener(Event.COMPLETE, processXMLData); fileStream.openAsync(file, FileMode.READ); var prefsXML:XML; function processXMLData(event:Event):void { prefsXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable)); fileStream.close(); } Metoda processXMLData() je vyvolána v případě, že celý soubor je načten do vyrovnávací paměti (když objekt FileStream odešle událost complete). Volá metodu readUTFBytes(), aby získal verzi řetězce načtených dat a vytvoří objekt XML, prefsXML, na základě tohoto řetězce. Příklad: čtení a zápis dat s náhodným přístupem Soubory MP3 mohou zahrnovat značky ID3, což jsou oddíly na začátku nebo konci souboru, který obsahuje metadata identifikující záznam. Formát značky ID3 samotný má různé revize. Tento příklad popisuje, jak číst a zapisovat ze souboru MP3 obsahujícího nejjednodušší formát ID3 (ID3 verze 1.0) pomocí „náhodného přístupu k datům souboru“, což znamená, že čte a zapisuje do různých míst souboru. Soubor MP3, který obsahuje značku ID3 verze 1 zahrnuje data ID3 na konci souboru, v konečných 128 bajtech. Během přístupu k souboru pro náhodný zápis/čtení je důležité specifikovat FileMode.UPDATE jako parametr fileMode pro metodu open() nebo openAsync(): var file:File = File.documentsDirectory.resolvePath("My Music/Sample ID3 v1.mp3"); var fileStr:FileStream = new FileStream(); fileStr.open(file, FileMode.UPDATE); To umožňuje číst i zapisovat do souboru. Po otevření souboru můžete nastavit polohu ukazatele do umístění 128 bajtů před koncem souboru: fileStr.position = file.size - 128; Tento kód nastavuje vlastnost position na toto umístění v souboru, protože formát ID3 VB.0 specifikuje, že data značky ID3 jsou uložena v posledních 128 bajtech souboru. Specifikace rovněž definuje následující: • První 3 bajty značky obsahují řetězec „BAG". • Následujících 30 znaků obsahuje název skladby MP3, jako řetězec. • Následujících 30 znaků obsahuje jméno interpreta, jako řetězec. • Následujících 30 znaků obsahuje jméno alba, jako řetězec. • Následující 4 znaky obsahují rok, jako řetězec. • Následujících 30 znaků obsahuje poznámku, jako řetězec. • Následující bajt obsahuje kód žánru skladby. • Všechna data jsou ve formátu ISO 8859-1. Metoda id3TagRead() kontroluje data poté, co jsou načtena (po události complete): VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 122 Práce se systémem souborů function id3TagRead():void { if (fileStr.readMultiByte(3, "iso-8859-1").match(/tag/i)) { var id3Title:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3Artist:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3Album:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3Year:String = fileStr.readMultiByte(4, "iso-8859-1"); var id3Comment:String = fileStr.readMultiByte(30, "iso-8859-1"); var id3GenreCode:String = fileStr.readByte().toString(10); } } Můžete provést čtení souboru s náhodným přístupem. Například můžete analyzovat proměnnou id3Title a ujistit se, že má správná velká písmena (pomocí metod třídy String), a pak zapsat do souboru modifikovaný řetězec, nazvaný newTitle, jako v následujícím kódu: fileStr.position = file.length - 125; // 128 - 3 fileStr.writeMultiByte(newTitle, "iso-8859-1"); Pro splnění požadavků standardu ID3 verze 1 by dálka řetězce newTitle měla být 30 znaků, doplněných na konci kódem 0 (String.fromCharCode(0)). 123 Kapitola 15: Přetažení Třídy v API přetažení slouží k podpoře gest přetažení uživatelského rozhraní. Gesto v tomto významu je akce uživatele, zprostředkovaná operačním systémem a vaší aplikací, vyjadřující úmysl kopírovat, přesunout nebo propojit odkazem informace. Gesto tažení ven se vyskytne, když uživatel táhne objekt ven z komponenty nebo aplikace. Gesto tažení dovnitř se vyskytne, když uživatel táhne objekt z vnějšího prostředí do komponenty nebo aplikace. Díky API přetažení můžete uživateli umožnit přetahovat data mezi aplikacemi a mezi komponentami v rámci aplikace. Mezi podporované formáty přenosu patří: • Bitmapy • Soubory • Text ve formátu HTML • Text • Data ve formátu RTF • URL • Serializované objekty • Objektové odkazy (platné pouze v rámci iniciující aplikace) Doplňující online informace o přetahování myší Další informace o práci s API přetažení můžete získat z těchto 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 • NativeDragManager • NativeDragOptions • Clipboard • NativeDragEvent Články a ukázky aplikace Adobe Developer Connection • Adobe AIR Developer Connection pro Flash (hledání pro „přetažení AIR“) Základy přetažení API přetažení obsahuje následující třídy. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 124 Přetažení Balíček Třídy flash.desktop • NativeDragManager • NativeDragOptions • Schránka • NativeDragActions • ClipboardFormat • ClipboardTransferModes Konstanty používané s API přetažení jsou definovány v následujících třídách: flash.events • NativeDragActions • ClipboardFormat • ClipboardTransferModes NativeDragEvent Fáze gesta přetažení Gesto přetažení má následující tři fáze: Zahájení Uživatel zahájí operaci přetažení táhnutím z komponenty nebo položky v komponentě, přičemž drží stisknuté tlačítko myši. Komponenta, která je zdrojem tažené položky, je většinou navržena jako iniciátor tažení a odesílá události nativeDragStart a nativeDragComplete. Aplikace Adobe® AIR™ zahájí operaci tažení vyvoláním metody NativeDragManager.doDrag() v odpovědi na událost mouseDown nebo mouseMove. Tažení Uživatel drží stisknuté tlačítko myši a současně přesouvá kurzor myši k jiné komponentě, aplikaci nebo na plochu. Aplikace AIR během tažení volitelně zobrazí zástupný obraz. Dokud probíhá tažení, objekt iniciátoru odesílá události nativeDragUpdate. Když uživatel přejíždí kurzorem přes možný cíl upuštění v aplikaci AIR, cíl upuštění odešle událost nativeDragEnter. Manipulační program události může zkontrolovat objekt události, aby určil, zda jsou tažená data k dispozici ve formátu, který cíl přijímá, a pokud ano, umožní uživateli upustit data na tento cíl vyvoláním metody NativeDragManager.acceptDragDrop(). Dokud zůstává nad interaktivním objektem gesto tažení, odesílá daný objekt události nativeDragOver. Jakmile gesto tažení interaktivní objekt opustí, ten odešle událost nativeDragExit. Upuštění Uživatel uvolní tlačítko myši nad vhodným cílem upuštění. Je-li cíl aplikací AIR nebo komponentou, tak komponenta odešle událost nativeDragDrop. Manipulační program události má k přeneseným datům přístup z objektu události. Je-li cíl mimo aplikaci AIR, zpracuje upuštění operační systém nebo jiná aplikace. V obou případech odešle iniciující objekt událost nativeDragComplete (pokud bylo tažení zahájeno v aplikaci AIR). Třída NativeDragManager ovládá gesto tažení dovnitř i tažení ven. Všechny členy třídy NativeDragManager jsou statické, nevytvářejí instance této třídy. Objekt Clipboard Data, která jsou tažena do nebo z aplikace nebo komponenty, jsou obsažena v objektu Clipboard. Jeden objekt Clipboard může zpřístupnit různá zastoupení stejných informací, aby se zvýšila pravděpodobnost, že jiná aplikace může datům rozumět a použít je. Například obraz by mohl být vložen jako obrazová data, serializovaný objekt Bitmap nebo jako soubor. Vykreslení dat ve formátu může být odloženo do funkce vykreslení, která nebude vyvolána, dokud nebudou data načtena. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 125 Přetažení Jakmile bylo zahájeno gesto tažení, k objektu Clipboard je přístup pouze z manipulačního programu události pro události nativeDragEnter, nativeDragOver a nativeDragDrop. Po ukončení gesta tažení již nelze objekt Clipboard číst ani znovu použít. Objekt aplikace lze přenést jako odkaz a jako serializovaný objekt. Objektové odkazy jsou platné pouze v rámci iniciující aplikace. Přenosy serializovaných objektů jsou platné mezi aplikacemi AIR, ale lze je použít pouze s objekty, které zůstanou platné i po deserializaci serializovaných objektů. Objekty, které jsou serializované, jsou převedeny do formátu Action Message Format for ActionScript 3 (AMF3), což je formát přenosu dat na bázi řetězců.. Práce s rámcem Flex Ve většině případů je lepší použít při vytváření aplikací Flex API přetažení Adobe® Flex™. Rámec Flex poskytuje ekvivalentní nastavení funkce, když je aplikace Flex spuštěna v AIR (používá vlastnost NativeDragManager AIR interně). Aplikace Flex také podporuje více omezenou sadu funkcí, když aplikace nebo komponenta běží v omezenějším prostředí prohlížeče. Třídy AIR nelze použít v komponentách nebo aplikacích, které běží mimo prostředí chodu programu AIR. Podpora gesta tažení ven Chcete-li podporu gesta přetažení, musíte vytvořit objekt Clipboard v odpovědi na událost mouseDown a odeslat jej do metody NativeDragManager.doDrag(). Vaše aplikace pak může poslouchat událost nativeDragComplete na iniciujícím objektu a určit, jakou akci provést, když uživatel dokončí nebo zruší gesto. Příprava dat na přenos Chcete-li připravit data na přenos, vytvořte objekt Clipboard a přidejte informace, které mají být přeneseny, v jednom nebo více formátech. Můžete použít standardní formáty dat pro předání dat, která lze přenášet automaticky do nativních formátů schránky a formáty definované aplikací pro předávání objektů. Je-li převod přenášených informací do určitého formátu výpočetně náročný, můžete dodat název funkce manipulačního programu, která převod provede. Tato funkce bude vyvolána, pokud přijímající komponenta nebo aplikace přečte přidružený formát. Další informace viz „Schránka:formáty dat“ na stránce 143. Následující příklad ukazuje, jak vytvořit objekt Clipboard obsahující bitmapu v několika formátech: objekt Bitmap, nativní formát bitmapy a formát seznamu souborů obsahující soubor, ze kterého byla bitmapa původně načtena: import flash.desktop.Clipboard; import flash.display.Bitmap; import flash.filesystem.File; public function createClipboard(image:Bitmap, sourceFile:File):Clipboard{ var transfer:Clipboard = new Clipboard(); transfer.setData("CUSTOM_BITMAP", image, true); //Flash object by value and by reference transfer.setData(ClipboardFormats.BITMAP_FORMAT, image.bitmapData, false); transfer.setData(ClipboardFormats.FILE_LIST_FORMAT, new Array(sourceFile), false); return transfer; } Zahájení operace tažení ven Chcete-li zahájit operaci tažení, vyvolejte metodu NativeDragManager.doDrag() v odpovědi na událost poslední klepnutí myši. Metoda doDrag() je statická metoda, která přebírá následující parametry: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 126 Přetažení Parametr Popis iniciátor Objekt, ze kterého začíná tažení a který odesílá události dragStart a dragComplete. Iniciátor musí být interaktivní objekt. schránka Objekt Clipboard obsahující data k přenesení. Na objekt Clipboard jsou odkazy v objektech NativeDragEvent odeslaných během posloupnosti tažení a upuštění. dragImage (Volitelné) Objekt BitmapData k zobrazení během tažení. Obraz může určovat hodnotu alfa. (Poznámka: Microsoft Windows používá na obraz tažení vždy pevný útlum alfa.) posun (Volitelné) Objekt Point udávající posun obrazu tažení od aktivního bodu myši. Chcete-li přesunout obraz tažení nahoru a doleva vzhledem ke kurzoru myši, použijte záporné souřadnice. Není-li zadán žádný posun, je levý horní roh taženého obrazu umístěn na aktivním bodu myši. actionsAllowed (Volitelné) Objekt NativeDragOptions udávající, které akce (kopírování, přesun nebo odkaz) jsou platné pro operaci tažení. Není-li zadán žádný argument, jsou povoleny všechny akce. Na objekt DragOptions jsou odkazy v objektech NativeDragEvent umožňující, aby potenciální cíl tažení zkontroloval, zda jsou povolené akce kompatibilní s obsahem cílové komponenty. Například komponenta „trash“ by mohla přijímat pouze gesta, která umožňují akci přesunutí. Následující příklad ukazuje, jak zahájit operaci tažení u objektu bitmapy načteného ze souboru. V příkladu je načten obraz a při události mouseDown začne operace tažení. package { import flash.desktop.NativeDragManager; import mx.core.UIComponent; import flash.display.Sprite; import flash.display.Loader; import flash.system.LoaderContext; import flash.net.URLRequest; import flash.geom.Point; import flash.desktop.Clipboard; import flash.display.Bitmap; import flash.filesystem.File; import flash.events.Event; import flash.events.MouseEvent; public class DragOutExample extends UIComponent Sprite { protected var fileURL:String = "app:/image.jpg"; protected var display:Bitmap; private function init():void { loadImage(); } private function onMouseDown(event:MouseEvent):void { var bitmapFile:File = new File(fileURL); var transferObject:Clipboard = createClipboard(display, bitmapFile); NativeDragManager.doDrag(this, transferObject, display.bitmapData, new Point(-mouseX,-mouseY)); } public function createClipboard(image:Bitmap, sourceFile:File):Clipboard { var transfer:Clipboard = new Clipboard(); transfer.setData("bitmap", image, true); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 127 Přetažení // ActionScript 3 Bitmap object by value and by reference transfer.setData(ClipboardFormats.BITMAP_FORMAT, image.bitmapData, false); // Standard BitmapData format transfer.setData(ClipboardFormats.FILE_LIST_FORMAT, new Array(sourceFile), false); // Standard file list format return transfer; } private function loadImage():void { var url:URLRequest = new URLRequest(fileURL); var loader:Loader = new Loader(); loader.load(url,new LoaderContext()); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete); } private function onLoadComplete(event:Event):void { display = event.target.loader.content; var flexWrapper:UIComponent = new UIComponent(); flexWrapper.addChild(event.target.loader.content); addChild(flexWrapper); flexWrapper.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); } } } Dokončení přenosu tažení ven Jakmile uživatel upustí taženou položku uvolněním tlačítka myši, objekt iniciátoru odešle událost nativeDragComplete. Můžete zkontrolovat vlastnost dropAction a poté provést příslušnou akci. Například je-li akce NativeDragAction.MOVE, mohli byste odstranit zdrojovou položku z jejího původního umístění. Uživatel může zrušit gesto tažení uvolněním tlačítka myši, přičemž je kurzor mimo vhodného cíle upuštění. Správce tažení nastaví vlastnost dropAction zrušeného gesta na hodnotu NativeDragAction.NONE. Podpora gesta tažení dovnitř Chcete-li podporu gesta tažení dovnitř, vaše aplikace (nebo spíše viditelná komponenta vaší aplikace) musí reagovat na události nativeDragEnter nebo nativeDragOver. Postup při typické operaci upuštění Pro operaci upuštění je typická následující posloupnost událostí: 1 Uživatel táhne objekt schránky nad nějakou komponentu. 2 Komponenta odešle událost nativeDragEnter. 3 Manipulační program události nativeDragEnter prověří dostupné formáty dat a povolené akce objektu události. Jestliže komponenta dokáže zpracovat operaci upuštění, vyvolá metodu NativeDragManager.acceptDragDrop(). 4 Objekt NativeDragManager změní kurzor myši tak, aby označoval, že objekt lze upustit. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 128 Přetažení 5 Uživatel upustí objekt nad danou komponentou. 6 Přijímající komponenta odešle událost nativeDragDrop. 7 Přijímající komponenta přečte data v požadovaném formátu z objektu Clipboard uvnitř objektu události. 8 Jestliže gesto tažení vzniklo v aplikaci AIR, odešle iniciující interaktivní objekt událost nativeDragComplete. Jestliže gesto vzniklo mimo aplikaci AIR, není vyslána žádná odezva. Potvrzení gesta tažení dovnitř Jakmile uživatel vtáhne položku schránky do mezí vizuální komponenty, odešle komponenta události nativeDragEnter a nativeDragOver. Chcete-li určit, zda může komponenta přijmout položku schránky, manipulační programy pro tyto události mohou zkontrolovat vlastnosti clipboard a allowedActions objektu události. Schopnost komponenty přijmout upuštění je signalizována tak, že manipulační program vyvolá metodu NativeDragManager.acceptDragDrop()) a současně předá odkaz na přijímající komponentu. Pokud více než jeden registrovaný posluchač události vyvolá metodu acceptDragDrop(),přednost bude mít poslední posluchač v seznamu. Volání metody acceptDragDrop() zůstane v platnosti, dokud myš neopustí hranice přijímajícího objektu a nespustí událost nativeDragExit. Je-li v parametru allowedActions předávanému metodě doDrag() povolena více než jedna akce, může uživatel přidržením klávesy modifikátoru určit, kterou z povolených akcí má v úmyslu provést. Správce tažení změní obraz kurzoru, aby uživateli sdělil, která akce bude provedena, pokud dokončí upuštění. Zamýšlenou akci oznamuje vlastnost dropAction objektu NativeDragEvent. Akce nastavená pro gesto tažení je pouze doporučení. Komponenty zapojené do přenosu musí implementovat příslušné chování. Například chcete-li dokončit akci přesunu, iniciátor tažení by mohl odstranit taženou položku a cíl upuštění by ji mohl přidat. Váš cíl tažení může omezit akci upuštění na jednu ze tří možných akcí nastavením vlastnosti dropAction třídy NativeDragManager. Jestliže se uživatel pomocí klávesnice pokusí zvolit jinou akci, objekt NativeDragManager zobrazí nepoužitelný kurzor. Nastavte vlastnost dropAction v manipulačních programech pro události nativeDragEnter a nativeDragOver. Následující příklad ukazuje manipulační program události pro událost nativeDragEnter nebo nativeDragOver. Tento manipulační program přijme gesto tažení dovnitř, obsahuje-li tažená schránka data v textovém formátu. import flash.desktop.NativeDragManager; import flash.events.NativeDragEvent; public function onDragIn(event:NativeDragEvent):void{ NativeDragManager.dropAction = NativeDragActions.MOVE; if(event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){ NativeDragManager.acceptDragDrop(this); //'this' is the receiving component } } Dokončení upuštění Jakmile uživatel upustí taženou položku na interaktivní objekt, který toto gesto přijal, interaktivní objekt odešle událost nativeDragDrop. Manipulační program pro tuto událost může vyjmout data z vlastnosti clipboard objektu události. Když schránka obsahuje formát definovaný aplikací, parametr transferMode předaný metodě getData() objektu Clipboard určí, zda správce tažení vrátí odkaz nebo serializovanou verzi objektu. Následující příklad ukazuje manipulační program události pro událost nativeDragDrop: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 129 Přetažení import flash.desktop.Clipboard; import flash.events.NativeDragEvent; public function onDrop(event:NativeDragEvent):void { if (event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) { var text:String = String(event.clipboard.getData(ClipboardFormats.TEXT_FORMAT, ClipboardTransferMode.ORIGINAL_PREFERRED)); } Jakmile manipulační program události skončí, objekt Clipboard ztratí platnost. Jakýkoli pokus o přístup k objektu nebo jeho datům vyvolá chybu. Aktualizace vizuálního vzhledu komponenty Komponenta může aktualizovat svůj vizuální vzhled na základě událostí NativeDragEvent. V následující tabulce je popis typů změn, které by typická komponenta provedla v odpovědi na různé události: Událost Popis nativeDragStart Iniciující interaktivní objekt může pomocí události nativeDragStart poskytnout vizuální odezvu, že gesto tažení pochází z daného interaktivního objektu. nativeDragUpdate Iniciující interaktivní objekt může během gesta pomocí události nativeDragUpdate aktualizovat svůj stav. nativeDragEnter Potenciální přijímající interaktivní objekt se může pomocí této události aktivovat pro vstup nebo vizuálně udávat, zda může nebo nemůže přijmout upuštění. nativeDragOver Potenciální přijímající interaktivní objekt může pomocí této události reagovat na pohyb myši uvnitř interaktivního objektu, např. když kurzor myši vstoupí do „aktivní“ oblasti složité komponenty, jako je zobrazení pouliční mapy. nativeDragExit Potenciální přijímající interaktivní objekt může pomocí této události obnovit svůj stav, když se gesto tažení přesune mimo jeho hranice. nativeDragComplete Iniciující interaktivní objekt může pomocí této události aktualizovat svůj přidružený model dat, např. odstraněním určité položky ze seznamu, a obnovit svůj vizuální stav. Sledování pozice myši během gesta tažení dovnitř Dokud gesto tažení zůstává nad komponentou, odesílá příslušná komponenta události nativeDragOver. Tyto události jsou odesílány každých pár milisekund a také při každém pohybu myši. Objekt události nativeDragOver je možno použít k určení pozice myši nad komponentou. Přístup k pozici myši může být užitečný v situacích, kdy je přijímající komponenta složitá, ale není složená z dílčích komponent. Například když vaše aplikace zobrazila bitmapu obsahující pouliční mapu a vy chcete na mapě zvýraznit zóny, když do nich uživatel vtáhne informace, můžete použít souřadnice myši udané v události nativeDragOver ke sledování pozice myši v mapě. Přetažení HTML Chcete-li táhnout data do a z aplikací na bázi HTML (nebo do a z obsahu HTML zobrazeného v objektu HTMLLoader), můžete použít události přetažení HTML. API přetažení HTML umožňuje táhnout do a z elementů DOM v obsahu HTML. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 130 Přetažení Poznámka: Také můžete použít API NativeDragEvent a NativeDragManager aplikace AIR posloucháním událostí na objektu HTMLLoader obsahujícím obsah HTML. Avšak API HTML je lépe integrované s rozhraním HTML DOM a poskytuje kontrolu nad výchozím chováním. Výchozí chování tažení Prostředí HTML poskytuje výchozí chování pro gesta přetažení zahrnující text, obrazy a URL. Při použití výchozího chování můžete tyto typy dat vždy vytáhnout ven z elementu. Text však můžete táhnout pouze do elementu a pouze do elementů v upravitelné oblasti stránky. Když táhnete text mezi upravitelnými oblastmi nebo uvnitř upravitelných oblastí stránky, výchozí chování provede akci přesunutí. Když táhnete text do upravitelné oblasti z neupravitelné oblasti mimo aplikaci, výchozí chování provede akci kopírování. Výchozí chování můžete potlačit tak, že budete události přetažení zpracovávat sami. Chcete-li zrušit výchozí chování, musíte vyvolat metody preventDefault() objektů odeslaných pro události přetažení. Pro provedení zvolené akce můžete poté dle potřeby vložit data do cíle pro upuštění a odstranit data ze zdroje tažení. Implicitně může uživatel vybrat a táhnout libovolný text a také táhnout obrázky a odkazy. Chcete-li ovládat způsob výběru libovolného elementu HTML, můžete použít vlastnost WebKit CSS, -webkit-user-select. Například nastavíte-li -webkit-user-select na hodnotu none, obsah elementu nebude zvolitelný, a proto ho nebude možné přetáhnout. Také můžete použít vlastnost -webkit-user-drag CSS k ovládání, zda může být přetažen určitý element jako celek. Obsah elementu je však zpracováván zvlášť. Uživatel by i tak mohl přetáhnout vybranou část textu. Další informace viz „Rozšíření pro jazyk CSS“ na stránce 205. Události přetažení v HTML Události odesílané elementem iniciátoru, ze kterého data pocházejí, jsou následující: Událost Popis dragstart Odeslána, jakmile uživatel zahájí gesto tažení. Manipulační program pro tuto událost může v případě nutnosti zabránit tažení vyvoláním metody preventDefault() objektu události. Chcete-li ovládat, zda mohou být přetažená data zkopírována, propojena odkazem nebo přesunuta, nastavte vlastnost effectAllowed. Vybraný text, obrazy a odkazy jsou výchozím chováním vloženy do schránky, ale pro gesto tažení můžete nastavit jiná data pomocí vlastnosti dataTransfer objektu události. tažení Odesílána nepřetržitě během gesta tažení. dragend Odeslána, jakmile uživatel uvolní tlačítko myši a ukončí tak gesto tažení. Události odesílané cílem tažení jsou následující: Událost Popis dragover Odesílána nepřetržitě, dokud gesto tažení zůstává v rámci hranic elementu. Manipulační program pro tuto událost by měl nastavit vlastnost dataTransfer.dropEffect tak, aby označovala, zda bude mít upuštění za následek akci kopírování, přesunutí nebo vytvoření odkazu, až uživatel uvolní tlačítko myši. dragenter Odeslána, jakmile gesto tažení překročí dovnitř hranice elementu. Změníte-li kterékoli vlastnosti objektu dataTransfer v manipulačním programu události dragenter, budou tyto změny rychle potlačeny následující událostí dragover. Na druhou stranu existuje krátké zpoždění mezi událostí dragenter a první událostí dragover, které může způsobit, že bude kurzor blikat, jsou-li nastaveny různé vlastnosti. V mnoha případech můžete použít pro obě události stejný manipulační program události. dragleave Odeslána, jakmile gesto tažení opustí hranice elementu. upuštění Odeslána, jakmile uživatel upustí data na element. K taženým datům je přístup pouze v rámci manipulačního programu pro tuto událost. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 131 Přetažení Objekt události odeslaný v odpovědi na tyto události je podobný události myši. Chcete-li určit pozici myši, můžete použít vlastnosti události mouse (např. clientX, clientY) a (screenX, screenY). Nejdůležitější vlastností události tažení je dataTransfer, která obsahuje právě tažená data. Samotný objekt dataTransfer má následující vlastnosti a metody: Vlastnost nebo Metoda Popis effectAllowed Účinek povolený zdrojem tažení. Tuto hodnotu obvykle nastavuje manipulační program pro událost dragstart. Viz „Účinky tažení v HTML“ na stránce 132. dropEffect Účinek zvolený cílem nebo uživatelem. Nastavíte-li vlastnost dropEffect v manipulačním programu události dragover nebo dragenter, aplikace AIR aktualizuje kurzor myši tak, aby označoval účinek, který se vyskytne, když uživatel uvolní tlačítko myši. Jestliže se nastavení vlastnosti dropEffect neshoduje s jedním z povolených účinků, není povoleno žádné upuštění a je zobrazen kurzor unavailable. Jestliže jste nenastavili vlastnost dropEffect v odpovědi na poslední událost dragover nebo dragenter, může si uživatel vybrat z povolených účinků se standardními klávesami modifikátoru operačního systému. Konečný účinek je oznámen vlastností dropEffect objektu odeslaného pro událost dragend. Jestliže se uživatel vyhne upuštění tak, že uvolní tlačítko myši mimo vhodný cíl, bude vlastnost dropEffect nastavena na hodnotu none. typy Pole obsahující řetězce typu MIME pro každý formát dat přítomný v objektu dataTransfer. getData(mimeType) Získá data ve formátu určeném parametrem mimeType. Metodu getData() lze vyvolat pouze v odpovědi na událost drop. setData(mimeType) Přidá data k vlastnosti dataTransfer ve formátu určeném parametrem mimeType. Vyvoláním metody setData() pro každý typ MIME můžete přidat data do více formátů. Veškerá data umístěná do objektu dataTransfer výchozím chováním tažení budou vymazána. Metodu setData() lze vyvolat pouze v odpovědi na událost dragstart. clearData(mimeType) Vymaže veškerá data ve formátu určeném parametrem mimeType. setDragImage(image, offsetX, offsetY) Nastaví vlastní obraz tažení. Metodu setDragImage() lze vyvolat pouze v odpovědi na událost dragstart. Typy MIME pro přetažení HTML Typy MIME pro použití s objektem dataTransfer události přetažení HTML zahrnují: Formát dat typ MIME 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“ Také můžete použít jiné řetězce MIME, včetně řetězců definovaných aplikací. Avšak jiné aplikace nemusí být schopny přenesená data rozpoznat či použít. Je vaší odpovědností přidat data do objektu dataTransfer v očekávaném formátu. Důležité: K upuštěným souborům má přístup pouze kód běžící v karanténě aplikace. Pokus o čtení nebo nastavení kterékoli vlastnosti objektu File uvnitř neaplikační karantény vygeneruje chybu zabezpečení. Další informace viz „Manipulace se soubory upuštěnými v neaplikačních karanténách HTML“ na stránce 135. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 132 Přetažení Účinky tažení v HTML Iniciátor gesta tažení může omezit povolené účinky tažení nastavením vlastnosti dataTransfer.effectAllowed v manipulačním programu pro událost dragstart. Je možno použít následující hodnoty řetězce: Hodnota řetězce Popis „žádná“ Nejsou povoleny žádné operace tažení. „kopie“ Data budou zkopírována na místo určení a originál bude ponechán na místě. „link“ Data budou sdílena s cílem pro upuštění pomocí odkazu zpět na originál. „přemístění” Data budou zkopírována na místo určení a odstraněna z původního umístění. „copyLink“ Data lze kopírovat nebo propojit odkazem. „copyMove“ Data lze kopírovat nebo přesunout. „linkMove“ Data lze propojit odkazem nebo přesunout. „all“ Data lze kopírovat, přesunout nebo propojit odkazem. All je výchozí účinek, když bráníte výchozímu chování. Cíl gesta tažení může nastavit vlastnost dataTransfer.dropEffect tak, aby označovala akci, která bude provedena, jakmile uživatel dokončí upuštění. Je-li účinek upuštění jedna z povolených akcí, systém zobrazí příslušný kurzor kopírování, přesunu nebo odkazu. Pokud ne, systém odešle kurzor unavailable. Jestliže není cílem nastaven žádný účinek upuštění, může si uživatel vybrat z povolených akcí s klávesami modifikátoru. Nastavte hodnotu vlastnosti dropEffect v manipulačních programech pro obě události dragover a dragenter: function doDragStart(event) { event.dataTransfer.setData("text/plain","Text to drag"); event.dataTransfer.effectAllowed = "copyMove"; } function doDragOver(event) { event.dataTransfer.dropEffect = "copy"; } function doDragEnter(event) { event.dataTransfer.dropEffect = "copy"; } Poznámka: I když byste měli vždy nastavit vlastnost dropEffect v manipulačním programu pro událost dragenter, uvědomte si, že následující událost dragover nastaví tuto vlastnost zpět na její výchozí hodnotu. Nastavte vlastnost dropEffect v odpovědi na obě události. Tažení dat z elementu HTML Výchozí chování umožňuje, aby byla většina obsahu na stránce HTML zkopírována tažením. Obsah povolený k tažení můžete ovládat pomocí vlastností CSS -webkit-user-select a -webkit-user-drag. Potlačte výchozí chování tažení ven v manipulačním programu pro událost dragstart. Chcete-li vložit svá vlastní data do gesta tažení, vyvolejte metodu setData() vlastnosti dataTransfer objektu události. Chcete-li označit, které účinky tažení zdrojový objekt podporuje, když se nespoléháte na výchozí chování, nastavte vlastnost dataTransfer.effectAllowed objektu události odeslaného pro událost dragstart. Můžete si zvolit libovolnou kombinaci účinků. Například podporuje-li zdrojový element účinky copy i link, nastavte danou vlastnost na „copyLink". VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 133 Přetažení Nastavení tažených dat Přidejte data pro gesto tažení v manipulačním programu pro událost dragstart s vlastností dataTransfer. Pomocí metody dataTransfer.setData() vložte data do schránky, přičemž předáte typ MIME dat k přenesení. Například jestliže jste měli ve své aplikaci obrazový element s id imageOfGeorge, mohli byste použít následující manipulační program události dragstart. V tomto příkladu jsou předána zastoupení fotografie Georgea v několika formátech dat, což zvyšuje pravděpodobnost, že jiné aplikace budou moci přetažená data použít. function dragStartHandler(event){ event.dataTransfer.effectAllowed = "copy"; var dragImage = document.getElementById("imageOfGeorge"); var dragFile = new air.File(dragImage.src); event.dataTransfer.setData("text/plain","A picture of George"); event.dataTransfer.setData("image/x-vnd.adobe.air.bitmap", dragImage); event.dataTransfer.setData("application/x-vnd.adobe.air.file-list", new Array(dragFile)); } Poznámka: Když vyvoláte metodu setData() objektu dataTransfer, chování přetažení nepřidá implicitně žádná data. Tažení dat do elementu HTML Výchozí chování povoluje, aby byl text přetažen pouze do upravitelných oblastí stránky. Můžete určit, že určitý element a jeho potomci mohou být učiněni upravitelnými zahrnutím atributu contenteditable do úvodního tagu daného elementu. Také můžete učinit celý dokument upravitelným nastavením vlastnosti designMode objektu dokumentu na „on". Náhradní chování na stránce můžete podpořit zpracováním událostí dragenter, dragover a drop pro libovolné elementy, které mohou přijímat přetažená data. Povolení tažení dovnitř Chcete-li zpracovat gesto tažení dovnitř, musíte nejprve zrušit výchozí chování. Poslouchejte události dragenter a dragover na libovolných elementech HTML, které chcete použít jako cíle upuštění. V manipulačních programech pro tyto události vyvolejte metodu preventDefault() odeslaného objektu události. Zrušení výchozího chování umožňuje, aby neupravitelné oblasti přijímaly upuštění. Získání upuštěných dat K upuštěným datům v manipulačním programu pro událost ondrop máte přístup: function doDrop(event){ droppedText = event.dataTransfer.getData("text/plain"); } Pomocí metody dataTransfer.getData() přečtěte data do schránky, přičemž předáte typ MIME formátu dat k přečtení. Dostupnost formátů dat můžete zjistit pomocí vlastnosti types objektu dataTransfer. Pole types obsahuje řetězec typu MIME každého dostupného formátu. Když zrušíte výchozí chování v událostech dragenter nebo dragover, budete zodpovědní za vložení jakýchkoli upuštěných dat na správné místo v dokumentu. Neexistuje žádné API pro převod pozice myši na textový kurzor uvnitř elementu. Toto omezení může ztížit implementaci gest tažení typu textového kurzoru. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 134 Přetažení Příklad: Potlačení výchozího chování tažení dovnitř HTML V tomto příkladu je implementován cíl upuštění, který zobrazuje tabulku se všemi formáty dat dostupnými v upuštěné položce. Výchozí chování slouží k povolení tažení textu, odkazů a obrazů v rámci aplikace. V příkladu je potlačeno výchozí chování tažení dovnitř pro element div, který slouží jako cíl upuštění. Klíčovým krokem k povolení neupravitelného obsahu pro přijetí gesta tažení dovnitř je volání metody preventDefault() objektu události odeslaného pro události dragenter a dragover. V odpovědi na událost drop manipulační program převede přenesená data do řádkového elementu HTML a vloží řádek do tabulky k zobrazení. <html> <head> <title>Drag-and-drop</title> <script language="javascript" type="text/javascript" src="AIRAliases.js"></script> <script language="javascript"> function init(){ var target = document.getElementById('target'); target.addEventListener("dragenter", dragEnterOverHandler); target.addEventListener("dragover", dragEnterOverHandler); target.addEventListener("drop", dropHandler); var source = document.getElementById('source'); source.addEventListener("dragstart", dragStartHandler); source.addEventListener("dragend", dragEndHandler); emptyRow = document.getElementById("emptyTargetRow"); } function dragStartHandler(event){ event.dataTransfer.effectAllowed = "copy"; } function dragEndHandler(event){ air.trace(event.type + ": " + event.dataTransfer.dropEffect); } function dragEnterOverHandler(event){ event.preventDefault(); } var emptyRow; function dropHandler(event){ for(var prop in event){ air.trace(prop + " = " + event[prop]); } var row = document.createElement('tr'); row.innerHTML = "<td>" + event.dataTransfer.getData("text/plain") + "</td>" + "<td>" + event.dataTransfer.getData("text/html") + "</td>" + "<td>" + event.dataTransfer.getData("text/uri-list") + "</td>" + "<td>" + event.dataTransfer.getData("application/x-vnd.adobe.air.file-list") + "</td>"; var imageCell = document.createElement('td'); if((event.dataTransfer.types.toString()).search("image/x-vnd.adobe.air.bitmap") > 1){ imageCell.appendChild(event.dataTransfer.getData("image/x- VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 135 Přetažení vnd.adobe.air.bitmap")); } row.appendChild(imageCell); var parent = emptyRow.parentNode; parent.insertBefore(row, emptyRow); } </script> </head> <body onLoad="init()" style="padding:5px"> <div> <h1>Source</h1> <p>Items to drag:</p> <ul id="source"> <li>Plain text.</li> <li>HTML <b>formatted</b> text.</li> <li>A <a href="http://www.adobe.com">URL.</a></li> <li><img src="icons/AIRApp_16.png" alt="An image"/></li> <li style="-webkit-user-drag:none;"> Uses "-webkit-user-drag:none" style. </li> <li style="-webkit-user-select:none;"> Uses "-webkit-user-select:none" style. </li> </ul> </div> <div id="target" style="border-style:dashed;"> <h1 >Target</h1> <p>Drag items from the source list (or elsewhere).</p> <table id="displayTable" border="1"> <tr><th>Plain text</th><th>Html text</th><th>URL</th><th>File list</th><th>Bitmap Data</th></tr> <tr id="emptyTargetRow"><td> </td><td> </td><td> </td><td> </td><td> </ td></tr> </table> </div> </div> </body> </html> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 136 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. <html> <head> <title>Drag-and-drop in a remote sandbox</title> <script language="javascript" type="text/javascript" src="AIRAliases.js"></script> <script language="javascript"> window.htmlLoader.addEventListener("nativeDragDrop",function(event){ var filelist = event.clipboard.getData(air.ClipboardFormats.FILE_LIST_FORMAT); air.trace(filelist[0].url); }); </script> </head> <body> <iframe src="child.html" sandboxRoot="http://localhost/" documentRoot="app:/" frameBorder="0" width="100%" height="100%"> </iframe> </body> </html> 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í. <html> <head> <title>Drag and drop target</title> <script language="javascript" type="text/javascript"> function preventDefault(event){ event.preventDefault(); } </script> </head> <body ondragenter="preventDefault(event)" ondragover="preventDefault(event)"> <div> <h1>Drop Files Here</h1> </div> </body> </html> Další informace viz „Programování v jazycích HTML a JavaScript“ na stránce 207. 137 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) 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í • Adobe AIR Developer Connection for Flash (hledání „kopírování a vkládání v AIR“) Základy kopírování a vkládání API pro kopírování a vkládání obsahuje následující třídy. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 138 Kopírování a vkládání Balíček Třídy flash.desktop • Clipboard • ClipboardFormats • ClipboardTransferMode Konstanty používané s API pro kopírování a vkládání jsou definovány v následujících třídách: • ClipboardFormats • ClipboardTransferMode Statická vlastnost Clipboard.generalClipboard představuje schránku operačního systému. Třída Clipboard poskytuje metody pro čtení a zápis dat do objektů schránky. Je možno vytvářet i nové objekty Clipboard pro přenášení dat prostřednictvím API pro přetahování. Prostředí HTML poskytuje alternativní API pro kopírování a vkládání. Obě API mohou využít kód běžící v karanténě zabezpečení aplikace, ale pouze API HTML lze použít v neaplikačním obsahu. (Viz „Kopírování a vkládání v HTML“ na stránce 139.) Třídy HTMLLoader a TextField implementují výchozí chování pro běžné klávesové zkratky kopírování a vkládání. Chcete-li implementovat chování zkratek pro kopírování a vkládání pro vlastní komponenty, můžete poslouchat přímo stisknutí těchto kláves. Můžete také použít nativní příkazy nabídky spolu s ekvivalenty kláves jako nepřímé reagování na stisknutí kláves. V jediném objektu Clipboard lze zpřístupnit různé reprezentace stejných informací ke zvýšení schopnosti jiných aplikací, rozumět těmto datům a používat je. Například obraz může být vložen jako obrazová data, serializovaný objekt Bitmap a jako soubor. Vykreslení dat ve formátu může být odloženo, takže daný formát vlastně nebude vytvořen, dokud nebudou přečtena data v tomto formátu. Poznámka: Není zaručeno, že data zapsaná do schránky zůstanou přístupná i po ukončení aplikace AIR. Operace čtení a zápis se systémovou schránkou Chcete-li číst ze schránky operačního systému, vyvolejte metodu getData() objektu Clipboard.generalClipboard, přičemž předáte název formátu, který se má číst: import flash.desktop.Clipboard; import flash.desktop.ClipboardFormats; if(Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){ var text:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT); } Chcete-li něco zapsat do schránky, přidejte data do objektu Clipboard.generalClipboard v jednom nebo více formátech. Existující data ve stejném formátu budou automaticky přepsána. Před zápisem nových dat do systémové schránky je však dobré vymazat i ji, aby bylo zajištěno, že budou smazána také nesouvisející data ve všech ostatních formátech. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 139 Kopírování a vkládání import flash.desktop.Clipboard; import flash.desktop.ClipboardFormats; var textToCopy:String = "Copy to clipboard."; Clipboard.generalClipboard.clear(); Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, textToCopy, false); Poznámka: Pouze kód běžící v karanténě aplikace má přímý přístup k systémové schránce. V případě jiného obsahu než HTML máte ke schránce přístup pouze prostřednictvím vlastnosti clipboardData objektu události odeslaného jednou z událostí kopírování nebo vložení HTML. 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. 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í event. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 140 Kopírování a vkládání 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ý. <html> <head> <title>Copy and Paste</title> <script language="javascript" type="text/javascript"> function onCopy(event){ var selection = window.getSelection(); event.clipboardData.setData("text/html","<i>" + selection + "</i>"); event.preventDefault(); } function onCut(event){ var selection = window.getSelection(); event.clipboardData.setData("text/html","<i>" + selection + "</i>"); 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(); } </script> </head> <body onCopy="onCopy(event)" onPaste="onPaste(event)" onCut="onCut(event)"> <p>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> </body> </html> VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 141 Kopírování a vkládání 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.) 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 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. 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í. Tento interní příkaz rozpoznají pouze objekty TextArea a HTMLLoader. Podobné příkazy jsou dostupné pro vyjmutí, vložení, výběr všech položek a pouze pro TextArea, vymazání, zpět a znovu. Poznámka: Ve vlastní komponentě není k dispozici žádné API pro reagování na tyto interní příkazy. Musíte buď rozšířit třídu TextArea nebo HTMLLoader nebo zahrnout jeden z těchto objektů do vaší vlastní komponenty. Zahrnete-li objekt TextArea nebo HTMLLoader, musí vaše komponenta spravovat aktivaci pro vstup tak, aby objekt TextArea nebo HTMLLoader zůstával stále aktivní, dokud je aktivní i samotná komponenta. 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ÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 142 Kopírování a vkládání 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, recurse); } if(searchItem != null){ break; } } return searchItem; } 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. Jinak můžete poslouchat stisknutí příslušných kláves sami, jak ukazuje následující příklad: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 143 Kopírování a vkládání 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 kopírování a vložení. Schránka:formáty dat Formáty Clipboard popisují data umístěná do objektu Clipboard. Aplikace AIR automaticky přeloží standardní formáty dat mezi typy dat ActionScript a formáty systémové schránky. Objekty aplikace lze navíc přesunout v rámci aplikace AIR a mezi aplikacemi AIR pomocí formátů definovaných aplikací. Objekt Clipboard může obsahovat zastoupení stejných informací v různých formátech. Například objekt Clipboard představující pohyblivý symbol by mohl zahrnovat formát odkazu pro použití ve stejné aplikaci, specializovaný formát pro použití jinou aplikací AIR, formát bitmapy pro použití v editoru obrazu a formát seznamu souborů, třeba s odloženým vykreslením pro kódování souboru PNG, pro kopírování nebo přetažení zastoupení pohyblivého symbolu do systému souborů. Standardní formáty dat Konstanty definující standardní názvy formátů jsou zahrnuty v třídě ClipboardFormats: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 144 Kopírování a vkládání Konstanta Popis TEXT_FORMAT Data v textovém formátu se překládají do a z třídy String jazyka ActionScript. HTML_FORMAT Text se značkami HTML. RICH_TEXT_FORMAT Data ve formátu RTF se překládají do a z třídy ByteArray jazyka ActionScript. Značky RTF se nijak neinterpretují ani nepřekládají. BITMAP_FORMAT Data ve formátu bitmap se překládají do a z třídy BitmapData jazyka ActionScript. FILE_LIST_FORMAT Data ve formátu seznamu souborů se překládají do a z pole objektů File jazyka ActionScript. URL_FORMAT Data ve formátu URL se překládají do a z třídy String jazyka ActionScript. Poznámka: Data ve formátu RTF v současné době nepodporují žádné textové ovládací prvky ani komponenty programu Flash. Chcete-li vložit data RTF do ovládání, nejprve přeložte označení RTF na označení HTML (nebo prostý text). Podobně chcete-li kopírovat data RTF do schránky, převeďte text nebo řetězec HTML na objekt ByteArray doplněný správným označením RTF. Jazyk Flash neposkytuje žádnou třídu utility pro převod dat RTF na jiný formát. Při kopírování a vkládání dat v odpovědi na událost copy, cut nebo paste v obsahu HTML je třeba místo řetězců ClipboardFormat použít typy MIME. Platné typy MIME dat jsou: typ MIME Popis Text „text/plain“ URL „text/uri-list“ Bitmapa „image/x-vnd.adobe.air.bitmap“ Seznam souborů „application/x-vnd.adobe.air.file-list“ Poznámka: Data ve formátu RTF nejsou dostupná z vlastnosti clipboardData objektu události odeslaného jako výsledek události paste v obsahu HTML. Vlastní formáty dat Vlastní formáty definované aplikací můžete použít k převodu objektů jako odkazů nebo jako serializovaných kopií. Odkazy jsou platné pouze v rámci stejné aplikace AIR. Serializované objekty lze převádět mezi aplikacemi Adobe AIR, ale lze je použít pouze s objekty, které zůstávají při serializaci a deserializaci v platnosti. Objekty mohou být obvykle serializovány, pokud jsou jejich vlastnosti buď jednoduché typy nebo serializovatelné objekty. Chcete-li přidat serializovaný objekt do objektu Clipboard, nastavte serializovatelný parametr při volání metody Clipboard.setData() na hodnotu true. Název formátu může být jeden ze standardních formátů nebo libovolný řetězec definovaný vaší aplikací. Režimy přenosu Když je objekt zapsán do schránky pomocí vlastního formátu dat, data v objektu je možno číst ze schránky buď jako odkaz nebo jako serializovanou kopii původního objektu. Aplikace AIR definuje režimy přenosu, které určují, zda budou objekty přenášeny jako odkazy nebo serializované kopie: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 145 Kopírování a vkládání Režim přenosu Popis ClipboardTransferModes.ORIGINAL_ONLY Bude vrácen pouze odkaz. Není-li k dispozici žádný odkaz, bude vrácena hodnota null. ClipboardTransferModes.ORIGINAL_PREFFERED Bude vrácen odkaz, je-li k dispozici. Jinak bude vrácena serializovaná kopie. ClipboardTransferModes.CLONE_ONLY Bude vrácena pouze serializovaná kopie. Není-li žádná serializovaná kopie k dispozici, bude vrácena hodnota null. ClipboardTransferModes.CLONE_PREFFERED Bude vrácena serializovaná kopie, je-li k dispozici. Jinak bude vrácen odkaz. Čtení a zápis vlastních formátů dat Při zápisu objektu do schránky můžete použít libovolný řetězec, který nezačíná vyhrazenou předponou air: pro parametr formátu. Chcete-li objekt číst, použijte stejný řetězec jako formát. Následující příklady ukazují, jak číst a zapisovat objekty ze a do schránky: public function createClipboardObject(object:Object):Clipboard{ var transfer:Clipboard = new Clipboard(); transfer.setData("object", object, true); } Chcete-li vyjmout serializovaný objekt z objektu schránky (po operaci přetažení nebo vložení), použijte stejný název formátu a režim přenosu cloneOnly nebo clonePreferred. var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY); Do objektu Clipboard bude vždy přidán odkaz. Chcete-li vyjmout odkaz z objektu schránky (po přetažení nebo vložení), použijte místo serializované kopie režim přenosu originalOnly nebo originalPreferred. var transferredObject:Object = clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY); Odkazy jsou platné, pouze pokud objekt Clipboard pochází z aktuální aplikace AIR. Prostřednictvím režimu přenosu originalPreferred máte přístup k odkazu, je-li k dispozici, a k serializovanému klonu, pokud není k dispozici odkaz. Odložené vykreslení Je-li vytváření formátu dat náročné na výpočet, můžete použít odložené vykreslení poskytnutím funkce, která dodává data na vyžádání. Tato funkce se vyvolává, pouze pokud přijímač operace přetažení vyžaduje data v odloženém formátu. Funkce vykreslení se přidává do objektu Clipboard pomocí metody setDataHandler(). Funkce musí vracet data v příslušném formátu. Vyvoláte-li například metodu setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText), tak funkce writeText() musí vrátit řetězec. Je-li do objektu Clipboard přidán formát dat stejného typu pomocí metody setData(), data budou mít přednost před odloženou verzí (funkce vykreslení nebude vyvolána). Funkce vykreslení může nebo nemusí být znovu vyvolána, jsouli podruhé použita stejná data schránky. Poznámka: V systému Mac OS X se odložené vykreslení při používání standardních formátů schránky AIR nevyskytuje. Funkce vykreslení je vyvolána okamžitě. Vkládání textu pomocí funkce odloženého vykreslení Následující příklad ukazuje, jak implementovat funkci odloženého vykreslení. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 146 Kopírování a vkládání Po stisknutí tlačítka Kopírovat v příkladu vymaže aplikace systémovou schránku, aby se zajistilo, že po předchozích operacích se schránkou v ní nezůstanou žádná data, dále vloží na schránku funkci renderData() s metodou setDataHandler(). Jakmile je stisknuto tlačítko Vložit, aplikace vstoupí do schránky a nastaví cílový text. Protože textový formát dat na schránce byl nastaven s funkcí a ne s řetězcem, schránka vyvolá funkci renderData() . Funkce renderData() vrátí text ve zdrojovém textu, který je následně přiřazen k cílovému textu. Všimněte si, že jestliže před stisknutím tlačítka Vložit text upravujete, úpravy se projeví ve vloženém textu, i když k nim dojde až po stisknutí tlačítka pro kopírování. Je to z toho důvodu, že funkce vykreslení nekopíruje zdrojový text, dokud nedojde ke stisknutí tlačítka. (Při použití odloženého vykreslení v reálné aplikaci možná budete chtít zdrojová data uložit nebo nějakým způsobem zabezpečit, abyste se tomuto problému vyhnuli.) package { import import import import import flash.desktop.Clipboard; flash.desktop.ClipboardFormats; flash.display.Sprite; flash.text.TextField; flash.events.MouseEvent; public class DeferredRenderingExample extends Sprite { var sourceTxt:TextField; var destinationTxt:TextField; public function DeferredRenderingExample():void { sourceTxt = createTextField(10, 10, 210, 380, false); addChild(sourceTxt); sourceTxt.text = "Neque porro quisquam est qui dolorem " + "ipsum quia dolor sit amet, consectetur, adipisci velit." destinationTxt = createTextField(330, 10, 210, 380, false); addChild(destinationTxt); var copyBtn:TextField = createTextField(230, 50, 90, 20, true); copyBtn.text = "Copy"; addChild(copyBtn); copyBtn.addEventListener(MouseEvent.CLICK, onCopy); var pasteBtn:TextField = createTextField(230, 80, 90, 20, true); pasteBtn.text = "Paste"; addChild(pasteBtn); pasteBtn.addEventListener(MouseEvent.CLICK, onPaste); } private function createTextField(x:Number, y:Number, width:Number, height:Number, isBtn:Boolean = false):TextField { var newTxt:TextField = new TextField(); newTxt.x = x; newTxt.y = y; newTxt.height = height; newTxt.width = width; newTxt.border = true; newTxt.background = true; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 147 Kopírování a vkládání if (isBtn) { newTxt.backgroundColor = 0xDDDDDDEE; newTxt.selectable = false; } else { newTxt.multiline = true; newTxt.wordWrap = true; newTxt.backgroundColor = 0xEEEEEEEE; } return newTxt; } public function onCopy(event:MouseEvent):void { Clipboard.generalClipboard.clear(); Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, renderData); } public function onPaste(event:MouseEvent):void { destinationTxt.text = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String; } public function renderData():String { trace("Rendering data"); var sourceStr:String = sourceTxt.text; if (sourceTxt.selectionEndIndex > sourceTxt.selectionBeginIndex) { // something is selected return sourceStr.substring(sourceTxt.selectionBeginIndex, sourceTxt.selectionEndIndex); } else { return sourceStr; } } } } 148 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 149 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 150 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: bytes.compress(CompressionAlgorithm.DEFLATE); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 151 Práce s bytovými poli 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; var bytes:ByteArray = new ByteArray(); var myLabel:Label = new Label(); myLabel.move(150, 150); myLabel.width = 200; addChild(myLabel); var myXML:XML = <order> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order> // 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!"; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 152 Práce s bytovými poli 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; 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(); } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 153 Práce s bytovými poli 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í: 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: • Import požadovaných tříd import flash.filesystem.*; import flash.utils.ByteArray; import flash.events.Event; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 154 Práce s bytovými poli • 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 // 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); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 155 Práce s bytovými poli 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) 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 156 Práce s bytovými poli // 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. 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(); } 157 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: Rychlý začátek (Připojení pro vývojáře Adobe AIR) Referenční příručka jazyka • SQLCollationType • SQLColumnNameStyle • SQLColumnSchema • SQLConnection • SQLError • SQLErrorEvent • SQLErrorOperation • SQLEvent • SQLIndexSchema • SQLMode • SQLResult • SQLSchema • SQLSchemaResult • SQLStatement • SQLTableSchema • SQLTransactionLockType • SQLTriggerSchema • SQLUpdateEvent • SQLViewSchema VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 158 Práce s lokálními databázemi SQL Č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í. (Nicméně upozorňujeme, že jakákoliv aplikace AIR by byla schopná otevřít soubor databáze, takže pro potenciálně citlivé dokumenty doporučujeme použít samostatný mechanismus kódování.) • 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 159 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žívá 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 160 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.SQLTriggerSchema 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 161 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 181. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 162 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 libovolnou příponou 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í aplikace s názvem „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.events.SQLErrorEvent; import flash.events.SQLEvent; 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 163 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 166. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 164 Práce s lokálními databázemi SQL 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; 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 161. 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 181. 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í). VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 165 Práce s lokálními databázemi SQL 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. 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.events.SQLErrorEvent; import flash.events.SQLEvent; 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 166 Práce s lokálními databázemi SQL 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ů: 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; VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 167 Práce s lokálními databázemi SQL Spuštění příkazu SQL Volání metody instance SQLStatementexecute(). // 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 169 „Vkládání dat“ na stránce 174 „Změna nebo mazání dat“ na stránce 177 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. Tím získáte 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 168 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 169 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 pro načtení dat z tabulky pojmenované „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é „produkty“, pomocí asynchronního režimu spuštění: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 170 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 „ID položky“, „Název položky“ a „cena“. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 171 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é zam stnanci. 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 „zaměstnanci“ již byla vytvořena a je vyplněna daty. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 172 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é zam stnanci. 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 „zaměstnanci“ již byla vytvořena a je vyplněna daty. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 173 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; 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 174 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. Při volání metody instance SQLStatement execute() určete hodnotu parametru prefetch. Načteno bude pouze tolik řá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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 175 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 „zaměstnanci“ 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.1 POMOCÍ PROGRAMU ADOBE 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.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; 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(); private 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 177 Práce s lokálními databázemi SQL insertStmt.text = "INSERT INTO ..."; insertStmt.addEventListener(SQLEvent.RESULT, resultHandler); 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 178 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 179 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 181. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 180 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 181 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 182 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 183 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 184 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 185 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 186 Práce s lokálními databázemi SQL 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 technik vestavěných do programu Adobe AIR vám umožňuje zlepšit výkon operací databáze ve vaší aplikaci. 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 pro vlastní 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 167. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 187 Práce s lokálními databázemi SQL 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. 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í.zam stnanci spíše než SELECT employeeId FROM zam stnanci. 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 173. 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 186. 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 164. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 188 Práce s lokálními databázemi SQL 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 164. 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 181, 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 173. 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 184. 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 186. 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 167. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 189 Práce s lokálními databázemi SQL 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ů. 190 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. 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á rozhraní DPAPI v operačním systému Windows a KeyChain v operačním systému Mac OS k přiřazení šifrovaného místního úložiště ke každé aplikaci a uživateli. Š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. 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 288. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 191 Ukládání šifrovaných dat 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. 192 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 58. 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 231 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 193 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.nativeWindow. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 194 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 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 202. 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 195 „Elementy HTML frame a iframe“ na stránce 202 „Objekt Window (Okno) jazyka JavaScript“ na stránce 200 „Objekt XMLHttpRequest“ na stránce 196 „Přidávání obsahu PDF“ na stránce 245 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 195 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 krytí 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 208. 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 26. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 196 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 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 skript 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 197 Prostředí HTML <iframe id="mashup" src="http://www.example.com/map.html" allowCrossDomainXHR="true" </iframe> 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" </iframe> 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" </iframe> 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 202 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 198 Prostředí HTML <html> <body> <canvas id="triangleCanvas" style="width:40px; height:40px;"></canvas> <script> var canvas = document.getElementById("triangleCanvas"); var context = canvas.getContext("2d"); context.lineWidth = 3; context.strokeStyle = "#457232"; context.beginPath(); context.moveTo(5,5); context.lineTo(35,5); context.lineTo(20,35); context.lineTo(5,5); context.lineTo(6,5); context.stroke(); </script> </body> </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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 199 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 137 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 123 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 200 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í 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 205. Události unload (odstranění z paměti) (pro objekty body a frameset) V tagu nejvyšší úrovně sady rámc nebo 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 ukon ení objektu NativeApplication (ke zjištění okamžiku ukončování aplikace). Také můžete použít událost zavírání 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 201 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 213. 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 221. 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 211. 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 33. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 202 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 267 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 202 „Element Canvas (Plátno) jazyka HTML“ na stránce 204 „Manipulační programy událostí elementů HTML“ na stránce 204 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 203 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 src="file:///templates/child.html" documentRoot="app:/sandbox/" sandboxRoot="app-storage:/templates/"/> Umístěte soubor child.html do vzdálené karantény a pomocí události dominitialize vytvořte most karantény: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 204 Prostředí HTML <html> <head> <script> var bridgeInterface = {}; bridgeInterface.testProperty = "Bridge engaged"; function engageBridge(){ document.getElementById("sandbox").parentSandboxBridge = bridgeInterface; } </script> </head> <body> <iframe id="sandbox" src="http://www.example.com/air/child.html" documentRoot="app:/" sandboxRoot="http://www.example.com/air/" ondominitialize="engageBridge()"/> </body> </html> 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: <html> <head> <script> document.write(window.parentSandboxBridge.testProperty); </script> </head> <body></body> </html> 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 221 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. <canvas id="drawingAtrium" style="width:300px; height:300px;"></canvas> Další informace naleznete v části „Objekt Canvas (Plátno)“ na stránce 197. 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: 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 205 Prostředí HTML Název atributu zpětného vyvolání Popis 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: <html> <head/> <body contentEditable="true"> <h1>de Finibus Bonorum et Malorum</h1> <p contentEditable="false">Sed ut perspiciatis unde omnis iste natus error.</p> <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis.</p> </body> </html> 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 200. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 206 Prostředí HTML 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, normální Určuje pravidlo zalomení řádku pro čínský, japonský a korejský text (CJK). -webkit-margin-bottom-collapse sbalit, zrušit, oddělit Určuje způsob sbalení spodního okraje tabulky. -webkit-margin-collapse sbalit, zrušit, oddělit 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 sbalit, zrušit, oddělit Určuje způsob sbalení horního okraje buňky v tabulce. -webkit-nbsp-mode normální, mezera 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 logická, vizuální 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 kruh, kotouč, žádný, čtverec Určuje náhradní tvar, který se použije v poli pro zadání hesla. -webkit-user-drag • automaticky – Výchozí chování Potlačí chování při automatickém přetažení. • element – Celý element je přetažen • žádný – Element nelze přetáhnout -webkit-user-modify pouze čtení, čtení a zápis, pouze čtení a zápis prostého textu Určuje, zda může být obsah elementu upravován. -webkit-user-select • automaticky – Výchozí chování Určuje, zda může uživatel vybrat obsah elementu. • žádný – 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/). 207 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čte URL do objektu HTMLLoader a nastaví objekt jako podřízený objektu Sprite: var container:Sprite; var html:HTMLLoader = new HTMLLoader; html.width = 400; html.height = 600; var urlReq:URLRequest = new URLRequest("http://www.adobe.com/"); html.load(urlReq); container.addChild(html); 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 225. 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 = "<html><body>Hello <b>world</b>.</body></html>"; html.loadString(htmlStr); Obsah načtený pomocí metody loadString() se vloží do karantény zabezpečení aplikace a tím jí zajistí plný přístup k rozhraní API aplikace AIR. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 208 Programování v jazycích HTML a JavaScript 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 26). 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 221. 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 208. Další informace naleznete v sekci „Zabezpečení HTML“ na stránce 29. 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 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 209 Programování v jazycích HTML a JavaScript 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 222. 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 222. 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(). 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 210 Programování v jazycích HTML a JavaScript 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: function getter(str) { var obj = window; var names = str.split('.'); for(var i=0;i<names.length;i++){ if(typeof obj[names[i]]=='undefined'){ var undefstring = names[0]; for(var j=1;j<=i;j++) undefstring+="."+names[j]; throw new Error(undefstring+" is undefined"); } obj = obj[names[i]]; } return obj; } Vytvořte instanci pomocí následujícího kódu: try{ var Parser = getter(constructorClassName); var a = new Parser(); }catch(e){ alert(e); } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 211 Programování v jazycích HTML a JavaScript 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: <a href="javascript:code()">Click Me</a> následujícím kódem: <a href="#" onclick="code()">Click Me</a> 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: <div id="container"></div> Nahraďte příkazy jako je tento: document.getElementById('container').innerHTML = '<a href="#" onclick="code()">Click Me.</a>'; následujícím kódem: document.getElementById('container').innerHTML = '<a href="#" id="smith">Click Me.</a>'; document.getElementById('smith').addEventListener("click", function() { code(); }); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 212 Programování v jazycích HTML a JavaScript 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 222. 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 213 Programování v jazycích HTML a JavaScript 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. Poznámka: Další informace naleznete v sekcích Třídy, balíčky a jmenné prostory jazyka ActionScript 3.0 a Základy jazyka ActionScript pro vývojáře jazyka JavaScript. 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 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"></script> Podle potřeby upravte cestu v odkazu src. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 214 Programování v jazycích HTML a JavaScript 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 272. Ř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/"); Informace o objektech URLRequest naleznete v sekci „Požadavky URL a práce v síti“ na stránce 271. 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 215 Programování v jazycích HTML a JavaScript 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: <html> <script> function alertFoo() { alert(foo); } </script> <body> <button onClick="alertFoo()"> What is foo? </button> <p><button onClick="helloFromJS('Hi.')"> Call helloFromJS() function. </button></p> </body> </html> 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 216 Programování v jazycích HTML a JavaScript 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 229. 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: <html> <script> foo = 333; function test() { return "OK."; } </script> <body> <p id="p1">Hi.</p> </body> </html> 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 217 Programování v jazycích HTML a JavaScript var html:HTMLLoader = new HTMLLoader(); html.width = 300; html.height = 300; html.addEventListener(Event.COMPLETE, completeHandler); var xhtml:XML = <html> <script> foo = 333; function test() { return "OK."; } </script> <body> <p id="p1">Hi.</p> </body> </html>; 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.) <object type="application/x-shockwave-flash" width="100%" height="100%"> <param name="movie" value="app:/SWFFile.swf"></param> </object> 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 218 Programování v jazycích HTML a JavaScript <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; } </script> 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"></script> Důležité: Atribut type musí být type="application/x-shockwave-flash", aby byla knihovna správně načtena. 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. 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 219 Programování v jazycích HTML a JavaScript <html> <script src="ASLibrary.swf" type="application/x-shockwave-flash"></script> <script> num = 254; function getStatus() { return "OK."; } function runASFunction(window){ var obj = new runtime.ASClass(); obj.accessDOM(window); } </script> <body onload="runASFunction"> <p id="p1">Body text.</p> </body> </html> 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; 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 220 Programování v jazycích HTML a JavaScript 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: <html> <style> .style1A { font-family:Arial; font-size:12px } .style1B { font-family:Arial; font-size:24px } </style> <style> .style2 { font-family:Arial; font-size:12px } </style> <body> <p class="style1A"> Style 1A </p> <p class="style1B"> Style 1B </p> <p class="style2"> Style 2 </p> </body> </html> 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: 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"; } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 221 Programování v jazycích HTML a JavaScript 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. 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 202, „Zabezpečení HTML“ na stránce 29 a „Objekt XMLHttpRequest“ na stránce 196. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 222 Programování v jazycích HTML a JavaScript 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/"> </iframe> 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"></script> 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"></script> 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. 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 223 Programování v jazycích HTML a JavaScript 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); 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 224 Programování v jazycích HTML a JavaScript <html> <head> <script> var bridgeInterface = {}; bridgeInterface.testProperty = "Bridge engaged"; function engageBridge(){ document.getElementById("sandbox").contentWindow.parentSandboxBridge = bridgeInterface; } </script> </head> <body> <iframe id="sandbox" src="http://www.example.com/air/child.html" documentRoot="app:/" sandboxRoot="http://www.example.com/air/" ondominitialize="engageBridge()"/> </body> </html> 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: <html> <head> <script> document.write(window.parentSandboxBridge.testProperty); </script> </head> <body></body> </html> 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 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. 225 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 ActionScript™: 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 225. 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: <html> <body> <a href="#" id="testLink">Click me.</a> </html> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 226 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: <html> <head> <script> function throwError() { var x = 400 * melbaToast; } </script> </head> <body> <a href="#" onclick="throwError()">Click me.</a> </html> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 227 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: <html> <head> <script language="javascript" type="text/javascript" src="AIRAliases.js"></script> <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); </script> </head> <body> <a href="#" onclick="throwError()">Click me.</a> </html> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 228 Zpracování událostí týkajících se HTML exceptionValue: ReferenceError: Can't find variable: melbaToast sourceURL: app:/test.html line: 5 function: throwError sourceURL: app:/test.html line: 10 function: onclick 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 229 Zpracování událostí týkajících se HTML <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(); } </script> <body onload="init()" /> <table> <tr> <td>Window X:</td> <td><textarea id="xText"></textarea></td> </tr> <tr> <td>Window Y:</td> <td><textarea id="yText"></textarea></td> </tr> </table> </body> </html> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 230 Zpracování událostí týkajících se HTML window.onunload = cleanup; window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException); function cleanup() { window.htmlLoader.removeEventListener('uncaughtScriptException', uncaughtScriptExceptionHandler); } 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. 231 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í 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 232 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. Více informací o načítaní tohoto typu médií v objektu HTMLLoader naleznete v tématech Načítání obsahu SWF na stránce HTML a „Přidávání obsahu PDF“ na stránce 245. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 233 Skriptování kontejneru HTML Vlastnost Omezení alfa Může snížit čitelnost obsahu HTML filtry V okně HTML jsou vnější efekty oříznuty okrajem okna. grafika 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á. nato ení 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 234 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 243). 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“. historyAt() 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 235 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 236 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 237 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 <title> stránky HTML) pro změnu titulu okna. package { import import import import import import import import import import flash.display.StageScaleMode; flash.display.NativeWindow; flash.display.NativeWindowInitOptions; flash.events.Event; flash.events.NativeWindowBoundsEvent; flash.geom.Rectangle; flash.html.HTMLLoader; flash.html.HTMLHost; flash.html.HTMLWindowCreateOptions; flash.text.TextField; 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 238 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 239 Skriptování kontejneru HTML package { import import import import flash.display.Sprite; flash.html.HTMLLoader; flash.net.URLRequest; flash.text.TextField; public class CustomHostExample extends Sprite { function CustomHostExample():void { var html:HTMLLoader = new HTMLLoader(); html.width = 550; html.height = 380; var host:CustomHost = new CustomHost(); html.htmlHost = host; var urlReq:URLRequest = new URLRequest("Test.html"); html.load(urlReq); addChild(html); var statusTxt:TextField = new TextField(); statusTxt.y = 380; statusTxt.height = 20; statusTxt.width = 550; statusTxt.background = true; statusTxt.backgroundColor = 0xEEEEEEEE; addChild(statusTxt); host.statusField = statusTxt; } } } Pro testování zde popsaného kódu zahrňte soubor HTML s následujícím obsahem do adresáře aplikace: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 240 Skriptování kontejneru HTML <html> <head> <title>Test</title> <script> function openWindow() { document.title = "Test" window.open('Test.html'); } </script> </head> <body bgColor="#EEEEEE"> <a href="#" onclick="window.open('Test.html')">window.open('Test.html')</a> <br/><a href="#" onclick="window.document.location='http://www.adobe.com'"> window.document.location = 'http://www.adobe.com'</a> <br/><a href="#" onclick="window.moveBy(6, 12)">moveBy(6, 12)</a> <br/><a href="#" onclick="window.close()">window.close()</a> <br/><a href="#" onclick="window.blur()">window.blur()</a> <br/><a href="#" onclick="window.focus()">window.focus()</a> <br/><a href="#" onclick="window.status = new Date().toString()">window.status=new Date().toString()</a> </body> </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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 241 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 242 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 243 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 244 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 236. 245 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. HTMLPDFCapability.ERROR_INSTALLED_READER_NOT_FOUND 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 HTMLControl nemůže zobrazit obsah PDF. HTMLPDFCapability.ERROR_PREFERRED_READER_TOO_OLD Byla zjištěna dostatečná verze (8.1 nebo pozdější) aplikace Adobe Reader, ale verze aplikace Adobe Reader nastavená na zpracování obsahu PDF je starší než Reader 8.1. Objekt HTMLControl nemůže zobrazit obsah PDF. Poznámka: 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. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 246 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 272. 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: <object id="PDFObj" data="test.pdf" type="application/pdf" width="100%" height="100%"/> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 247 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 („Ahoj od HTML") do kódu JavaScript na úrovni dokumentu v souboru PDF: <html> <head> <title>PDF Test</title> <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 ); } } </script> </head> <body onload='init()'> <object id="PDFObj" data="test.pdf" type="application/pdf" width="100%" height="100%"/> </body> </html> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 248 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 207. 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). • Vizuální vlastnosti objektu HTMLLoader, který obsahuje soubor PDF, nelze změnit. Změna vlastností filters, alpha, rotation nebo scaling objektu HTMLLoader vykreslí soubor PDF jako neviditelný, dokud nejsou tyto vlastnosti znovu nastaveny. To platí i v případě, změníte-li tyto vlastnosti kontejnerů objektu zobrazení, který obsahuje objekt HTMLLoader. • Vlastnost scaleMode objektu Stage objektu NativeWindow obsahujícího obsah PDF musí být nastavena na StageScaleMode.NO_SCALE. • 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). • PDF komentující pracovní postupy nefunguje v aplikaci AIR 1.0. 249 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 • DRMAuthenticateEvent • DRMErrorEvent • DRMStatusEvent VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 250 Použití správy digitálních práv • 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 vygeneruje objekt události 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. 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 se odešle nová událost DRMAuthenticateEvent a aplikace se vrátí k 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 251 Použití správy digitálních práv 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 oprávněn k prohlížení obsahu, odešle se objekt události 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. Každá chyba týkající se DRM vede k tomu, že aplikace odešle objekt události DRMErrorEvent. Aplikace AIR zpracuje neúspěšnou autorizaci DRM opětným spuštěním objektu události DRMAuthenticationEvent. Všechny ostatní události chyb musí aplikace zpracovat explicitně. 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. Změny ve třídě 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. Jako součást aplikace AIR třída NetStream zahrnuje čtyři nové události týkající se 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í. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 252 Použití správy digitálních práv Událost Popis 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) pro aktuální obsah. 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 odstraní povolení pro objekt NetStream: NetStream.resetDRMVouchers(); air.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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 253 Použití správy digitálních práv 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"); } var connection:NetConnection = new air.NetConnection(); connection.connect(null); var videoStream= new air.NetStream(); videoStream.addEventListener(air.DRMAuthenticateEvent.DRM_AUTHENTICATE, drmAuthenticateEventHandler) function drmAuthenticateEventHandler(event) { 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 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 254 Použití správy digitálních práv Vlastnost Popis 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. 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. private function drmStatusEventHandler(event:DRMStatusEvent):void { trace(event.toString()); } function drmStatusEventHandler(event:DRMStatusEvent):void { trace(event.toString()); } 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: 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 255 Použití správy digitálních práv Vlastnost Popis 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"); } var connection:NetConnection = new air.NetConnection(); connection.connect(null); var videoStream= new air.NetStream(); videoStream.addEventListener(air.DRMAuthenticateEvent.DRM_AUTHENTICATE, drmAuthenticateEventHandler) function drmAuthenticateEventHandler(event) { 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í. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 256 Použití správy digitálních práv 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. 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 Třída DRMErrorEvent zahrnuje následující vlastnost: subErrorID Udává ID drobné chyby s dalšími informacemi o problému, který ji způsobil. 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 0 Ověření uživatele se nezdařilo. 1002 0 Flash Media Rights Management Server (FMRMS) nepodporuje protokol SSL (Secure Sockets Layer). 1003 0 Platnost obsahu uplynula a obsah již není možné prohlížet. 1004 0 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 0 1006 0 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 0 Obecná interní chyba 1008 Podrobný kód chyby dešifrování Nesprávný licenční klíč. 1009 0 Obsah FLV je poškozený. 1010 0 1011 0 Server URL publisherID:applicationID Popis Nelze se připojit k serveru. ID zobrazovací aplikace neodpovídá platnému ID podporovanému vydavatelem obsahu. Verze aplikace neodpovídá verzi specifikované pravidly. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 257 Použití správy digitálních práv Kód závažné chyby Kód drobné chyby Podrobnosti chyby 1012 0 Ověření povolení přiřazeného k zašifrovanému obsahu se nezdařilo; existuje možnost, že obsah je poškozen. 1013 0 Povolení přiřazené k zašifrovanému obsahu nebylo možné uložit. 1014 0 Ověření integrity záhlaví souboru FLV se nezdařilo; existuje možnost, že obsah je poškozen. Kód závažné chyby ID drobné chyby 3300 Kód chyby serveru Adobe Policy Server Aplikace zjistila neplatné povolení přiřazené k obsahu. 3301 0 Ověření uživatele se nezdařilo. 3302 0 Protokol SSL (Secure Sockets Layer) není serverem správy oprávnění Flash Media Rights Management Server (FMRMS) podporován. 3303 0 Platnost obsahu uplynula a obsah již není možné prohlížet. 3304 0 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 0 3306 0 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 0 Obecná interní porucha správy digitálních práv. 3308 Podrobný kód chyby dešifrování Nesprávný licenční klíč. 3309 0 Obsah videa Flash je poškozený. 3310 0 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 0 min=x:max=y Verze aplikace neodpovídá údajům obsaženým v povolení. 3312 0 Podrobnosti chyby Server URL Popis Popis Nelze se připojit k serveru. Ověření povolení přiřazeného k zašifrovanému obsahu se nezdařilo; existuje možnost, že obsah je poškozen. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 258 Použití správy digitálních práv Kód závažné chyby ID drobné chyby Podrobnosti chyby 3313 0 Povolení přiřazené k zašifrovanému obsahu nebylo možné uložit do aplikace Microsafe. 3314 0 Ověření integrity záhlaví souboru FLV se nezdařilo; existuje možnost, že obsah je poškozen. 3315 Popis Vzdálené přehrávání obsahu chráněného DRM není povoleno. 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()); } function drmErrorEventHandler(event) { air.trace(event.toString()); } 259 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</customUpdateUI> 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 <allowBrowserInvocation>true</allowBrowserInvocation>, aby vyvolání prohlížeče bylo úspěšné.) Viz sekce „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 283. 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 283. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 260 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. 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: if((invokeEvent.currentDirectory != null)&&(invokeEvent.arguments.length > 0)){ dir = invokeEvent.currentDirectory; fileToOpen = dir.resolvePath(invokeEvent.arguments[0]); } VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 261 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, 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 flash.display.Sprite; flash.events.InvokeEvent; flash.desktop.NativeApplication; flash.text.TextField; 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 262 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: <allowBrowserInvocation>true</allowBrowserInvocation> Další informace o souboru deskriptoru aplikace naleznete v části „Nastavení vlastností aplikace AIR“ na stránce 42 . 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 263 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 283. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 264 Možnosti spuštění a ukončení aplikací Ukončení aplikace Nejrychlejší způsob ukončení aplikace je vyvolat metodu NativeApplication.nativeApplication.exit(), což funguje dobře, když aplikace nemusí ukládat žádná data ani čistit žádné 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í u systému Mac OS; systém Windows neposkytuje 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 265 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 42 „Představení vlastního uživatelského rozhraní pro aktualizaci aplikace“ na stránce 292 266 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 42. 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 <id> 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 286. 267 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 49. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 268 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. 269 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 jazyce ActionScript, 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 270 Sledování připojení k síti 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: 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); } 271 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 schopností jazyka ActionScript™ 3.0 viz příručku Programování v jazyku ActionScript 3.0, dodávanou s programy Adobe® Flash® CS3 a Adobe® Flex™ Builder™ 3. 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 272. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 272 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 207. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 273 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: • V systému Mac OS – V: /Users/jméno uživatele/Library/Preferences/Id aplikace.publisherID/Local Store/ Například: /Users/babbage/Library/Preferences/com.example.TestApp.02D88EEED35F84C264A183921344EEA353 A629FD.1/Local Store • V systému Windows – V adresáři Dokumenty a nastavení, v: jméno uživatele/Application Data/Id aplikace.publisherID/Local Store/ Například: C:\Documents and Settings\babbage\Application Data\com.example.TestApp.02D88EEED35F84C264A183921344EEA353A629FD.1\Local 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 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 274 Požadavky URL a práce v síti 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 274. 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); 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: • 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 275 Požadavky URL a práce v síti • 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. 276 Kapitola 31: 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 dále digitální certifikát vydán důvěryhodnou certifikační autoritou, například Verisign nebo Thawte, 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 307. 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 OS Windows potřebuje uživatel oprávnění správce. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 277 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 291. 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 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 278. 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 282. • 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 282. • Může zkontrolovat, zda je runtime nainstalováno. Viz „Kontrola, zda je runtime nainstalováno“ na stránce 281. • 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 283. 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. 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 nainstalovanou aktualizaci 3 přehrávače Adobe® Flash® Player 9. 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). VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 278 Distribuce, Instalace a Spuštění aplikací AIR 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áno. 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 279. 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 Navigujte na stránku HTML ve webovém prohlížeči, který má nainstalovaný přehrávač Flash Player (verze 9 aktualizace 3 nebo novější). 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 279 Distribuce, Instalace a Spuštění aplikací AIR 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). 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 src sady SDK: Zdrojové soubory Popis badge.fla Zdrojový soubor Flash CS3 nebo CS4 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 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 280 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 = "<p align='center'><font color='#" + _messageColor + "'>In order to run " + _appName + ", this installer will also set up Adobe® AIR™.</font></p>"; } else { root.statusMessage.htmlText = "<p align='center'><font color='#" + _messageColor + "'>In order to run this application, " + "this installer will also set up Adobe® AIR™.</font></p>"; } break; case "unavailable" : root.statusMessage.htmlText = "<p align='center'><font color='#" + _messageColor + "'>Adobe® AIR™ is not available for your system.</font></p>"; 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 281. 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 282. • 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 42.) 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 283. 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. 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 282. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 281 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 281 • „Kontrola z webové stránky, zda je aplikace AIR nainstalována.“ na stránce 282 • „Instalace aplikace AIR z prohlížeče“ na stránce 282 • „Spuštění nainstalované aplikace AIR z prohlížeče“ na stránce 283 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 278. 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 281. 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, ale aktuálně nainstalováno není. "unavailable" Runtime nemůže být na tomto počítači nainstalováno. "installed" Runtime je na tomto počítači nainstalováno. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 282 Distribuce, Instalace a Spuštění aplikací AIR Metoda getStatus() vygeneruje chybu, jestliže požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3) není v prohlížeči nainstalovaná. 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 281. 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 „Definice základních informací aplikace“ na stránce 43. pubID ID vydavatele pro danou aplikaci. Podrobnosti naleznete v tématu „O identifikátorech vydavatele AIR“ na stránce 286. 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() vygeneruje chybu, jestliže požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3) není v prohlížeči nainstalovaná. 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 281. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 283 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. 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 42.) 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 283. 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() vygeneruje chybu, jestliže požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3) není v prohlížeči nainstalovaná. 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 282. 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. 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í: <allowBrowserInvocation>true</allowBrowserInvocation> Více informací o souboru deskriptoru aplikace naleznete v tématu„Nastavení vlastností aplikace AIR“ na stránce 42. 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 281. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 284 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 „Definice základních informací aplikace“ na stránce 43. 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 286. 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. Metoda launchApplication() 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 launchApplication() vygeneruje chybu, jestliže požadovaná verze přehrávače Flash Player (verze 9 aktualizace 3) není v prohlížeči nainstalovaná. 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 282. 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 262. 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 262. 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. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 285 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 dvě z největších certifikačních autorit naleznete na níže uvedených odkazech: Verisign CPS (http://www.verisign.com/repository/CPS/) Ujednání odběratele autority Verisign (https://www.verisign.com/repository/subscriber/SUBAGR.html) 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) 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. 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í použít jeden z mechanismů poskytnutých operačním systémem nebo příslušný nástroj pro import certifikátu do příslušného umístění v systémovém úložišti certifikátu. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 286 Distribuce, Instalace a Spuštění aplikací AIR 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). 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 třídy 3 poskytující vysoké zajištění nebo můžete obdržet nový certifikát. Lze použít například libovolný z následujících typů certifikátu od autorit Verisign nebo Thawte: • Verisign: • Microsoft Authenticode Digital ID • Sun Java Signing Digital ID • Thawte: • AIR Developer Certificate • Apple Developer Certificate • JavaSoft Developer Certificate • Microsoft Authenticode Certificate Poznámka: Certifikát musí být označen pro podpis kódu. Obvykle nemůžete použít certifikát SSL k podepsání souborů AIR. Č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ÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 287 Distribuce, Instalace a Spuštění aplikací AIR 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. Pro získání a export například certifikátu Microsoft Authenticode vyžadují autority Verisign nebo Thawte použití aplikace Microsoft Internet Explorer. Certifikát lze poté exportovat jako soubor .pfx přímo z uživatelského rozhraní Internet Explorer. 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 307. 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. 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. Příklad: Získání certifikátu vývojáře AIR od autority Thawte 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. 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: Poznámka: Dodatečné informace o typu vyžadované dokumentace lze nalézt zde: https://www.thawte.com/ssl-digital-certificates/free-guides-whitepapers/pdf/enroll_codesign_cz.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 OS Windows: otevřete Nástroje -> Možnosti -> Rozšířené -> Certifikáty -> Správa certifikátů c V OS Mac: otevřete Firefox -> Preference -> Rozšířené -> Vaše certifikáty -> Zobrazit certifikáty d Ze seznamu certifikátů vyberte Adobe AIR Code Signing Certificate a klepněte na tlačítko Záloha. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 288 Distribuce, Instalace a Spuštění aplikací AIR e Zadejte název souboru a umístění, kam chcete soubor úložiště klíčů exportovat. Poté klepněte na možnost Uložit. f 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.) g 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. h 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. 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 313. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 289 Distribuce, Instalace a Spuštění aplikací AIR • 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 286. 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 290 Distribuce, Instalace a Spuštění aplikací AIR Pojem Popis Ú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. Infrastruktura veřejného klíče (Public Key Infrastructure - PKI) 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. 291 Kapitola 32: Aktualizace aplikací AIR Uživatelé mohou instalovat nebo aktualizovat aplikaci AIR poklepáním na soubor AIR na svém počítači nebo z prohlížeče (pomocí funkce hladké instalace) a o správu instalace se postará 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 276.) 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 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). Pomocí migrace certifikátu můžete změnit certifikát s vlastním podpisem na komerční podpisový certifikát kódu nebo z jednoho certifikátu s vlastním podpisem nebo komerčního certifikátu na jiný. Jestliže neprovedete migraci certifikátu, stávající uživatelé budou muset před instalací nové verze vaší aplikace nejprve odinstalovat aktuální verzi. Další informace viz „Změna certifikátů“ na stránce 288. 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); Před použitím třídy Updater 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 293. Výsledky volání metody 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 42.) 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 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ému Windows musí mít uživatel práva správce. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 292 Aktualizace aplikací AIR 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“. Formát tohoto řetězce je ponechán na rozhodnutí vývojáře aplikace. Chod programu neověřuje platnost řetězce verze, to by měl provést kód aplikace před aktualizací 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 42 . Představení vlastního uživatelského rozhraní pro aktualizaci aplikace AIR zahrnuje výchozí rozhraní pro aktualizaci: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 293 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. Uděláte to tak, že určíte element customUpdateUI v souboru deskriptoru aplikace pro aktuálně instalovanou aplikaci: <customUpdateUI>true</customUpdateUI> 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 48. Aplikace může rozhodnout, když je vyvolána (když objekt NativeApplication.nativeApplication odešle událost invoke), 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, uživatel nebo aplikace musí nejprve uložit soubor AIR místně na počítač uživatele. Například následující kód přečte soubor AIR z URL (http://example.com/air/updates/Sample_App_v2.air) a uloží soubor AIR 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 112. 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 zobrazit zprávu. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 294 Aktualizace aplikací AIR 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í). 295 Kapitola 33: 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 296. 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): <name> <text xml:lang="en">Sample 1.0</text> <text xml:lang="fr">Échantillon 1.0</text> <text xml:lang="de">Stichprobe 1.0</text> </name> 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 296 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 43. 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 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"></script> VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 297 Lokalizace aplikací AIR Následující skript JavaScript může volat objekt air.Localizer.localizer: <script> var localizer = air.Localizer.localizer; </script> 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 302. getLocaleChain() Vrací jazyky v řetězci lokální verze. Viz „Definování řetězce locale“ na stránce 301. getString() Získává řetězec definovaný pro zdroj. Viz „Získání zdrojů pro specifickou lokální verzi“ na stránce 302. setBundlesDirectory( ) Nastavuje umístění adresáře svazků. Viz „Uzpůsobení nastavení lokalizátoru AIR HTML“ na stránce 300. 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 300 setLocaleChain() Nastavuje pořadí jazyků v řetězci lokální verze. Viz „Definování řetězce locale“ na stránce 301. 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 301. 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 298. Informace o metodě update() naleznete v kapitole „Aktualizace prvků DOM pro použití ve stávající lokální verzi“ na stránce 299. 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 301. 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 300.) 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í.) 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 302. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 298 Lokalizace aplikací AIR 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=Programme d'échantillon greeting=Bonjour en français. exitMessage=Merci pour l'usage du programme. 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 297). 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 „en“, „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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 299 Lokalizace aplikací AIR Řetězec locale můžete přizpůsobit zavoláním metody setLocaleChain() objektu Localizer. Viz „Definování řetězce locale“ na stránce 301. 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): <title local_innerHTML="default.mainWindowTitle"/> 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í: <p local_innerHTML="default.greeting" /> 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í: <input type="button" local_value="default.btnBlue" /> 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: <input type="text" value="Blue" local_value="default.btnBlue"/> 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 299. 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 300. 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: air.Localizer.localizer.update(); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 300 Lokalizace aplikací AIR 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: <div id="colorsDiv"> <h1 local_innerHTML="default.lblColors" ></h1> <p><input type="button" local_value="default.btnBlue" /></p> <p><input type="button" local_value="default.btnRed" /></p> <p><input type="button" local_value="default.btnGreen" /></p> </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); } 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ÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 301 Lokalizace aplikací AIR 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 99. 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: <p local_innerHTML="default.greeting" /> 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 299. 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 298.) Ř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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 302 Lokalizace aplikací AIR 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. 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 „Ahoj, {0}. Máte {1} novou zprávu.". V tomto případě funkce vrací hodnotu „Ahoj, Raúl. Máte 4 nové zprávy.". 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")); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 303 Lokalizace aplikací AIR 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 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: <html> <body>Hello, {0}. You have {1} new messages.</body> </html> V tomto případě funkce vrací řetězec se dvěma řádky: <html> <body>Hello, Raúl. You have 4 new messages. </body> </html> 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); VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 304 Lokalizace aplikací AIR 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. air.Localizer.localizer.addEventListener(air.Localizer.FILE_NOT_FOUND, fnfHandler); air.Localizer.localizer.getFile("missing.html", null, "fr"); function fnfHandler(event) { alert(event.fileName + ": " + event.locale); } 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(); } } 305 Kapitola 34: 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 pro složité úkoly ladění nástroj Flash Debugger (nebo aplikaci Flash CS4 nebo CS3). 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 OS Windows určete adresář obsahující adresář 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 stále tisknou do okna konzoly. Vypnutím 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 42. 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.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 306 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 Připojení k programu Flash Debugger (FDB) Pro ladění aplikace AIR vycházející ze SWF pomocí programu Flash Debugger spusťte relaci FDB a poté spusťte verzi ladění vaší aplikace. Verze ladění souboru SWF se automaticky připojí k poslouchající relaci FDB. 1 Spusťte FDB. Program FDB naleznete v adresáři bin své složky Flex SDK. Konzola zobrazí výzvu FDB: <fdb> 2 Spusťte příkaz Run: <fdb>run [Enter] 3 V odlišném příkazu nebo konzole skořepiny spusťte verzi ladění své aplikace: adl myApp-debug.xml 4 Pomocí příkazů programu FDB nastavte dle potřeby body rozdělení. 5 Zadejte: continue [Enter] kódy ukončení a chyb 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ě. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 307 Vytváření aplikace AIR pomocí nástrojů příkazového řádku Kódy ukončení Popis 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 <content> 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. Pokud používáte aplikaci Flash CS4, vyberte položky Soubor > Nastavení AIR. Další informace viz část Publikování pro prostředí Adobe AIR v dokumentu Používání programu Flash.) 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, například VeriSign nebo Thawte, 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. 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í. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 308 Vytváření aplikace AIR pomocí nástrojů příkazového řádku 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 42. 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_OPTIONSair_fileapp_xml [file_or_dir | -C dirfile_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 310. 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ář. 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 <content> souboru deskriptoru aplikace musí určit finální umístění hlavního souboru aplikace ve stromové struktuře adresáře balíku aplikace. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 309 Vytváření aplikace AIR pomocí nástrojů příkazového řádku 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: /devRoot /myApp /release /bin myApp.xml myApp.swf /artwork /myApp /images image-1.png ... image-n.png /libraries /release /libs lib-1.swf ... lib-n.swf AIRAliases.js Spuštění následujícího příkazu ADT z adresáře /devRoot/myApp: adt –package -storetype pkcs12 -keystore cert.p12 myApp.air release/bin/myApp.xml –C release/bin myApp.swf –C ../artwork/myApp images –C ../libraries/release libs Má za následek následující strukturu balíku: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 310 Vytváření aplikace AIR pomocí nástrojů příkazového řádku /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 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. 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 311 Vytváření aplikace AIR pomocí nástrojů příkazového řádku 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 312 Vytváření aplikace AIR pomocí nástrojů příkazového řádku 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í se specifickým úložištěm klíčů Java: -alias AIRcert -storetype jks -keystore certStore.keystore 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 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 Podepsání bez vložení časové známky: -storetype pkcs12 -keystore cert.p12 -tsa none 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 312.) Podpis souboru AIRI ❖ Použijte příkaz ADT -sign s následující syntaxí: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 313 Vytváření aplikace AIR pomocí nástrojů příkazového řádku 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 310. 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 285. 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 • 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 286. 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_OPTIONSair_file_inair_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 310. air_file_in Soubor AIR pro aktualizaci podepsaný novým certifikátem. air_file_out Soubor AIR, který má být vytvořen. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 314 Vytváření aplikace AIR pomocí nástrojů příkazového řádku 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 285. 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. 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 Adobe důrazně doporučuje používat pro podepisování veřejně dostupných aplikací AIR komerční certifikáty od známé certifikační autority, například VeriSign nebo Thawte. 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_typepfx_filepassword -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 countryKód země ISO-3166 obsahující dvě písmena. Certifikát není vygenerován, je-li zadán neplatný kód. (Volitelné.) key_typeTyp 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: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 315 Vytváření aplikace AIR pomocí nástrojů příkazového řádku -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. 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 name="APP_NAME" value="ExampleApplication"/> name="APP_ROOT" value="."/> name="APP_DESCRIPTOR" value="${APP_ROOT}/${APP_NAME}-app.xml"/> name="AIR_NAME" value="${APP_NAME}.air"/> name="STORETYPE" value="pkcs12"/> name="KEYSTORE" value="ExampleCert.p12"/> Iniciace programu ADL pro testování aplikace Pro spuštění aplikace pomocí programu ADL použijte úlohu exec: <target name="test" depends="compile"> <target name="test"> <exec executable="${ADL}"> <arg value="${APP_DESCRIPTOR}"/> </exec> </target> Iniciace programu ADT k zabalení aplikace K zabalení aplikace použijte úlohu jazyka Java pro spuštění nástroje adt.jar: VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 316 Vytváření aplikace AIR pomocí nástrojů příkazového řádku <target name="package"> <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"/> </java> </target> 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. 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. VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 317 Vytváření aplikace AIR pomocí nástrojů příkazového řádku <project> <!-- SDK properties --> <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"/> <!-- Project properties --> <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"/> <target name="init" depends="clean"> <mkdir dir="${release}"/> </target> <target name="test"> <exec executable="${ADL}"> <arg value="${APP_DESCRIPTOR}"/> <arg value="${APP_ROOT_DIR}"/> </exec> </target> <target name="package" depends="init"> <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="${release}/${AIR_NAME}"/> <arg value="${APP_DESCRIPTOR}"/> <arg value="-C"/> <arg value="${APP_ROOT_DIR}"/> <arg value="${APP_ROOT_FILE}"/> <arg value="-C"/> <arg value="${assets}"/> <arg value="icons"/> </java> </target> <target name="clean" description="clean up"> <delete dir="${release}"/> </target> </project> 318 Rejstřík Symboly ? znak (otazník), v nepojmenovaných parametrech SQL 168 Čísla 1024-RSA 314 128bitové šifrování AES-CBC 190 2048-RSA 314 AIR Developer Tool (ADT) možnosti podpisu 310 argumenty příkazového řádku, zachycení 260 soubory AIRI 312 asociace typu souboru 267 vytvoření certifikátů s vlastním podpisem 314 asociace typů souborů 49, 260 Ajax podpora v karanténě zabezpečení aplikace 32 zabezpečení 32 Á AC_RuntimeActiveContent.js 278 aktivace oken 61, 67 Acrobat 194, 245 aktivita uživatele, zjišťování 268 Action Message Format (AMF) 125 aktivní okno 66 ActionScript aktivované položky nabídky 82 aktivita (uživatele), zjišťování 268 asynchronní programování databáze 161, 164, 181 systém souborů 98 XMLHttpRequests 212 atribut allowCrossDomainXHR (elementy frame a iframe) 196, 202 atribut documentRoot (elementy frame a iframe) 194, 202, 222 atribut documentRoot (prvky frame a iframe) 30 objekty zobrazení 65 aktualizace aplikací AIR 48, 291 atribut minimumPatchLevel (soubor deskriptoru aplikace) 43 vytváření křížových skriptů JavaScript 214 AMF (Action Message Format) 148, 151 atribut ondominitialize 203 aplikace atribut s upravitelným obsahem (HTML) 133 Adobe Acrobat Developer Center 246 Adobe AIR Viz aplikace AIR Aplikace AIR aktualizace 23 aktualizace 23, 48 instalace 1, 23 asociace typu souboru 267 nové funkce 50 asociace typů souborů 49 odinstalace 2 cesta instalace 44 úvod 7 ikony 48 atribut sandboxRoot (elementy frame a iframe) 194, 197, 202, 222 atributy documentRoot (prvky frame a iframe) 30 automatické spuštění (spuštění aplikace AIR při přihlášení) 262 Adobe Media Player 249 informace o autorských právech 46 Adobe Reader 194, 245 instalace 23 adresář aplikace 100 verze 44, 268 adresář dokumenty 100 vyvolání prohlížeče 49 bitmapové obrazy, nastavení pro ikony 93 adresář home 100 zjištění instalace 282 bitmapy Adresář Moje dokumenty (Windows) 100 aplikace AIR B binární data Viz bytová pole podpora kopírování a vkládání 137 adresář plochy 100 aktualizace 291 Adresář Program Files (OS Windows) 276 asociace typů souborů 260 adresář uložení dat aplikace 25, 100, 104 distribuce 276 poloha v nich 149 adresář volitel dialogová okna 102 instalace 276 pořadí bytů 150 adresáře 100, 107 nastavení 42, 43, 266 velikost 149 podpora tažení 123, 131 bytová pole kopírování 108 odinstalování 26 odkazování 100 spouštění 259 odstraňování 109, 112 spuštění 276, 283 Č časové známky 286 přesouvání 108 ukončení 259 certifikační autority (CA) 285 vypsání 108 verze 291 certifikáty vytváření 108 vyvolání 259 autority (CA) 41 vyvolání aplikací 260 zavírání 259 formáty 286 AIR Debug Launcher (ADL) kódy ukončení a chyb 306 aplikační karanténa 194, 195, 207, 208, 209, 212, 222 možnosti příkazového řádku programu ADT 310 AppInstallDisabled (Nastavení registru Windows) 26 podepisování kódu 41 podepisování souborů AIR 285 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 319 Rejstřík přesunutí 288, 313 vytváření 162 řetězce 289 zabezpečení 168 vypršení 286 změna dat 177 změna 288, 313 databáze v paměti 162 Certifikáty Authenticode od společnosti Microsoft 286 datové typy, databáze 181 Certifikáty pro vývojáře AIR 286 Digitální ID Microsoft Authenticode 286 Certifikáty pro vývojáře Apple 286 Digitální ID pro podpis Sun Java 286 Certifikáty pro vývojáře JavaSoft 286 digitální podpisy 285, 307, 310 certifikáty s vlastním podpisem 41, 285, 314 distribuce aplikací AIR 276 Certifikáty Thawte 285, 286 dočasné adresáře 108 Certifikáty Verisign 285, 286 dočasné soubory 112 cesty (soubor a adresář) 104 dokumentace aplikace Flash 9 cesty, relativní 104 dokumentace jazyka ActionScript 9 default_badge.html 278 dokumentace společnosti Adobe 9 Ch Chod aplikace AIR aktualizace 23 chod programu AIR nové funkce 50 Clipboard (Schránka) 198 CSS přístup ke stylům HTML z jazyka ActionScript 220 rozšíření prostředí AIR 205 čtení souborů 112 Ď databáze asynchronní režim 161 chyby 178 identifikátory řádku 177 dokumentace, související 9 DOM HTML a nativní okna 55 DPAPI (přidružení šifrovaných dat k uživatelům) 190 DRM 249 oprávnění 255 dynamické generování kódu 31 É element allowBrowserInvocation (soubor deskriptoru aplikace) 49, 259, 262 Element customUpdateUI (soubor deskriptoru aplikace) 292 element customUpdateUI (soubor deskriptoru aplikace) 48, 259 Element fileTypes (soubor deskriptoru aplikace) 267 mazání dat 177 element fileTypes (soubor deskriptoru aplikace) 49 načítání dat 169 element ID (soubor deskriptoru aplikace) 44 o 158 element ID (třída NativeApplication) 266 pole 159 element ikony (soubor deskriptoru aplikace) 48 použití pro 158 primární klíče 176, 177 připojení 164 řádky 159 sloupce 159 soubory 158 struktura 159 synchronní režim 161 tabulky 159, 163 třídy použité s 159 typování dat 168, 181 v paměti 162 více, práce s 178 výkon 168 element initialWindow (soubor deskriptoru aplikace) 47, 55 element installFolder (soubor deskriptoru aplikace) 46 element maximalizace (soubor deskriptoru aplikace) 48 element maxSize (soubor deskriptoru aplikace) 48 element minimalizace (soubor deskriptoru aplikace) 48 element názvu souboru (soubor deskriptoru aplikace) 44 element obsahu (soubor deskriptoru aplikace) 47 element popisu (soubor deskriptoru aplikace) 45 element programMenuFolder (soubor deskriptoru aplikace) 46 element průhlednosti (soubor deskriptoru aplikace) 47 element šířky (soubor deskriptoru aplikace) 47 element titulu (soubor deskriptoru aplikace) 47 element verze (soubor deskriptoru aplikace) 44 element viditelnosti (soubor deskriptoru aplikace) 47 element výšky (soubor deskriptoru aplikace) 47 element x (soubor deskriptoru aplikace) 47 element y (soubor deskriptoru aplikace) 47 element změny velikosti (soubor deskriptoru aplikace) 48 elementy frame 194, 196, 202 elementy iframe 194, 196, 202 Endian.BIG_ENDIAN 150 Endian.LITTLE_ENDIAN 150 F Flash Media Rights Management Server 249 Flash Player 50, 192, 195, 213 Flex podpora přetažení 125 FMRMS (Flash Media Rights Management Server) 249 formát GZIP 151 formát souborů ZIP 153 formát SVG (scalable vector graphics) 195 formáty dat, Schránka 143 funkce (JavaScript) definice 32 konstruktor 211 literály 32 Funkce AC_FL_RunContent() (v default_badge.html) 278 funkce eval() 28, 31, 196, 208, 209 funkce setInterval() 32, 201, 211 element minSize (soubor deskriptoru aplikace) 48 funkce setTimeout() 32, 201, 211 element názvu (soubor deskriptoru aplikace) 45 funkce vyvolání z prohlížeče 262 funkce vyvolání prohlížeče 49 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 320 Rejstřík G gesto tažení dovnitř 123, 127 informace o autorských právech aplikace AIR 46 konstruktory Function (v jazyce JavaScript) 196 gesto tažení ven 123, 125 instalace kontextové nabídky 78, 84 H hesla instalace aplikací AIR 276 modul runtime prostředí AIR 1 nastavení pro zašifrovaný multimediální obsah 249 hlavní obrazovka 75 HTML HTML 85 kopírování a vkládání HTML 139, 198 J Java Cryptography Architecture (JCA) 310 klávesové zkratky 141 JavaScript příkazy nabídky 141 odložené vykreslení 145 chybové události 225 režimy přenosu 144 DOM, přístup z jazyka ActionScript 216 chyby 208, 216, 226, 229 výchozí položky nabídky (Mac OS) 142 karantény 195 modul runtime prostředí AIR a 192 kopírování adresářů 108 kopírování a vkládání 139 PDF 246 kopírování souborů 110 načtení obsahu 207 podpora prostředí AIR 195 kořenové svazky 100 okna 61 koš (odstranění souboru) 112 podpora přetažení 123, 131 přístup k rozhraním API aplikace AIR 212 překrytí obsahu SWF 63 programování 207 rolování 225 soubor AIRAliases.js 213 rozšíření prostředí AIR 202 události, zpracování 228 L literály objektů (v jazyce JavaScript) 31 tisk 195 vytváření křížových skriptů ActionScript 214 lokalizace 295 události 225 vložené objekty 194 zabezpečení 29, 194, 221 zásuvné moduly 194 zabezpečení 221 zamezení vzniku chyb zabezpečení 208 jmenný prostor XML (soubor deskriptoru aplikace) 43 JSON 196 Í ID aplikace 44 identifikátory vydavatele 266, 286 ikony K karanténa zabezpečení aplikace 26, 268 kurzor, účinky tažení 128, 132 lokální databáze Viz databáze lokální verze, výběr pro aplikaci 296 M Mac OS ikony proxy 59 panel nástrojů 59 animace 93 karanténa zabezpečení lokálnídůvěryhodná 26 manipulační program onload 31 aplikace 48 karanténa zabezpečení lokální-se-sítí 26 mazání adresářů 109 hlavní panel 67, 93 obrazy 93 karanténa zabezpečení lokální-se-systémem souborů 26 metoda acceptDragDrop() (třída NativeDragManager) 124, 128 odstranění 93 karantény 195, 221, 268 oznamovací oblast 93 karantény zabezpečení 26 metoda activate() (třída NativeWindow) 61, 66, 67 ukotvení 93, 94 klávesa Apple 81 metoda addChild() (třída Stage) 64 ikony doku 94 klávesa Ctrl 81 metoda addChildAt() (třída Stage) 64 podpora 93 klávesa Shift 81 Metoda attach() (třída SQLConnection) 178 poskakování 94 klávesové ekvivalenty příkazů nabídky 81 metoda bounce() (třída Icon) 94 klávesové zkratky Metoda browseForDirectory() (třída File) 102 ikony hlavního panelu 67 ikony hlavního panelu (Windows) 59 kopírování a vkládání 141 ikony hlavního panelu systému 79, 82 klávesové zkratky pro příkazy nabídky 81 ikony na hlavním panelu 93 knihy z nakladatelství Adobe Press 9 ikony oznamovací oblasti kódy chyb podpora 93 ikony proxy Mac OS 59 ikony ukotvení DRM 256 kódy ukončení (ADL) 306 kompilátor acompc 218 komprese deflate 151 minimalizace oken a ikony ukotvení 67 komprese ZLIB 151 nabídky 82 komprimování dat 151 maximalizace oken 48, 56, 68 Metoda browseForOpen() (třída File) 103 Metoda browseForSave() (třída File) 103 metoda clearData() objekt ClipboardData 198 objekt DataTransfer 131, 199 metoda close() třída NativeWindow 68 metoda close() (objekt Window) 55 metoda compress() (třída ByteArray) 151 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 321 Rejstřík metoda copy() (třída NativeApplication) 141 Metoda copyTo() (třída File) 110 metoda Loader.loadBytes() 39 metoda loadString() (třída HTMLLoader) 207 Metoda createDirectory() (třída File) 108 metoda maximize() (třída NativeWindow) 68 metoda createElement() (objekt Document) 212 metoda minimize() (třída NativeWindow) 68 metoda createRootWindow() (třída HTMLLoader) 61, 63, 207 metoda moveTo() Metoda createTempDirectory() (třída File) 108, 112 Metoda moveTo() (třída File) 110 Metoda createTempFile() (třída File) 112 Metoda moveToTrash() (třída File) 112 Metoda deleteDirectory() (třída File) 109 Metoda moveToTrashAsync() (třída File) 112 Metoda copyToAsync() (třída File) 110 Metoda deleteDirectoryAsync() (třída File) 109 Metoda deleteFile() (třída File) 111 Metoda deleteFileAsync() (třída File) 111 metoda dispatchEvent() (třída NativeWindow) 56 objekt Window 55 Metoda moveToAsync() (třída File) 110 Metoda NativeApplication.setAsDefaultApplic ation() 267 metoda open() objekt Window 33, 61 metoda setAsDefaultApplication() (třída NativeApplication) 49 metoda setData() metoda Clipboard 145 objekt ClipboadData 198 objekt DataTransfer 131, 133, 199 metoda setDataHandler() (třída Clipboard) 145 metoda setDragImage() (vlastnosti dataTransfer události tažení HTML) 131 metoda setDRMAuthenticationCredentials() (třída NetStream) 250, 252 metoda startMove() (třída NativeWindow) 70 metoda startResize() (třída NativeWindow) 70 metoda uncompress() (třída ByteArray) 151 Metoda update() (třída Updater) 291 metoda display() (třída NativeMenu) 88 objekt Window (Okno) 201 metoda doDrag() (třída NativeDragManager) 124, 125, 128 třída SQLConnection 161 metoda open() (třída SQLConnection) 162 Metoda execute() (třída SQLStatement) 167, 169, 176 metoda write() (objekt Document) 212 metoda openAsync() (třída SQLConnection) 161, 162, 164 metoda writeBytes() (třída ByteArray) 148 metoda exit() metoda orderBehind() (třída NativeWindow) 67 metoda writeInt() (třída ByteArray) 148 třída NativeApplication 264 metoda write() (objekt Document (Dokument)) 200 metoda writeFloat() (třída ByteArray) 148 Metoda getApplicationVersion() (soubor air.swf) 282 metoda orderInBackOf() (třída NativeWindow) 67 metoda writeln() (objekt Document (Dokument)) 200 metoda getData() metoda orderInFrontOf() (třída NativeWindow) 67 metoda writeln() (objekt Document) 212 metoda orderToBack() (třída NativeWindow) 67 metoda writeUTFBytes() (třída ByteArray) 148 metoda orderToFront() (třída NativeWindow) 67 Microsoft Windows metoda getData() (třída Clipboard) 124 Metoda postMessage() (objekt PDF) 247 metoda getData() (vlastnosti dataTransfer události tažení HTML) 131 minimalizace oken 48, 56, 67, 68 metoda print() (objekt Window (Okno)) 195 místní důvěryhodná karanténa 195 Metoda getDefaultApplication() (třída NativeApplication) 267 metoda readBytes() (třída ByteArray) 148 místní karanténa z hlediska systému souborů 195 Metoda getDirectoryListing() (třída File) 108 metoda readFloat() (třída ByteArray) 148 mnemotechnické znaky metoda readInt() (třída ByteArray) 148 objekt ClipboardData 198 objekt DataTransfer 133, 199 třída Clipboard 128 událost kopírování a vložení v HTML 139 Metoda getDirectoryListingAsync() (třída File) 108 Metoda getResult() (třída SQLStatement) 176 metoda readUTFBytes() (třída ByteArray) 148 modul runtime prostředí AIR Metoda relativize() (třída File) 104 metoda getStatus() (soubor air.swf) 281 metoda removeEventListener() 229 Metoda isSetAsDefaultApplication() (třída NativeApplication) 267 Metoda listRootDirectories() (třída File) 100 metoda loadBytes() (třída Loader) 39 položky nabídky 81 modifikační klávesy, položky nabídky 81 Metoda removeAsDefaultApplication() (třída NativeApplication) 267 Metoda installApplication() (soubor air.swf) 282 ikony hlavního panelu 59 metoda readObject() (třída ByteArray) 148 metoda getScreensForRectangle() (třída Screen) 75 metoda hasEventListener() 230 metoda writeObject() (třída ByteArray) 148 metoda resetDRMVouchers() (třída NetStream) 252 Metoda resolvePath() (třída File) 100 metoda restore() (třída NativeWindow) 68 Metoda setAsDefaultApplication() (třída NativeApplication) 267 instalace 1 odinstalace 2 monitory Viz obrazovky mosty karantén 30, 34, 194, 195, 209, 221, 222 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 322 Rejstřík Ň nabídka aplikace 90 neznámý název vydavatele (v instalátoru aplikace AIR) 285 objekty RegExp, převádění mezi jazyky ActionScript a JavaScript 219 normální okna 57 objekty zobrazení (ActionScript) 65 obnovení oken 56, 68 struktura 80 Nabídka Start (Windows) 46 Ó objekt Canvas (Plátno) 197, 204 nabídky 78 objekt DataTransfer události 90 aplikace 82 vlastnost types 133 obrazovky 74 hlavní 75 okna, přesouvání mezi 75 výčet 75 ikona hlavního panelu systému 82 objekt DataTransfer (přetažení HTML) 199 ikony hlavního panelu systému 79 objekt DataTransfer (tažení HTML) 131, 132, 133 komunikace pomocí kódu JavaScript 246 Objekt Document přidávání do aplikací AIR 245 klávesové ekvivalenty 81 kontextové nabídky 84 oddělovače 84 okno 82, 90 podnabídky 80, 83 položka ukotvení 82 položky 80 příkazy kopírování a vkládání 141 rozbalovací 82, 88 struktura 79 tok událostí 80, 88 třídy pro práci s nimi 79 typy 79 ukotvení 79 vlastní 79 výchozí systémové 79 vytváření 82 XML, definování nabídek 86 nabídky aplikace 78, 90 vytváření 82 nabídky okna 78, 90 metoda write() 32 metoda writeln() 32 objekt Document metoda createElement() 212 obsah PDF načítání 246 známá omezení 248 obsah SWF překrytí přes HTML 63 v HTML 194 metoda write() 212 oddělovače, nabídka 84 metoda writeln() 212 oddělovací znak cesty (systém souborů) 102 vlastnost designMode 133 odinstalace vlastnost stylesheets 220 objekt Document (Dokument) metoda wirte() 200 metoda wirtelin() 200 vlastnost designMode 200 Objekt Window modul runtime prostředí AIR 2 odinstalování aplikace AIR 26 odkazy na objekty podpora kopírování a vkládání 137 podpora přetažení 123 vlastnost childSandboxBridge 30 odkládací adresář aplikace 214 vlastnost parentSandboxBridge 30 odložené vykreslení (kopírování a vkládání) 145 vlastnost runtime 28, 33 objekt Window odstranění souborů 111, 112 metoda close() 55 odstraňování adresářů 109, 112 metoda moveTo() 55 okna 54 metoda open() 33, 61 aktivace 61 vlastnost htmlLoader 62, 207 aktivní 66, 67 vlastnost nativeWindow 55, 62 chování 57 vlastnost opener 62 inicializace 59 Nastavení registru Windows 26 vlastnost parent 62 maximalizace 48, 56, 68 nativní nabídky vlastnost parentSandboxBridge 222 maximální velikost 61 vlastnost runtime 62, 212 minimalizace 48, 56, 67, 68 vytváření 82 nabídky ukotvení 79 Nastavení FlashVars (pro používání badge.swf) 278 Viz nabídky nativní okna objekt Window (Okno) Viz okna metoda open 201 nepravoúhlá 58 Název sloupce OID (SQL) 177 metoda print() 195 normální okna 57 Název sloupce ROWID (SQL) 177 objekt htmlLoader 193 obnovení 56, 68 název vydavatele 285 objekt nativeWindow 193 poloha 47 neaktivní čas (uživatele) 268 vlastnost htmlLoader 201 pomocná okna 57 neaplikační karantény 135, 194, 195, 208, 209, 222 vlastnost nativeWindow 201 pořadí 67 vlastnost parentSandboxBridge 201 pořadí zobrazení 67 neaplikační karantény zabezpečení 28 vlastnost runtime 193, 200 pozadí 58 nepojmenované parametry (v příkazech SQL) 168 minimální velikost 61 Objekt XMLHttpRequest 33 přemísťování 56, 70 objekt XMLHttpRequest 196, 202, 212 přesouvání 75 objekty Date, převádění mezi jazyky ActionScript a JavaScript 219 průhlednost 47, 58 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 323 Rejstřík režim změny velikosti plochy 61 pole (databáze) 159 Příkaz SELECT (SQL) 169, 181 skrývání 66 Příkaz UPDATE (SQL) 177 správa 66 Pole NSHumanReadableCopyright(OS Mac) 46 styl 57 poloha oken 47 systémové prvky 57 položky nabídky 80 příkazy, nabídka Viz položky nabídky příkazy, SQL 166 systémové prvky operačního systému 57 checked 82 tok událostí 56 enabled 82 třídy pro práci s nimi 55 klávesové ekvivalenty 81 typy 57 klávesové zkratky 81 události 72 kopírování a vkládání 142 připojení k databázi 164 úvodní 55 mnemotechnické znaky 81 velikost 47, 61 stavy 82 přípony (soubor), asociace s aplikací AIR 49, 267 viditelnost 47 výběr 89 vlastní systémové prvky 57 vytváření 83 vlastnosti 47 položky nabídky, data primární klávesy položky nabídky 81 primární klíče databáze 176 přípony (soubor), přiřazení k aplikaci AIR 260 procházení přiřazení 82 výběr adresáře 102 vzhled 57 pomocná okna 57 výběr souboru 103 zavírání 56, 68, 264 pořadí bytů 150 zjednodušená okna 57 pořadí bytů big-endian 150 změna velikosti 48, 56, 70 pořadí bytů little-endian 150 zobrazení 66 pořadí oken 67 vytváření 59, 65, 207 okna pracovní plochy Viz okna okna zobrazená na celou obrazovku 73 oprávnění pro obsah s šifrováním DRM 255 pořadí zobrazení, okna 67 povolení, použití pro obsah s šifrováním DRM 249 požadavky Program AIR Developer Tool (ADT) zabalení souboru AIR 307 Prohlášení o postupech certifikátu (CPS) 289 protokol asfunction 28 průhledná okna 47, 58 pruhy nabídek 80 prvky iframe 30 vykreslení PDF 245 pozice myši během tažení 129 Ř řádky (databáze) 159, 176 překlad aplikací 295 Registrace typů souborů 267 oprávnění vyžadovaná pro aktualizaci runtime AIR nebo aplikaci AIR 23 přemísťování oken 56, 70 relativní cesty (mezi soubory) 104 přesouvání adresářů 108 osobní klíče 310 přesouvání souborů 110 řetězec klíčů (přidružení šifrovaných dat k uživatelům) 190 otazník (?) znaky, v nepojmenovaných parametrech SQL 168 přesun podpisu 288, 313 oprávnění vyžadovaná pro aktualizaci runtime AIR nebo aplikace AIR 276, 283 ověřování dat, vyvolání aplikace 263 pozadí oken 58 přetažení do obsahu neaplikační karantény (v HTML) 135 RIA (Rich Internet Applications) 7 _ROWID_ column name (SQL) 177 rozbalovací nabídky 78, 88 vytváření 82 P panel nástrojů (Mac OS) 59 efekty kurzoru 128, 132 rozměry, okna 47 formáty přenosu 123 Runtime AIR parametry, v příkazech SQL 167 gesta 123 PDF HTML 129, 199 podpora 194, 245 klávesy modifikátoru 128 pevná vazba šifrovaných dat 190 podpora Flex 125 podepisování kódu 41, 285 příbuzné třídy 123 podepisování souborů AIR 307 události v HTML 130 podnabídky 80, 83 podpisy přesunutí 288, 313 Podpora databáze SQLLite 157 Viz také databáze pojmenované parametry (v příkazech SQL) 167 výchozí chování v HTML 130 úrovně dočasné opravy 268 zjišťování 268, 281 runtime AIR úrovně záplaty 43 Š schéma adresy URL v jazyce JavaScript 202 přihlášení do systému, spuštění aplikace AIR 262 schéma app adresy URL 195 přihlášení, spuštění aplikace AIR 262 Schéma URL app 246 Příkaz CREATE TABLE (SQL) 163 schéma URL app 37, 39, 62, 214, 222 Příkaz DELETE (SQL) 177 Schéma URL app-storage 246 Příkaz INSERT (SQL) 181 schéma URL app-storage 25, 37, 39 schéma URL aplikace 104 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 324 Rejstřík schéma URL app-support 222 podpora přetažení 123 schéma URL file 214 přesouvání 110 schéma URL javascript 32, 211 zápis 112 schéma URL souboru 37, 104 Soubory AIR Ť tabulky (databáze) 159 vytváření 163 tagy script 196, 200, 212, 213, 218 schéma URL uložení dat aplikace 104 podepisování 285 technická podpora 9 Schémata URL 104 zabalení 307 text Schopnosti vlastnost language 296 vlastnost languages 296 Schránka Soubory AIRI vytváření pomocí programu AIR Developer Tool (ADT) 312 soubory cookie 198 podpora kopírování a vkládání 137 podpora přetažení 123, 131 tisk 195 Třída formáty dat 143, 144 Soubory Info.plist (OS Mac) 46 kopírování a vkládání 137 Soubory P12 286 třída ApplicationDomain 215 systémová 137 Soubory PFX 286 třída BrowserInvokeEvent 262 zabezpečení 138 soubory SWF třída ByteArray serializace objektů 125 načtení pomocí tagu script 218 SQLStatement 159, 165 konstruktor 148 spouštění aplikací AIR 259 metoda compress() 151 podpora kopírování a vkládání 137 správa digitálních práv 249 metoda readBytes() 148 podpora přetažení 123 spuštění aplikací AIR 276, 283 metoda readFloat() 148 SQL metoda readInt() 148 serializované objekty Seznam zrušených certifikátů (CRL) 289 seznamy souborů podpora přetažení 131 seznamy stylů, HTML práce v jazyce ActionScript 220 šifrovaná data, ukládání a načítání 190 šifrování 249 název sloupce OID 177 metoda readObject() 148 název sloupce ROWID 177 metoda readUTFBytes() 148 nepojmenované parametry (v příkazech) 168 metoda uncompress() 151 o 159 parametry v příkazech 167 metoda writeBytes() 148 metoda writeFloat() 148 metoda writeInt() 148 šifrování dat 190 pojmenované parametry (v příkazech) 167 šifrování obsahu videa 249 příkaz CREATE TABLE 163 metoda writeUTFBytes() 148 skrývání oken 66 příkaz DELETE 177 vlastnost bytesAvailable 149 sloupce (databáze) 159 příkaz INSERT 181 vlastnost length 149 Sloupce AUTOINCREMENT (SQL) 177 příkaz SELECT 169, 181 vlastnost position 149 sloupce INTEGER PRIMARY KEY (SQL) 177 příkaz UPDATE 177 snímky 30 soubor AIRAliases.js 193, 213 Soubor AIRLocalizer.js 296 soubor API 98 soubor deskriptoru aplikace 42 soubor desktriptoru aplikace čtení 266 soubor ID vydavatele 266 soubor JavaScript AIRAliases.js 193 soubor volitel dialogová okna 103 soubory čtení 112 databáze 158 kopírování 110 odkazování 102 příkazy 165, 166 _ROWID_ column name 177 metoda writeObject() 148 Třída Capabilities vlastnost playerType 268 třída Clipboard sloupce AUTOINCREMENT 177 metoda getData() 124, 128 sloupce INTEGER PRIMARY KEY 177 metoda setData() 145 třídy použité s 159 metoda setDataHandler() 145 typování dat 168, 181 vlastnost generalClipboard 137 start (systém), spuštění aplikace AIR 262 Třída ClipboardFormats 143 synchronní programování Třída ClipboardTransferModes 144 databáze 161, 164, 181 třída CompressionAlgorithm 151 systém souborů 98 Třída ContextMenu 81, 84 XMLHttpRequests 212 třída ContextMenuEvent systém souborů zabezpečení 37 vlastnost contextMenuOwner 84 vlastnost mouseTarget 84 systém souborů API 98 Třída ContextMenuItem 81 systémové prvky operačního systému 57 třída Dictionary 213 okna HTML 61 třída DRMAuthenticateEvent 250, 254 třída DRMErrorEvent 250 odstranění 111, 112 kódy chyb 256 podpora kopírování a vkládání 137 vlastnost subErrorID 256 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 325 Rejstřík třída DRMStatusEvent 250 metoda createRootWindow() 61, 63, 207 vlastnost supportsDockIcon 93 třída EncryptedLocalStore 190 metoda loadString() 207 vlastnost supportsMenu 90 Třída File 99 události 225 vlastnost supportsSystemTrayIcon 93 getRootDirectories() 99 vlastnost height 207 třída NativeBoundsEvent 72 metoda browseForDirectory() 102 vlastnost paintsDefaultBackground 58, 64 třída NativeDragEvent metoda browseForOpen() 103 vlastnost pdfCapability 245 metoda browseForSave() 103 vlastnost runtimeApplicationDomain 215 metoda copyTo() 110 metoda copyToAsync() 110 vlastnost width 207 vlastnost clipboard 128 vlastnost dropAction 127, 128 třída NativeDragManager metoda acceptDragDrop() 124, 128 metoda createDirectory() 108 Třída HTMLPDFCapability 245 metoda createTempDirectory() 108, 112 Třída HTMLUncaughtScriptException 226 třída NativeMenu 80, 88 metoda createTempFile() 112 třída Icon třída NativeMenuItem 80 metoda deleteDirectory() 109 metoda deleteDirectoryAsync() 109 metoda deleteFile() 111 metoda bounce() 94 třída icon vlastnost bitmaps 93 metoda doDrag() 124, 125, 128 data vlastnost data 82 vlastnost keyEquivalent 81 vlastnost keyEquivalentModifiers 81 metoda deleteFileAsync() 111 Třída InvokeEvent 49 vlastnost label 142 metoda getDirectoryListingAsync() 108 třída InvokeEvent 260 vlastnost mnemonicIndex 81 metoda getRootDirectories() 99 vlastnost arguments 260 metoda moveTo() 110 vlastnost currentDirectory 260 vlastnost podnabídky 80 třída NativeWindow 54 metoda moveToAsync() 110 třída Keyboard 81 konstruktor 61 metoda moveToTrash() 112 třída Loader 62 metoda activate 66 metoda moveToTrashAsync() 112 třída LoaderContext metoda activate() 61, 67 metoda relativize() 104 metoda resolvePath() 99 vlastnost applicationStorageDirectory 99 vlastnost creationDate 110 vlastnost creator 110 vlastnost desktopDirectory 99 vlastnost documentsDirectory 99 vlastnost encoding 107 vlastnost exists 110 vlastnost isDirectory 110 vlastnost lineEnding 107 vlastnost allowLoadBytesCodeExecution 39 vlastnost applicationDomain 34 vlastnost securityDomain 34 třída LoaderInfo vlastnost childSandboxBridge 35 vlastnost parentSandboxBridge 35 Třída LocalConnection 277, 284 Třída NativeApplication metoda getDefaultApplication() 267 metoda isSetAsDefaultApplication() 267 metoda addEventListener() 72 metoda close() 68 metoda dispatchEvent() 56 metoda maximize() 68 metoda minimize() 68 metoda orderBehind() 67 metoda orderInBackOf() 67 metoda orderInFrontOf() 67 metoda orderToBack() 67 metoda orderToFront() 67 metoda restore() 68 vlastnost modificationDate 110 metoda removeAsDefaultApplication() 267 vlastnost name 110 metoda setAsDefaultApplication() 49 metoda startResize() 70 vlastnost nativePath 99, 110 vlastnost applicationDescriptor 266 události 72 vlastnost parent 110 vlastnost ID 266 vlastnost alwaysInFront 67 vlastnost separátor 107 vlastnost idleThreshold 268 vlastnost stage 64 vlastnost size 110 vlastnost lastUserInput 268 vlastnost systemChrome 57 vlastnost spaceAvailable 106 vlastnost publisherID 266, 286 vlastnost systemMaxSize 61 vlastnost type 110 vlastnost runtimePatchLevel 267 vlastnost systemMinSize 61 vlastnost url 99, 110 vlastnost runtimeVersion 267 vlastnost transparent 57, 58 vlastnost userDirectory 99 třída NativeApplication 202 metoda startMove() 70 vlastnost type 57 třída File 98 metoda addEventListener() 259 vlastnost visible 61, 66 třída FileMode 98 metoda copy() 141 vytváření instancí 65 třída FileStream 98 metoda exit() 264 třída NativeWindow class Třída HTMLLoader 207 vlastnost activeWindow 66 třída HTMLLoader JavaScript, přístup 193 vlastnost autoExit 264 třída NativeWindowDisplayStateEvent 72 JavaScript, přístup 193 vlastnost icon 93 třída NativeWindowInitOptions 60, 61 kopírování a vkládání 138 vlastnost startAtLogin 262 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 326 Rejstřík třída NetStream třída StageDisplayState 73 událost move 56, 72 metoda resetDRMVouchers() 252 třída StageScaleMode 61, 70 událost moving 72 metoda setDRMAuthenticationCredentials() 2 50, 252 třída StatusEvent 250 událost nativeDragComplete 124, 127, 129 třída TextField událost nativeDragDrop 124 třída Netstream zašifrovaný obsah, přehrávání 250 Třída Responder 166, 176 třída Screen 74 metoda getScreenForRectangle() 75 vlastnost mainScreen 75 vlastnost screens 75 Třída Security metoda allowDomain() 34, 38 vlastnost sandboxType 268 Třída souboru odkazování na lokální databázi 162 Třída SQLCollationType 159 Třída SQLColumnNameStyle 159 Třída SQLConnection 159 metoda attach() 178 metoda open 162 metoda open() 161 metoda openAsync() 161, 162, 164 Třída SQLError 159, 166 Třída SQLErrorEvent 159, 166 Třída SQLEvent 159 Třída SQLIndexSchema 159 Třída SQLMode 159, 165 Třída SQLResult 159 Třída SQLSchemaResult 159 Třída SQLStatement metoda execute() 176 metoda getResult() 176 metoda spuštění 167 objekt parametry 166 vlastnost parametrů 167 vlastnost sqlConnection 166 vlastnost textu 166, 167, 169, 177 Třída SQLTableSchema 159 Třída SQLTransactionLockType 159 Třída SQLTriggerSchema 159 Třída SQLUpdateEvent 159 Třída SQLViewSchema 159 třída Stage metoda addChild() 64 metoda addChildAt() 64 vlastnost displayState 73 vlastnost nativeWindow 60, 66 vlastnost scaleMode 61, 70 kopírování a vkládání 138 událost nativeDragEnter 124, 127, 128, 129 načtený HTML 207 událost nativeDragExit 124, 129 značky img 28 událost nativeDragOver 124, 127, 128, 129 Třída Updater 291 událost nativeDragStart 124, 129 třída URLStream 196 událost nativeDragUpdate 124, 129 třída Window 54 událost posouvání 225 třída WindowedApplication 54 událost resize 56, 72 třída XMLList 213 událost resizing 72 typy MIME událost schránky 199 kopírování a vkládání HTML 198 událost select 80, 89, 90 kopírování a vkládání v HTML 144 událost tažení 130 přetažení HTML 131 Událost uncaughtScriptExcpetion 225 událost upuštění 130 Ú událost active 72 událost userIdle 268 událost browserInvoke 263 událost vyjmutí 139 událost browserInvokey 284 událost výsledku 166 událost chyby 166 události Událost userPresent 268 událost close 72 HTML 225 událost closing 68, 72, 228, 264 manipulační programy 228 událost complete 216, 220 nabídka 80, 88 událost contextmenu 85 nativní okna 56 událost deactivate 72 posluchače 228 událost displaying 80, 90 třída NativeWindow 72 událost displayStateChange 56, 72 události load 212 událost displayStateChanging 56, 72 události menuItemSelect 81 událost dokončení 225 události menuSelect 81 událost dominitialize 203 události unload (odstranění z paměti) 200 událost drag (přetažení) 199 ukázkové aplikace 2 událost dragend 130, 199 ukončení aplikací AIR 259 událost dragenter 130, 199 úložiště klíčů 310, 314 událost dragleave 130, 199 UntrustedAppInstallDisabled (Nastavení registru Windows) 26 událost dragover 130, 199 událost dragstart 130, 199 událost drop (vložení) 199 událost enterFrame 64 událost exiting 264 událost htmlBoundsChanged 225 Událost htmlDOMInitialize 225 událost invoke 259 událost kopírování 139 událost load 208, 216 událost load (načtení) 194, 196 událost locationChange 225 událost mouseDown 70, 124 událost mouseMove 124 UpdateDisabled (Nastavení registru Windows) 26 URL 214 načtení obsahu HTML 207 podpora kopírování a vkládání 137 podpora přetažení 123, 131 úrovně dočasné opravy runtime AIR 268 úrovně záplaty, runtime AIR 43 útoky pomocí downgradované verze aplikace a zabezpečení 40 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 327 Rejstřík uživatelská jména nastavení pro zašifrovaný multimediální obsah 249 uživatelská pověření a zabezpečení 40 V velikost oken 47 velikost, okna 61 verze, aplikace AIR 268 videa FLV, šifrování 249 viditelnost oken 47 vlastní systémové prvky 57 vlastní uživatelské rozhraní pro aktualizaci 292 vlastnost activeWindow (třída NativeApplication) 66 vlastnost air (soubor AIRAliases.js) 193, 213 vlastnost customItems (třída ContextMenu) 84 Vlastnost nativePath (třída File) 100 vlastnost data vlastnost nativeWindow třída NativeMenuItem 82 vlastnost designMode (objekt Document (Dokument)) 200 vlastnost designMode (objekt Document) 133 Vlastnost desktopDirectory (třída File) 100 vlastnost nativePath (třída File) 110 objekt Window (Okno) 193, 201 třída Stage 60, 66 vlastnost nativeWindow (objekt Window) 55, 62 vlastnost opener (objekt Window) 62 vlastnost displayState (třída Stage) 73 vlastnost paintsDefaultBackground (třída HTMLLoader) 58, 64 Vlastnost documentsDirectory (třída File) 100 Vlastnost parametrů (třída SQLStatement) 166, 167 vlastnost dropAction (třída NativeDragEvent) 127, 128 vlastnost parent (objekt Window) 62 vlastnost dropEffect (objekt DataTransfer) 131, 132, 199 vlastnost parentSandboxBridge vlastnost effectAllowed (objekt DataTransfer) 131, 132, 199 vlastnost parent (třída File) 110 (objekt Window (Okno)) 201 objekt Window 30 třída LoaderInfo 35 vlastnost allowLoadBytesCodeExecution (třída LoaderContext) 39 Vlastnost encoding (třída File) 107 vlastnost alwaysInFront (třída NativeWindow) 67 Vlastnost generalClipboard (třída Clipboard) 137 vlastnost applicationDescriptor(třída NativeApplication) 266 vlastnost height (třída HTMLLoader) 207 Vlastnost pdfCapability (třída HTMLLoader) 245 Vlastnost hostContainer (PDF) 247 Vlastnost playerType vlastnost htmlLoader (objekt Window (Okno)) 193, 201 vlastnost podnabídky třída BrowserInvokeEvent 263 vlastnost htmlLoader (objekt Window) 62, 207 třída InvokeEvent 260 vlastnost position (třída ByteArray) 149 vlastnost icon (třída NativeApplication) 93 Vlastnost applicationStorageDirectory (třída File) 100 vlastnost arguments vlastnost autoExit třída NativeApplication 264 vlastnost exists (třída File) 110 Vlastnost idleThreshold (třída NativeApplication) 268 vlastnost parentSandboxBridge (objekt Window) 222 třída Capabilities 268 třída NativeMenuItem 80 vlastnost publisherID (třída NativeApplication) 266, 286 vlastnost bitmaps (třída Icon) 93 vlastnost innerHTML 32, 200, 212 vlastnost runtime (objekt Window (Okno)) 193, 200 vlastnost bytesAvailable (třída ByteArray) 149 vlastnost isDirectory (třída File) 110 vlastnost runtime (objekt Window) 62, 212 vlastnost isHTTPS (třída BrowserInvokeEvent) 263 vlastnost runtimeApplicationDomain (třída HTMLLoader) 215 vlastnost keyEquivalent (třída NativeMenuItem) 81 Vlastnost runtimePatchLevel (třída NativeApplication) 267 vlastnost clientX (události tažení HTML) 131 vlastnost keyEquivalentModifiers (třída NativeMenuItem) 81 Vlastnost runtimeVersion (třída NativeApplication) 267 vlastnost clientY (události tažení HTML) 131 vlastnost label (třída NativeMenuItem) 142 vlastnost sandboxRoot vlastnost childSandboxBridge objekt Window 30 třída LoaderInfo 35 vlastnost clipboard (třída NativeDragEvent) 128 vlastnost clipboardData (události schránky) 199 Vlastnost lastInsertRowID (třída SQLResult) 176 Vlastnost lastUserInput (třída NativeApplication) 268 vlastnost length (třída ByteArray) 149 Vlastnost clipboardData property (události kopírování a vkládání v HTML) 139 Vlastnost lineEnding (třída File) 107 vlastnost contextMenuOwner (třída ContextMenuEvent) 84 Vlastnost messageHandler (PDF) 247 vlastnost creationDate (třída File) 110 vlastnost creator (třída File) 110 vlastnost currentDirectory (třída InvokeEvent) 260 vlastnost currentDomain (třída ApplicationDomain) 215 vlastnost mainScreen (třída Screen) 75 vlastnost mnemonicIndex třída NativeMenuItem 81 vlastnost modificationDate (třída File) 110 vlastnost mouseTarget (třída ContextMenuEvent) 84 vlastnost name (třída File) 110 snímek 30 snímek iframe 30 vlastnost sandboxType třída BrowserInvokeEvent 263 třída Security 268 vlastnost scaleMode třída Stage 70 vlastnost screens (třída Screen) 75 vlastnost screenX (události tažení HTML) 131 vlastnost screenY (události tažení HTML) 131 vlastnost securityDomain (třída BrowserInvokeEvent) 263 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 328 Rejstřík Vlastnost separátor (třída File) 107 vytváření křížových skriptů 34, 214, 221 vlastnost size (třída File) 110 vyvolání aplikací AIR 259 adresář uložení dat aplikace 25 Vlastnost spaceAvailable (třída File) 106 vzdálené karantény 195 chyby jazyka JavaScript 208 Vlastnost sqlConnection (třída SQLStatement) 166 vzdálené karantény zabezpečení 26 CSS 29 vzhled oken 57 databáze 168 vlastnost stage třída NativeWindow 64 vlastnost startAtLogin (třída NativeApplication) 262 vlastnost styleSheets (objekt Document) 220 vlastnost subErrorID (třída DRMErrorEvent) 256 vlastnost supportsDockIcon (třída NativeApplication) 93 vlastnost supportsMenu (třída NativeApplication) 90 vlastnost supportsSystemTrayIcon (třída NativeApplication) 93 vlastnost systemChrome (třída NativeWindow) 57 vlastnost systemMaxSize (třída NativeWindow) 61 vlastnost systemMinSize (třída NativeWindow) 61 Vlastnost textu (třída SQLStatement) 166, 167, 169, 177 zabezpečení dynamické generování kódu 31 W web podpory společnosti Adobe 9 funkce eval() 31 WebKit 192, 195, 205 HTML 29, 31, 192, 194, 208 vlastnost -webkit-border-horizontalspacing jazyka CSS 206 instalace (aplikace a chod programu) 23 vlastnost -webkit-border-vertical-spacing jazyka CSS 206 karanténa zabezpečení aplikace 26 vlastnost -webkit-line-break jazyka CSS 206 vlastnost -webkit-margin-bottom-collapse jazyka CSS 206 funkce vyvolání z prohlížeče 263 JavaScript 221 karantény 194, 195, 221, 268 karantény zabezpečení 26 křížové skriptování 34 vlastnost -webkit-margin-collapse jazyka CSS 206 metoda Loader.loadBytes() 39 vlastnost -webkit-margin-start jazyka CSS 206 mosty karantén 30, 222 vlastnost -webkit-margin-top-collapse jazyka CSS 206 načítání obsahu 62 vlastnost -webkit-nbsp-mode jazyka CSS 206 nejlepší postupy 39 mezidoménové vyrovnávací paměti 28 mosty karantény zabezpečení 34 neaplikační karantény zabezpečení 28 vlastnost -webkit-padding-start jazyka CSS 206 objekty XMLHttpRequest 33 vlastnost -webkit-rtl-ordering jazyka CSS 206 Schránka 138 vlastnost type (třída NativeWindow) 57 vlastnost -webkit-text-fill-color jazyka CSS 206 snímky 29, 30 vlastnost types vlastnost -webkit-text-security CSS 206 vlastnost transparent (třída NativeWindow) 57, 58 vlastnost type (třída File) 110 událost kopírování a vložení v HTML 139 vlastnost -webkit-user-drag CSS 130, 206 událost tažení HTML 131 vlastnost types (objekt DataTransfer) 133 vlastnost -webkit-user-modify jazyka CSS 206 vlastnost types (typy) vlastnost -webkit-user-select CSS 130, 132 objekt DataTransfer 199 Vlastnost url třída File 100 vlastnost url třída File 110 Vlastnost url (třída File) 100 Vlastnost userDirectory (třída File) 100 vlastnost visible třída NativeWindow 61, 66 vlastnost -webkit-user-drag CSS 132 vlastnost width (třída HTMLLoader) 207 vlastnosti outerHTML 200 vložené objekty (v HTML) 194 výčet obrazovek 75 vypsání adresářů 108 vysunovací okna 67 vytváření adresářů 108 vlastnost -webkit-user-select jazyka CSS 206 webové prohlížeče instalace aplikací AIR z 282, 283 spuštění aplikace AIR z webového prohlížeče 262 protokol asfunction 28 šifrování dat 190 snímky iframe 29, 30 struktury Ajax 32 systém souborů 37 textová pole 28 útoky pomocí downgradované verze aplikace 40 uživatelská oprávnění pro instalaci 23 uživatelská pověření 40 window.open() 33 XMLHTTPRequest 203 značky img 28 zjištění, zda je aplikace AIR nainstalována z 282 Zabezpečení jazyka JavaScript 31 zjišťování runtime AIR z 281 zabezpečení mezidoménové vyrovnávací paměti 28 X XML definování nabídek 86 třída 213 xmlns (soubor deskriptoru aplikace) 43 zápis souborů 112 zásuvné moduly (v HTML) 194 zavírání aplikací 264 zavírání aplikací AIR 259 zavírání oken 56, 68, 264 zjednodušená okna 57 Ž zabalení souborů AIR program AIR Developer Tool (ADT) 307 změna velikosti oken 48, 56, 70 značky img (v obsahu objektu TextField) 28 VÝVOJ APLIKACÍ ADOBE AIR 1.1 POMOCÍ PROGRAMU ADOBE FLASH CS4 PROFESSIONAL 329 Rejstřík značky skriptu vlastnosti src 32 znak @ (at) v názvech parametru příkazu SQL 167 znak \ (dvojtečka) v názvech parametru příkazu SQL 167 znak at (@), v názvech parametru příkazu SQL 167 znak dvojtečka (\ ) v názvech parametru příkazu SQL 167 zobrazení Viz obrazovky zobrazení oken 66 zpracování onclick 211 zpracování onmouseover 211 zvolené položky nabídky 82
Podobné dokumenty
ASP.NET pre začiatočníkov
Pri surfovaní na Internete sa stretávame s viacerými druhmi webových aplikácií. Pod pojmom webová aplikácia,
rozumieme aplikáciu, ktorá je umiestnená na serveri, pričom vo väčšine prípadov na serve...
Objektově orientovaná tvorba softwaru
1.7.10 Komponentové programování............................................................................................. 32
1.8 Základní principy objektově orientovaného přístupu. ...............
Zobrazit nápovědu v souboru
Některá zlepšení výkonu neznamenají znatelné zlepšení pro uživatele. Je důležité zaměřit optimalizaci výkonu do
oblastí, které jsou problematické z pohledu vaší specifické aplikace. Některé způsoby...
Krajská příloha k národní RIS 3 - ICUK Inovační centrum Ústeckého
pouze základním vzděláním a osob bez vzdělání, naopak jeden z nejnižších podílů osob
s vysokoškolským vzděláním. Přestože zaměstnanost vysokoškoláků v ČR dlouhodobě roste,
dynamika tohoto trendu je...