Вчера вышел iBank 4.1. Из полезных для меня изменений в программу добавили новые типы отчётов. Я радостно добавил отчёт Expense Timeline, успел один раз восхититься, перешёл на другой отчёт, вернулся, и тут iBank завис. Намертво. До «Force Quit».

Повторно запустил программу — да, запомнился последний выбранный элемент, снова открылся этот отчёт и снова iBank завис. Я пытался переключиться на другой счёт или отчёт разными способами — результат нулевой.

Можно было восстановиться из бекапа за прошлый день, но сегодня я сводил баланс и сделал достаточно много изменений. Повторять это с самого начала — нет уж. Я попал в тупик.

Пришло время анализа данных программы. Я решил, что стоит найти файл, в котором сохраняется информация, какой счёт или отчёт открывать при старте, затем его поменять и этим реализовать обходной способ решения проблемы.

Для тестирования создал новую базу probe1, там сделал один счёт и один отчёт. Выбрал отчёт, вышел из iBank. Скопировал базу в probe2. Открыл probe2, выбрал счёт, вышел. Получил две идентичные базы, различающиеся только выбранным объектом, в probe2 выбран счёт, а в probe1 — отчёт.

Путь к последней открытой базе можно найти командой:

$ defaults read com.iggsoftware.iBank4 NSNavLastCurrentDirectory
~/Documents/Personal/Finances

Перехожу в ~/Documents/Personal/Finances, сравниваю базы:

$ diff -r probe1.ibank probe2.ibank
Binary files probe1.ibank/settings.data and probe2.ibank/settings.data differ

Какой формат у файла? Apple binary property list:

$ file probe1.ibank/settings.data
probe1.ibank/settings.data: Apple binary property list

Для поиска различий конвертирую в xml:

$ plutil -convert xml1 -o - probe1.ibank/settings.data > probe1.plist
$ plutil -convert xml1 -o - probe2.ibank/settings.data > probe2.plist

Сравниваю. Различий много, меня заинтересовало это:

$ diff -u probe1.plist probe2.plist
@@ -52,7 +52,7 @@
 			<key>sourceListSelectedItemId</key>
 			<dict>
 				<key>CF$UID</key>
-				<integer>9</integer>
+				<integer>0</integer>
 			</dict>

Предполагаю, что если в probe1 поменять sourceListSelectedItemId c 9 на 0, то вместо report выберется account.

Делаю резервную копию (!).

$ cd probe1
$ cp settings.data settings.data.dist

Можно использовать Property List Editor, добавив суффикс .plist, но я предпочитаю править xml вручную.

Конвертирую binary plist в xml

$ plutil -convert xml1 -o - settings.data > settings.data.plist

Открываю в редакторе, нахожу sourceListSelectedItemId и правлю значение 9 на 0:

$ vim settings.data.plist

Возвращаю в бинарный формат:

$ plutil -convert binary1 -o - settings.data.plist > settings.data

Запустил iBank, нужный счёт не выбрался, но эффект достигнут — злополучный отчёт уже не открывается при старте. Проблема не решена — отчёт я использовать не могу, однако могу продолжить работу с iBank и дождаться устранения.

Будьте осторожны с iBank и перед испытанием новых функций лучше сделайте резервную копию базы.