Flash Ripper RSS Readers

Как исключить кэширование флэш-приложения и всех подгружаемых в него данных, передавая ему через адресную строку браузера номер билда в качестве аргумента, автоматически увеличивающегося на единицу при каждой компиляции проекта по Ctrl + Enter

Я уже писал, как использовать ant-скрипты для сердитой компиляции флэш-проектов, чтобы тестировать обновленный(е) скомпилированный(е) swf-файл(ы) сразу в окне браузера, содержащем открытый прямо с вашего сервера документ, а не в одиного торчащем окне standalone-flash-проигрывателя.

Сегодня мы рассмотрим, как, базируясь на том же самом билд-скрипте, передать вашему флэш-приложению дополнительные параметры через адресную строку браузера (иными словами, передать параметры через GET-запрос). Один из самых распространненых случаев, когда нам нужен это прием -- это так называемый запрет кэширования swf-файла(ов). Как вы наверняка уже знаете, чтобы загружаемый файл гарантированно обновился, а не брался из кэша браузера, существует верный способ: изменять путь к нему, приписывая к этому пути параметр с изменяющимся значением. В результате html-код будет выглядеть как: <param name="movie" value="app.swf?v=1.0.121">. В качестве изменяющегося параметра мы будем приписывать номер билда, увеличивающийся на единицу при каждой компиляции проекта. Его еще называют минорной версией и стандартно изпользуют как в Java, так и в .NET.

Итак, разберемся, что нам нужно получить. Начинаем "с конца":

  1. HTML-код для вставки флэш-приложения должен содержать постоянно увеличивющийся на единицу параметр 'v';
  2. Можно и нужно взять значение этого параметра из адресной строки браузера и вписать его в html-код с помощью Javascript;
  3. В адресную строку браузера мы передадим значение этого параметра из ant-скрипта, в котором мы и будем это значение хранить и увеличивать.

Всего три шага к решению задачи! Из них первый не требует никаких усилий вообще. Второй шаг тоже несложный, но нужно акцентировать внимание не том, как именно мы возьмем значение параметра из адресной строки и передадим его флэш-объекту. Для этого лучше всего подходит SWFObject, так как у него уже есть встроенный и тыщу раз протестированный метод getQueryParamValue(), который берет аргументы адресной строки браузера и приписывает их как параметры swf-объекта прямо в исходный код: so.addVariable("v", getQueryParamValue("v")); so.write("flashcontent"); этим мы и воспользуемся!

Кстати, если вы до сих пор не используете SWFObject для встраивания флэш-приложений в свои страницы, то вам стоит начать это делать прямо сейчас, благо есть понятная и компактная русскоязычная инструкция к SWFObject от МК. Вообще, без SWFObject лучше ничего дальше не делайте, потому что он и проблемы отображения Flash в IE решает (помните историю с Eolas-патентом, из-за которой мы до сих пор выгребаем?), и версию проигрывателя может легко определить. К поисковикам он тоже дружелюбнее всех остальных способов встраивания флэша в веб-страницу. При этом он прост и элегантен! В общем, если ваши лыжи при скольжении по асфальту до сих пор издают неприятный звук, переходите на использование SWFObject как можно скорее!

Третий шаг производится в билд-файле. Для увеличения номера билда в ant имеется спецсвойство <buildnumber />. Оно принимает аргумент "file" (по умолчанию он равен "build.number")—имя файла, в котором будет храниться номер билда. Если такого файла нет, он будет создан в корневом каталоге проекта. Если уже есть—то хранящийся в нем номер билда увеличивается на единицу (также в этом файле хранится дата/время последнего билда).

Используем же свойство <buildnumber /> в билд-файле из предыдущего урока, посвященного сердитой компиляции! Для этого добавим в него новую цель "build.number.increment" и обеспечим ее вызов из основной цели "build" прежде двух других целей, "mtasc.compile" и "run.html". И, наконец, в цели run.html припишем увеличенное значение из build.number к аргументу output.html,—обратите внимание, ради этого последнего действия все и затевалось: <arg line="${output.html}${build.number}" />.

Заметьте, как выглядит теперь аргумент output.html: он заканчивается строкой "/index.html?v=0.0."—таким образом, после приписывания к нему номера билда получится нечто вроде "/index.html?v=0.0.121"—и последнее число будет автоматически увеличиваться с каждой компиляцией и попадать в адресную строку браузера. А Javascript из страницы index.html будет брать этот аргумент из адресной строки и приписывать его к параметру movie swf-файла, и мы получим требуемый: <param name="movie" value="app.swf?v=1.0.121">. Кстати, флэш-приложение app.swf может затем использовать этот параметр во всех своих методах загрузки внешних данных, таким образом исключая кеширование и их тоже!

Вот обновленный код файла build.xml (новые строки выделены жирным):

<?xml version="1.0"?>
<project default="build" basedir=".">

	<property name="mtasc.path" value="C:\Program Files\Mtasc\mtasc.exe" />
	<property name="matsc.args" value='App -version 8 -swf "d:\projects\[PROJECT]\bin\app.swf" -cp "[DISC]:\Documents and Settings\[USERNAME]\Local Settings\Application Data\Macromedia\Flash 8\en\Configuration\Classes" -cp D:\Projects\[PROJECT]\classes -cp D:\Swf\classes' />

	<property name="web.browser.path" value="c:\Program Files\Firefox\Firefox.exe" />
	<property name="output.html" value="-url http://localhost/[PROJECT]/index.html?v=0.0." />

	<!-- property name="flash.player.path" value="c:\Program Files\Macromedia\Flash 8\Players\Debug\SAFlashPlayer.exe" / -->
	<!-- property name="flashcommand.path" value="'c:\Program Files\FlashCommand\FlashCommand.exe'" / -->
	<!-- property name="" value="" / -->
	
    <target name="build" depends="build.number.increment, mtasc.compile, run.html" />

    <target name="build.number.increment" >
    	<buildnumber file="build.number"/>
    </target>
	
    <target name="mtasc.compile">
    	<exec executable="${mtasc.path}" >
    		<arg line="${matsc.args}" />
    	</exec>
    </target>

    <target name="run.html">
    	<exec executable="${web.browser.path}" >
    		<arg line="${output.html}${build.number}" />

    	</exec>
    </target>

</project>

Как видите, Ant полезен во многих отношениях. И если вас интересует этот действительно мощный инструмент, то вот пара толковых ресурсов для тех, кто только начинает с ним знакомиться, и это по-русски:"Ant за 10 шагов — документация Javatech" и "Автоматизируйте процесс сборки Java программ с помощью Ant". И, конечно, бессмертная статья от Константинера: Разработка Flash-проектов с использованием Apache Ant (доклад на семинаре New Media)!

Писал Rost, 28 Май 2006 21:02

Найдены баги:

Я смотрю ты нехило загнался автоматизацией и BPD (Build, Package, Deploy) :)

МК - 28 Май 2006 23:25

Ну, до Deploy еще далековато ;)

Рост - 29 Май 2006 0:10

Есть один побочный эффект у добавления номера версии. Это быстрорастущий кеш, который забивается разными версиями флешек, которые вытесняют другой закешированный контент (если размер кеша ограничен) и вам придется заново качать картинки с других сайтов, на которые вы иногда заходите.

Кроме того, для шареных флешек все равно версию прописать так не получится, а посему я приучил себя уже к более универсальном способу (при локальном тестировании): закрывать окно браузера, в которое загружена флешка и запускать заново после компиляции.

Собственно, ты сам мне про этот способ и рассказывал, если не ошибаюсь ;)

fix - 29 Май 2006 10:52

Можешь рассказать, зачем ты тут берешь debug-версию плеера?

...\Debug\SAFlashPlayer.exe

а не релиз?

Некий - 29 Май 2006 13:19

Мне она больше нравится дла тестирования, например, можно видеть реальную область перерисовки, выбрав соотв. опцию в правокликовом меню.

Вообще, тут никако догмы нет. Это туториал, задача кторого -- подказать читателю возможности инструмента.

Рост - 29 Май 2006 13:23

Фикс, про размер кэша давно не думаю.. наверное стоило бы ;)

Про шареные флэшки не говри мне.. это больно %)

Рост - 29 Май 2006 13:24

чото в ИЕ горизонтальный скролинг в 2 страницы при 1280*1024...

Колин Мук - 29 Май 2006 18:26

Колин, дорогой, спасибо тебе за глюкотчет! Пофиксил.

На сам деле это был очень специальный тест, чтобы узнать, кто из наших пользуется IE ;%)%;);)

Рост - 29 Май 2006 18:34

Кстати, насчет кэширования:

Я провел тест в Mozilla Firefox 1.5.0.3: много раз обновил страницу, в которой содержался swf-файл с каждый раз меняющимся адресом. Получил интересный рез-т.

Результаты тестирования:
Размер некешируемого SWF-файла -- 275 Кб.
Кол-во обновлений страницы -- 100 раз.
Размер кэша до тестирования -- 0.6 Мб.
Реальный размер кэша после тестирования -- 2.8 Мб.

Ожидаемый размер кэша после тестирования -- 28 Мб.

Что наводит меня на интересные размышления:
- Возможно, Firefox умеет определять, изменился ли контент в действительности, и, если это не так, не грузит новую версию?
- Возможно, он умеет грамотно жать кэш? (но SWF-файлы, как мы знаем, почти не жмутся!)

И еще одно. В Firefox есть встроенный просмотрщик кэша, причем весьма небедный.

Достаточно ввеcти в адресную строку: about:cache

Рост - 29 Май 2006 19:06

Ха, кажется, я немного ближе к разгадке!

Firefox просто не хранит в кэше предыдущие версии того же самого файла, вот как. Я понял это, исследовав вышеприведенный адрес about:cache (кстати, чтобы он сработал, жмите мо нему средней кнопой или вводите вручную): итак, я покопался в кэше файерфокса через его же встроенный браузер кэша и нашел только одну запись, соответствующую моему SWF файлу. Та запись гласит:

           Key: http://localhost/photrproject/bin/app.swf
Data size: 275316 bytes
Fetch count: 124
Last modified: 2006-05-29 18:51:39
Expires: 2006-05-29 18:52:26

Fetch count ("Количесвоо выборок") -- это реальное кол-во раз, сколько моя флэшара обновлялась. Итак, Firefox хранит только актуальные версии файла. Подсчитыва кол-в его обновлений и храня дату последнего обновления плюс дату истечения кэширования.

Я все больше восторгаюсь этим браузером!

Рост - 29 Май 2006 19:18

Я пользуюсь IE и меня это устраивает! Страшно? :)

constantiner - 30 Май 2006 9:04

Рост, спасибо за инфу про кеш в FF :)

Только я вот проверил - че-то у меня не выходит так шоколадно, как у тебя.

Загрузил один и тот же файл (абстрагируемся от реального адреса) 6 раз подряд:

http://mysite.com/myfile.swf
http://mysite.com/myfile.swf?1
http://mysite.com/myfile.swf?2
http://mysite.com/myfile.swf?3
http://mysite.com/myfile.swf?4
http://mysite.com/myfile.swf?5

Потом посмотрел кеш, как ты сказал (дисковый разумеется) - обнаружил там все эти файлы, у каждого fetch=1. Итого, место в кеше откушано 6 раз. Что-то тут не так..

fix - 30 Май 2006 10:31

Рост, перед публикацией своего предыдущего поста, я подумал: "A вдруг дело в том, что я иначе добавляю версию?" И попробовал сделать так как добавляешь версию ты. Так как результат был такой же (множество флешек в кеше), я не стал ничего менять и нажал на кнопку "Отправить".
Вероятно, у нас различаются настройки кеша или серверов, отдающих флешки. А может разные FF (1.0.4 у меня)

fix - 30 Май 2006 15:16

В URL лучше добавлять не номер бильда а текущее время в микросекундах.
Так оно надежнее если несколько раз дергаешь URL в процессе работы приложения.

tumikosha - 31 Март 2007 11:13



Это запись из категории 'Productivity'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-30, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-52, Books-7, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-30, Community-113, Components-19, Contests-28, Cool-Job-5, Debug-18, Design-26, Development-84, EMO-1, Events-13, Extensions-2, FAQ-8, FDS-1, Flash and html-5, Flash Player-35, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-30, Flex 2-80, Flickr-1, FMS-1, FPUG-46, frameworks-1, Games-11, Good Job!-35, HaXe-14, Health-2, Humor-10, Ideas-13, JavaScript-1, Job-26, JSFL-8, Links-2, Linux-1, Maps-1, Math-8, Money-11, MXML-1, Open Source-15, Optimization-2, Patterns-2, Personalities-27, Politics-1, Preloading-3, Productivity-9, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, Strategy-120, Tamarin-1, Tools-113, Training-2, Trash-8, URAFPUG-13, Urgent-1, Usability-6, Video-6, VoIP-5, Wallop-1, Wishlist-2, Архив всех записей (большой)

За последние месяцы:

Июл 2008: Международная встреча разработчиков URAFPUG завершена, URAFPUG - трансляция студии Flex-фреймворка Mate, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр

Мар 2008: Зарплаты программистов в 2007 году, FlashPhone как технология года? Технология года? В Рунете?, весь Мар

Фев 2008: ЙА ФПУГ — регистрация на первую встречу UAFPUG продолжается, Закулисы Flex и секрет успеха опенсорс-проекта, весь Фев





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)