В iOS 5 изменился формат MapTiles.sqlitedb – базы данных, в которой хранится кэш карты. Чтобы перекодировать базу данных в новый формат, старые конвертеры не годятся, а новых в интернете нет. Поэтому затея с изготовлением оффлайн-карты для iOS 5 бессмысленна.
Заранее нужный кэш изготовить не получится, и по достижении размера примерно 20 Mb старые тайлы карты будут затираться новыми.
Nick Adams предлагает решение, как кэш карт защитить от стирания. Это не решает проблему с изготовлением нужной карты заранее, зато позволяет сэкономить трафик при просмотре уже кэшированной ранее области карты.
В базе данных создаётся триггер (переключатель), суть работы которого состоит в том, чтобы обнулить выборку строк базы данных, предназначенных для удаления. То есть приложение „Карты“ будет, как всегда, выполнять транзакцию по удалению старых строчек, но по ходу дела выборка окажется нулевой, и из базы ничего не удалится.
Чтобы выполнить эту хитрую операцию, нужно выгрузить из телефона кэш карты, который хранится там по адресу:
/var/mobile/Library/Caches/Maps/MapTiles/MapTiles.sqlitedb
можно воспользоваться DiskAid или другим файловым менеджером, который умеет подсоединяться к айфону.
После этого следует открыть файл базы данных в каком-нибудь приложении, поддерживающем формат SQLite. Я воспользовался SQLite Manager (есть и для Windows, и для OS X).
Здесь создаём новый триггер, который защитит базу данных кэша карт от затирания:
CREATE TRIGGER prevent_delete BEFORE DELETE ON image
BEGIN SELECT raise(IGNORE);
END


Для этого открываем раздел “Triggers” и создаём новый переключатель, щёлкая по плюсику внизу окна:

Создание триггера, запрещающего стирание базы данных, в SQLiteManager
Заполняем поля согласно форме SQL-выражения, и новый триггер готов.
Теперь нужно убедиться, что приложение „Карты“ на айфоне не открыто и не находится в списке фоновых задач, и заменить старый файл MapTiles.sqlitedb новым файлом с созданным триггером.
Всё готово, теперь просматриваемые фрагменты карты не удаляются:

Размер файла базы данных кэша карт iOS
Если у вас нет уверенности в правильности своих действий, можно начать с этого файла: MapTiles.sqlitedb (SQLite, 33 Kb)
или же скачать файл кэша с картой Санкт-Петербурга: MapTiles.sqlitedb.zip (ZIP-архив, 469 Mb, iPhone 4/4S).
P.S. Естественно, подразумевается, что у вас iPhone/iPad был подвергнут джейлбрейку.
P.P.S. Можно пользоваться отличной функцией бесплатных Яндекс.Карт – загрузкой оффлайн-карты, но это работает только для некоторых российских городов, да и не всегда карты в Яндексе лучше.

Подпись к карте

4 thoughts on “Защита кэша карт от очистки — решение проблемы оффлайн-карты в iOS 5”

Добавить комментарий