Pull to refresh

Лечим перевод времени на джейлбрейкнутой ios 4.x

Reading time 2 min
Views 4.7K
Как известно и тучей топиков упомянуто, вчера случился маленький y2k. Владельцам официальных девайсов беспокоиться особо не о чем — апдейты на то и апдейты.
Но что делать счастливым обладателям заморских трубок, для которых слова (untethered jailbreak) и разлочка(unlock) — не просто слова?
На самом деле не так уж и много — нужно обновить tzdata непосредственно в системе и в ICU.

Предупреждение: то, что вы делаете со своим девайсом, вы делаете на свой страх и риск.

Как обновить сами таблицы таймзон, что это такое и откуда брать — уже написано в этом топике, так что далее считаем, что на девайсе есть ssh и уже было успешно сказано нечто вроде:
wget -O - www.mafet.ru/zoneinfo_2011k.tgz | tar xzf - -C /

Однако напрямую с tzdata работают только UNIX-утилиты, а красивости SpringBoard(именно этот сервис отвечает за отрисовку часов) используют ICU — International Components for Unicode (международные компоненты юникода) для конвертации времени. Причем для независимости, в этот пакет входит своя копия tzdata в немного другом формате. Именно из-за этого дублирования данных многим показалось, что обновление таймзон не сработало — date выводила правильное время, а часы по-прежнему показывали по-старому.

Данные icu лежат в традиционном /usr/share/icu/icudt46l.dat (по имени файла — в iOS 4.3.3 используется icu 4.6 под архитектуру little endian). Над ним и будем колдовать, предварительно утащив на комп:
scp root@тут.ип.вашего.телефона:/usr/share/icu/icudt46l.dat ~
(предполагается наличие рабочих и не спящих wifi и sshd на телефоне)

Далее нам потребуется пакет icu4c, который можно взять на сайте icu-project и обновления таймзон в виде 4 файлов отсюда.

Кладем в контейнер новые версии тайм-зон:
cd ~
icupkg -a zoneinfo64.res icudt46l.dat
icupkg -a metaZones.res icudt46l.dat
icupkg -a timezoneTypes.res icudt46l.dat
icupkg -a windowsZones.res icudt46l.dat

и пропатченный файл обратно на телефон:
scp icudt46l.dat root@тут.ип.вашего.телефона:/usr/share/icu/icudt46l.dat.new

Финишная прямая — осталось только подменить icu. Предварительно стоит перезагрузить телефон, чтобы в памяти не было загруженных приложений.
ssh root@ваш_телефон
cd /usr/share/icu/
launchctl stop com.apple.SpringBoard
mv icudt46l.dat icudt46l.dat.bak
mv icudt46l.dat.new icudt46l.dat
launchctl stop com.apple.SpringBoard

Желательно не разрывать ssh-сессию пока вы не убедитесь, что SpringBoard жив после этой манипуляции, чтобы иметь возможность поменять файл обратно. У автора система приняла подмену только со второй попытки.

Проверено на iPhone4 с iOS 4.3.3 (самая свежая с непривязанным джейлбрейком на текущий момент), теоритически метод подойдет и к другим версиям системы, с точностью до версии ICU и налагаемого патча (которые лежат рядом)

UPD: Для ios 4.3.3 получился вот такой icudt46l.dat, в теории эта же версия должна использоваться в свежем Lion
Для ios 3 говорят подходит icudt40l.dat от snow leopard,
Для ios 4.1 — icudt44l.dat
Tags:
Hubs:
+6
Comments 36
Comments Comments 36

Articles