В лицензионном соглашении разработчика для Safari 5 черным по белому написано, что Apple в лучших традициях App Store будет контролировать процесс утверждения аддонов и, что самое главное, не предоставляет хостинг для пользовательских расширений. Поэтому, продолжая поднятую не так давно тему, я решил разобраться, каким образом можно заставить автоматически обновляться собственное расширение для Safari.

Первым делом, конечно же, я отправился почитать официальную справочную документацию, если быть более точным — раздел «Updating extensions». Из этого документа я узнал, что для обеспечения автоматического обновления расширения нам понадобится всего лишь два файла:

  • Собственно, сам файл расширения в запакованном формате. Его можно создать при помощи кнопки «Создать пакет…» в Конструкторе расширений. Полученный файл будет иметь расширение *.safariextz.
  • А второй — это манифест обновлений, который представляет собой обыкновенный plist-файл (property list, по сути дела — XML) определенной структуры.

Эта структура также представлена в Safari Extensions Development Guide, но не грех будет продублировать эту информацию здесь, переведя некоторые непонятные элементы на русский язык и дав соответствующие пояснения:

<?xml version=»1.0″ encoding=»UTF-8″?>
<!DOCTYPE plist PUBLIC «-//Apple//DTD PLIST 1.0//EN» «http://www.apple.com/DTDs/PropertyList-1.0.dtd»>
<plist version=»1.0″>
<dict>
<key>Extension Updates</key>
<array>
<dict>
<key>CFBundleIdentifier</key>
<string>Идентификатор пакета</string>
<key>Developer Identifier</key>
<string>ID сертификата разработчика</string>
<key>CFBundleVersion</key>
<string>Номер обновленной версии (версия пакета)</string>
<key>CFBundleShortVersionString</key>
<string>Номер отображаемой версии после обновления</string>
<key>URL</key>
<string>Адрес, по которому можно скачать расширение</string>
</dict>
</array>
</dict>
</plist>

Сразу скажу, что «Идентификатор пакета» нужно указывать именно тот, который использовался при создании расширения (com.название компании.название расширения).

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

Сохранить полученный файл можно, к примеру, под именем update.plist и загрузить его на веб-сервер, сохранив куда-нибудь ссылку, по которой можно скачать его. Основной нюанс заключается в том, что MIME-тип манифеста должен быть установлен в «text/xml», хотя некоторые пользователи пишут, что «plain/text» тоже обрабатывается нормально (а у меня не хотел распознаваться, хоть тресни!).

Далее, требуется в Конструкторе расширений указать ссылку на этот файл и заново загрузить аддон в Safari. На этом этапе я столкнулся как раз с некоторыми проблемами, которые в конце концов сами собой исчезли. Правда, во время экспериментов очень часто «падал» браузер.

В итоге, я все-таки добился того, что после отключения галочки «Устанавливать обновления автоматически» и повторного включения расширения, в специальном окне настроек Safari появилось уведомление о новой версии для моего расширения:

Нажимаем на кнопку «Установить» и видим, что расширение обновлено:

Хозяйке на заметку: прежде чем искать какие-то сверхъестественные причины неработающего обновления, проверьте несколько раз правильность набора ID сертификата и идентификатора пакета. Зачастую, это и будет причиной некорректной работы.

В завершение статьи, я хотел бы сказать, что в одном и том же манифесте можно указать данные обновления для нескольких расширений, для чего требуется скопировать секцию <dict />, расположенную между тэгами <array />.


Читайте также: