вторник, 29 декабря 2009 г.

Автоматическое обновление и вечный косяк

Большинство современного софта вполне умеет обновлять самое себя через Интернет. Как сделать такое обновление вопрос широких дискуссий. Может быть это будет как в The Bat – просто проверка новой версии на сайте, может как в Google Chrome – скачивание и полностью автоматическая установка новой версии в фоновом режиме. В общем, кто во что горазд.

Но неизменно одно – софтина для обновления обязательно должна выйти в сеть. Без этого никуда. И сколько я перепробовал софта – у всех до единого один и тот же косяк. Если Ваш IE выставлен по умолчанию в offline режим, то софт не может выйти в сеть, и соответственно не может ничего обновить. И не важно из чего это самое “ничего” состоит: из репорта о доступности новой версии, или же это полная установка в фоновом режиме. Обновление не работает и всё тут, самый такой натуральный ППЦФ (“пипец фиче” – фича есть, фича могет, фича модная – только ни хира не работает).

И вот в этом случае, вот совершенно не нужно кивать что мол “только у тебя Гоха IE в вечном оффлайне” (© Arsen). Да мне пофиг! У меня есть свои причины в оффлайне его держать – и причины очень весомые. И тем не менее, несмотря на никакой оффлайновый режим IE, обновление в моей Aml Pages всегда работает.

Поскольку уже подзаколебало писать репорты коллегам – причем коллегам мною весьма уважаемым – про подобные траблы с обновлением, попробую-ка рассказать, как я решал эту проблему в Aml Pages. Опять же да здрям повторное использование кода – будет на что сослаться :), а не кропать заново.

Вкратце: в Aml Pages все обновление сводится к скачке файла с инфой о новых версиях. Дальше уже все на усмотрение пользователя – ставить или нет, посмотреть список изменений и.т.д. Ну да не в этом суть – файл с инфой скачать придется по любому, и обойти оффлайновый режим IE надо.

Оговорю сразу. Существует два вида проверки новой версии: автоматическая по прошествии сколько-то там дней, или ручная, явно запущенная пользователем из команды меню.

Автоматическая проверка сама следит пора ли проверять, сама же автоматически стартует, и всю работу выполняет в фоновом режиме. В фоновом означает, что пользователь вообще никак не участвует в этом процессе – все происходит исключительно на автомате. Отсюда вытекает следующий вывод: в процессе проверки вовсе не нужно хоть как-то привлекать внимание пользователя. В автоматической проверке ни к чему всякие диалоги да подтверждения.

Всё просто: автоматическая проверка пользователю нужна собственно только для одного – известить его, когда станет доступной новая версия. Во всех остальных случаях не нужно ничего сообщать пользователю: прошло ли соединение, нет новых версий и.т.д.

Можно сказать и кратче: есть новая версия? ОК – нужно об этом сказать пользователю. Нет новой версии, нет соединения, поврежден скачанный файл с информацией – все эти подробности ни на хер не нужны. Представьте, сидит себе пользователь, делает что-то свое и вдруг откуда ни возьмись на тебе репорты: “Нет соединения”, “Новых версий не обнаружено”. Да зачем ему вся эта инфа как черт из табакерки – нет и и нет, и нечего пользователя беспокоить.

Автоматическая проверка нужна только для одного: появилась новая версия – скажи, нет новой версии (и не важно по какой причине) - дык и не трахай мне мозг не беспокой меня.

Ручная проверка: это совсем другое дело, это проверка запущенная пользователем из меню ручками. В этом случае пользователь нашел время и желание проверить, и как раз в этом случае нужен не только отклик, но и какое-то протоколирование процесса обновления. Пользователю нужно показать результат проверки: удалось ли подключиться к сети, удалось ли скачать файл, какая версия софтины стоит у пользователя, и какая на сайте, где посмотреть список изменений.

И опять все просто до неприличия: раз пользователь сам запустил проверку новой версии, он явно желает увидеть результат своих действий. И вот тут, коллеги, ну не на фиг не нужно показывать информацию вида “не шмагла падключица к сети”. Тем более, что софт может и сам проверить в каком режиме находится IE – в оффлайн или в онлайн. Т.к. если в оффлайн, то эту проблему софт может и сам решить самостоятельно.

Элементарно, Ватсон! Делается это просто – всего лишь единственным вызовом API-функции InternetGoOnline!

    BOOL InternetGoOnline (LPCTSTR lpszURL, HWND hwndParent, DWORD dwReserved)

В первом параметре нужно передать URL, по которому собрались обновляться. Второй параметр это HWND окна нашей софтины, он понадобится для сообщений. Третий параметр MS зарезервировала на будущее. Если есть подключение к сети – функция сразу вернет TRUE, в противном случае – FALSE.
Работает эта достославная функция следующим образом:

  • Если подключение к сети уже есть, она сразу вернет TRUE, причем безо всяких подтверждений. В этом случае можно быть уверенным, что IE уже в онлайн-режиме и начинать коннектиться к сайту.
  • Если подключения нет, то функция выдаст MessageBox “не желаете ли подключиться”. Именно для этого и нужен второй параметр с HWND нашего окна. Если пользователь согласится, то функция выполнит подключение и вернет TRUE. Если пользователь откажется – вернет FALSE.

В автоматической проверке вызовом InternetGoOnline, конечно же, грешить не стоит. Еще чего не хватало, чтобы исключительно вспомогательные и фоновые задания доставали пользователя запросами. Не удалось подключиться, и хрен с ним ладно. Совсем другое дело проверка, запущенная пользователем ручками. В этом случае пользователь принял решение сам, в этот момент его внимание по любому приковано к проверке, и он точно ожидает какого-то отклика. Вот в таком случае, имеет смысл и позвать InternetGoOnline – возможные MessageBox ну никак не смутят пользователя, он все равно ждет ответной реакции от софта. Дык почему б и не спросить, если известно что проблема “на этой стороне”? Это точно лучше, чем сказать невразумительное “ошибка соединения”, тем более что эта “ошибка” решаема здесь и сейчас.

Блин, сколько видел вполне толкового софта – все до единого на этом спотыкаются. И HippoEdit, и LeaderTask и многие другие. Долой непонятки – тем более что их решение, это всего две строки кода.

Вместо дисклаймера: мысль, о том что IE в оффлайн у очень немногих -  совсем не катит. Отмазы это для начальства, а не для пользователей.
Проблема тут вовсе не в дилемме “оффлайн vs онлайн” самой по себе – проблема тут исключительно в последствиях. Почему так, разговор длинный. Но если в двух словах: у кого IE запросто может быть в оффлайне-режиме? Да у гиков! А лично вам нужно чтобы именно гики не могли скачать новейшие апдейты?

PS: именно такой способ обновления и реализован в Aml Pages уже больше года назад. Пользователи довольны, обновляются с завидной регулярностью, ни малейших нареканий не возникало.

3 комментария:

  1. Честно говоря нифига не понял, оффлайновый режим это автономный, что ли?

    ОтветитьУдалить
  2. Угу, именно "автономный" в русской версии IE - в общем тот самый, который устанавливается через IWebBrowser2::Offline().

    ОтветитьУдалить