Safari умеет отображать картинки формата .ico, а вот AdobeAIR не умеет, хоть и оба используют WebKIT. Очень досадно, когда хочется около ссылки на сайт отобразить его favicon, а сделать этого не получается.
Решение нашел, хоть и не идеальное. Решил использовать сервис для получения favicon с сайта в png, получать оттуда ответ и кешировать его у себя локально.
Для загрузки изображений мы будем использовать air.URLLoader.
Получилась такая функция:
В первый раз мы не отобразим иконку, зато начнем ее качать. При вызове функции в следующий раз иконка возьмется из локального кеша (если уже успела скачаться). Почему не сразу? — чтобы не тормозить выполнение скрипта ожиданием.
Очистка кеша иконок можно сделать примерно такой функцией:
Недостатки такого решения:
Если у кого-то есть предложения по совершенствованию функции, пишите, я буду рад любым комментариям.
Кросспост из личного блога.
Решение нашел, хоть и не идеальное. Решил использовать сервис для получения favicon с сайта в png, получать оттуда ответ и кешировать его у себя локально.
Для загрузки изображений мы будем использовать air.URLLoader.
Получилась такая функция:
function getFavicon( url ) {
// тут мы из строки с url вытаскиваем только нужную нам часть - название домена
var domain = id.match(/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/i);
if (domain != null) {
var domname = domain[2];
// проверяем, есть ли у нас в кеше уже такая иконка
var file = air.File.applicationStorageDirectory.resolvePath("favicons/" + domname + '.png');
if ( file.exists )
// и, если есть, возвращаем ссылку на нее
return file.url;
// а вот если нет, шлем запрос на sectorprime
var fav = "http://www.sectorprime.com/cgi-bin/fav2png.pl?fav=" + domname;
air.trace('загружаем favicon ' + domname);
var request = new air.URLRequest(fav);
var loader = new air.URLLoader</a>();
// важно! получать данные будем в бинарном виде
loader.dataFormat = air.URLLoaderDataFormat.BINARY;
loader.addEventListener(air.Event.COMPLETE, function( e ) {
// эта функция отработается сразу после того, как мы получим ответ на запрос
var loader = e.target;
// создаем поток для записи в файл
var fileStream = new air.FileStream();
fileStream.open(file, air.FileMode.WRITE);
// и записываем в него все, что получили
fileStream.writeBytes(loader.data);
fileStream.close();
} );
// собственно, запускаем процесс загрузки
loader.load(request);
}
// а вот эта иконка будет выдаваться у нас по-умолчанию
return "/images/icon_item.png";
}В первый раз мы не отобразим иконку, зато начнем ее качать. При вызове функции в следующий раз иконка возьмется из локального кеша (если уже успела скачаться). Почему не сразу? — чтобы не тормозить выполнение скрипта ожиданием.
Очистка кеша иконок можно сделать примерно такой функцией:
var favdir = air.File.applicationStorageDirectory.resolvePath("favicons");
// выясняем, существует ли такая папка вообще
if ( ( favdir.exists ) && ( favdir.isDirectory ) )
// если существует, то удаляем папку вместе с содержимым
favdir.deleteDirectory(true);Недостатки такого решения:
- Иконка выдается не сразу;
- Сервис выдает какую-то левую стрелку для тех сайтов, у которых недоступна favicon.
Если у кого-то есть предложения по совершенствованию функции, пишите, я буду рад любым комментариям.
Кросспост из личного блога.