CocoaDev.ru
Блог о Cocoa разработке
Блог о Cocoa разработке
июля 24
Многие пользователи MacOS, которым приходилось работать в сетях с Windows-компьютерами, наверняка знают о привычке своих Mac’ов оставлять за собой следы после визита в какую-нибудь доступную по сети папку на машине под управлением Windows. Если обладатель PC включил в свойствах проводника опцию “отображать скрытые файлы”, папка, в которой побывал mac-юзер, будет украшена файлом .DS_Store.
По сути, в этом нет ничего страшного. В .DS_Store хранится в основном информация о том, как эта папка будет выглядеть в Finder у “гостя”: позиция окна, размеры иконок и т.д. Но ведь многих подобный мусор в расшаренных папках попросту раздражает.
Чтобы отучить свою систему мусорить в чужих сетевых ресурсах достаточно выполнить совершенно не сложную манипуляцию. Запустить Terminal и выполнить следующую команду:
$ defaults write com.apple.desktopservices DSDontWriteNetworkStores true
После перезапуска сеанса проблема будет решена, но… только для текущего аккаунта. Если есть необходимо сделать тоже самое для всех пользователей на вашем Мас’е – нужна другая команда:
$ cp Library/Prefrences/com.apple.desktopservices.plist \ /Library/Prefrences/. $ sudo chmod 777 /Library/Prefrences/com.apple.desktopservices.plist
Вот и все, после рестарта обновленный файл com.apple.desktopservices обеспечит чистоту в сетевых ресурсах и Windows-пользователи будут вам благодарны.
июля 24
Приветствую,
Такая вот кратенькая заметочка.
Столкнулся с проблемой, нужно было отключить кеширование удаленных картинок в полученных письмах для Apple Mail 2 Mac OS X Tiger. В 3-й версии все работает нормально, там кеширование оключается программным способом, а вот во 2-й не получается, в связи с тем, что вторая версия имеет баг. Отключить удалось при помощи ограничения прав доступа на папку кеша.
sudo chown -R root:wheel ~/Library/Caches/Mail sudo chmod -R 700 ~/Library/Caches/Mail
Таким образом программа не будет иметь доступ к папке хранения кеша и не будет хранить или читать картинки из нее.
Кстати, есть еще один злой баг.
Если письмо является документом HTML с хедером и футером, то несмотря на установленную опцию в настройках, что не нужно отображать удаленные картинки и на то, что письмо есть спам, картинки в хедере и футере отображаются в любом случае.
июля 24
Недавно мой заказчик заказал мне написать плугин (bundle) для Apple Mail и Safari. Данный плугин должен был отслеживать прибытие новой почты в Apple Mail, открытие письма, получение события о том, что письмо успешно отрисовалось в форме и снятие snapshot (картинки) полного контента письма.
Я не буду описывать разработку самого плугина в этой статье, опишу это в другой. Вопрос написания плугина довольно сложен. Данная область является недокументированной со стороны Apple!!! Приходилось учиться на примерах :)
Итак, для отображения письма Apple Mail, как и Safari для контента страницы, использует многоуровневый компонент WebView. Задача, сделать изображение ПОЛНОГО контента письма. Я испробовал много методов, но все они приводили к тому, что картинка снималась только с видимой части контрола + скролбары. Это не входило в мои планы. Ссылки команды Apple и многих девелоперов не давали решения. Долгие поиски (две недели!!!) были вознаграждены. Ошибкой оказался выбор дочернего контрола для WebView. Итак, мое решение:
Итак, первое что мы делаем, подписываемся на нотификацию, которая говорит о том, что рендеринг страницы прошел успешно и полностью (это же касается и Safari)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewLoadFinished:) name:WebViewProgressFinishedNotification object:nil];
WebViewProgressFinishedNotification – это глобальная константа фреймворка, содержащая имя нотификации о том, что страница загружена.
Далее, пишем обработчик данной нотификации:
- (void)webViewLoadFinished:(NSNotification *)notification
{
// получаем ссылку на WebView. Она приходит в нотификации
WebView * webView = (WebView *)[notification object];
// а вот самое главное. картинку нужно снимать не с контрола, а с главного фрейма контрола, именно в нем происходит рендеринг страницы в полном маштабе.
WebFrame * frame = [webView mainFrame];
// получаем ссылку на контрол, содержащий этот фрейм.
WebFrameView * view = [frame frameView];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// подготавливаем репозитарий для хранения картинки, он будет получать картинку путем кеширования содержимого как изображение.
NSBitmapImageRep *imageRep = [[view documentView]
bitmapImageRepForCachingDisplayInRect:[[view documentView] frame]];
// собственно кеширование, теперь картинка в хранилище, в виде bitmap.
[[view documentView] cacheDisplayInRect:[[view documentView] frame] toBitmapImageRep:imageRep];
// перебрасываем нашу картинку в экземпляр класса NSImage
NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(1280, 1024)];
[image addRepresentation:imageRep];
// преобразуем картинку в набор байтов, используя JPEG компрессию, типов компрессий есть много, но я выбрал именно эту.
NSData * imageData = [image TIFFRepresentationUsingCompression:NSTIFFCompressionJPEG factor:0.0];
[pool release];
}
Вот и все, теперь у нас есть картинка JPEG формата полного контента страницы и мы можем делать с ней что хотим, например сохранить на диск:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES); NSString *downloadDirectory = [paths objectAtIndex:0]; srand([[NSDate date] timeIntervalSince1970]); long ext = rand(); NSString * path = [NSString stringWithFormat:@"%@/images/%@%i%@", downloadDirectory, @"web", ext, @".jpg"]; [imageData writeToFile:path atomically:YES];