Apple Mail autocompletion fix

Опублікував Сергій Макаренко 23-08-2013 об 10:11

Є в Mail корисна функція — автозаповнення рядка адресата. Ви починаєте писати електрону адресу, а ця штука порівнює назву або з вмістом вбудованого записника в OS X (якщо, звісно, там є контакти), або шукає в адресах, з яких ви раніше вже отримували листи. Так от, кілька місяців тому, після чергового оновлення OS X ця корисна функція зламалася. Шкода, але руки до вчорашнього дня не доходили до комп'ютера, щоб її полагодити. Якщо бути точніше, не доходили вони частково через те, що я не дуже розумів куди копати.

А частково, через те, що нічого підозрілого і такого, щоб дозволяло зрозуміти, через що зламалося автодоповнення я в Console не побачив. Але вчора якось було натхнення. Потягуючи віскі після важкого робочого дня я знову вирішив повернутися до вирішення цього питання. До речі, після невеликої дози алкоголю мені згадався жарт про Пік Балмера. {% emoji blush %} Але перейдемо до справи. Я відкрив шаблон нового листа та почав ґвалтувати поле отримувача в надії на те, що Mai що виплюне в логи і я зможу хоч за щось вхопитися.

Мені пощастило. Я побачив в Console ось таке:

22.08.13 22:59:34,861 Mail[206]: *** Assertion failure in -[CompletionController _beginAutocompletionSearchesForString:], /SourceCache/Mail/Mail-
1508/Mail/Compose/Headers/CompletionController.m:1251
+[ABAddressBook emptyMemoryBackedAddressBook] failed to return an address book
(
    0   CoreMessage                         0x00007fff81978517 -[MFAssertionHandler _handleFailureWithPreamble:description:arguments:] + 141
    1   CoreMessage                         0x00007fff81978388 -[MFAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 215
    2   Mail                                0x0000000105ddecea Mail + 1068266
    3   Mail                                0x0000000105ddeb4c Mail + 1067852
    4   Foundation                          0x00007fff8a74bd05 __NSFireDelayedPerform + 358
    5   CoreFoundation                      0x00007fff839f9804 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
    6   CoreFoundation                      0x00007fff839f931d __CFRunLoopDoTimer + 557
    7   CoreFoundation                      0x00007fff839dead9 __CFRunLoopRun + 1529
    8   CoreFoundation                      0x00007fff839de0e2 CFRunLoopRunSpecific + 290
    9   HIToolbox                           0x00007fff87866eb4 RunCurrentEventLoopInMode + 209
    10  HIToolbox                           0x00007fff87866c52 ReceiveNextEventCommon + 356
    11  HIToolbox                           0x00007fff87866ae3 BlockUntilNextEventMatchingListInMode + 62
    12  AppKit                              0x00007fff8c0ad533 _DPSNextEvent + 685
    13  AppKit                              0x00007fff8c0acdf2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
    14  AppKit                              0x00007fff8c0a41a3 -[NSApplication run] + 517
    15  AppKit                              0x00007fff8c048bd6 NSApplicationMain + 869
    16  libdyld.dylib                       0x00007fff840607e1 start + 0
    17  ???                                 0x0000000000000002 0x0 + 2
)

Не дуже інформативно, проте хоч щось. Було ясно, що проблема виникли через те, що зламався авдоповнювач саме в Mail.app і проблем з AddressBook немає ніяких. Але що робити з цим знанням я до кінця не розумів. Подумавши логічно я дійшов наступного: оскільки в цілому Mail.app працювала нормально, то проблема могла бути пов'язана з якимось кешем або файлами, які Mail.app створювала під час роботи. Не дуже тривале дослідження показало, що Mail.app — це програма, що працює в пісочниці. А тому всі теки, в яких могли зберігатися дані програми вили за псевдонімами до одного місця ~/Library/Containers/com.apple.mail.

Рецепт для лікування проблеми виявився доволі простим. Для того, щоб функція автозаповнення запрацювала знову вам достатньо видалити теку com.apple.mail. Звичайно, що перед видаленням потрібно закрити Mail.app. Після повторного запуску програма перебудує видалену теку в пісочниці і функція автодоповнення працюватиме знову. Не забуваємо, що перед початком потрібно про всяк випадок зробити резервну копію теки com.apple.mail.