Пересаживаемся с Growl на Notification Center

Введение

С выходом MacOSX 10.8 общественности был представлен Notification Center, он же «Центр Уведомлений». Как только вам приходит новая почта или, к примеру, заканчивается закачка в Safari, то вы видите в правом верхнем углу всплывающее окошко с уведомлением, об этом сообщающим. Так же по свайпу двумя пальцами влево (или по хоткею) можно обнажить панель нотификаций, почти идентичную онной в iOS.

Проблема

Все было бы хорошо, да только есть одно но: еще с 2004го года все приложения используют для целей уведомления пользователя опенсурсный Growl и не спешат переходить на новую систему. В частности Skype, Adium, Transmission и многие многие другие приложения повседневного пользования.

Решение?

Hiss — одно из самых первых решений, появившихся в сети. И последнее. Hiss ловит нотификации вместо гроула и отправляет их от его имени в Notification Center, в результате чего получается не самая приятная картина:image
Как видно на скриншоте, результат не похож на ожидаемый. Так же, нет индивидуальных настроек для приложений. Вариант рабочий, но не удобный.

Решение получше

Этим летом я решил исправить положение и, не найдя каких-бы то ни было решений проблемы в интернете, кроме обещаний выпустить growl2, приступил к написанию CentralNotifier.

Что это?

Central Notifier — это маленькое приложение, которое инжектируется с помощью SIMBL во все, что движется в системе (подобно maximizer, добавляющему lion's fullscreen во все приложения, в которые возможно). Если приложение поддерживает growl, то после инжектирования все нотификации, предназначенные для growl, будут отправляться в Notification Center. В итоге имеем вот такую картину:image
А так же настройки для приложений:image

И в чем подвох?

Работать оно работает, но находится на ранней стадии разработки. У меня больше нет времени заниматься этим проектом, да и с текущими багами я прижился. Уже месяц работает без нареканий, решил поделиться с общественностью и буду очень рад, если кто-то возьмет проект под свое крыло.

Установка

1) Устанавливаем SIMBL
2) Скачиваем и распаковываем cl.ly/2l0O2w1m3v3H
3) CentralNotifier.bundle -> ~/Library/Application Support/SIMBL/Plugins/
4) SIMBL.osax -> /Library/ScriptingAdditions *
5) DoubleClick CentralNotifier-PrefPane.prefPane
6) Перезагрузка без галочки о сохранении состояния приложений
* — это измененный инжектор (что нарушает просьбу автора о переименовывании его детища при любых изменениях). Если вы хотите инжектироваться в приложения, не имеющие иконки в доке — вам он нужен. Нет — все работает и с обычным SIMBL. По любым проблемам с измененным инжектором просьба не обращаться к автору SIMBL

Исходники

Исходники лежат на GitHub. Делайте с ними что хотите, с сохранением оригинального авторства за мной.

Известные баги

1) После перезагрузки иногда приходится перезапускать все приложения, чтобы произошло инжектирование. Происходит это потому, что инжектор стартует позже самих приложений. Прекрасный пример на скриншоте ниже. Каждая перезагрузка начинается с killall HardwareGrowler.
2) Чтобы применить настройки к нотификациям приложений, нужно их изменить в prefpane, выйти из нее и затем перезапустить само приложение.
3) Кнопка Forget Application получается для красоты. Для удаления приложения нужно ручками править плист в ~/Library/Preferences
4) Если приложение было выключено после отправки нотификаций, то эти нотификации более не тыкабельны (тот, кто за них отвечает, более не существует)
5) Больше за месяц косяков не замечено.

А может подождать growl2?

Мое личное мнение: Или они сделают, как Hiss, или их не пустят в AppStore. Чтобы постить нотификации от лица другого приложения — надо либо инжектироваться в него (об appstore сразу можно забыть), либо делать магическое кунфу (шанс с которым пройти в тот-же appstore очень мал). Я думаю, что было бы хорошо продолжить разработку CentralGrowler, тк больше вариантов перенаправления нотификаций я не вижу.

Надеюсь, что мои наработки комунибудь да пригодятся!

PS

Забыл упомянуть в статье, и решил добавить сюда, в самый низ. CentralNotifier полностью переносит обратную связь: если ткнуть в нотификацию, то приложение отреагирует так-же, если бы все работало через Growl.
Еще немного скриншотов


AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 75

    +2
    Я думаю что скорее эти Skype, Adium и Transmission сделают нормальную поддержку центра уведомлений чем growl сделает такое.
    Тем более что последние два — опенсорс, потенциально можно поучаствовать :)
      0
      Совершенно согласен. Благодаря тому, кстати, что последние оказались опенсурсными, мне и удалось написать эту штуку, изучая то, как именно дергается гроул в этих приложениях.
      Но покуда поддержки нет… :-)
        0
        Transmission же отправляет сообщения в центр
          0
          Если это обновление вышло менее месяца назад — то я его не приметил. Когда я начинал разработку в исходниках Transmission еще о NC не было ни строчки, и, соответственно, у меня центр был пуст. Но я смотрел stable ветку. Сейчас (проверил) нотификации Transmission v2.61 у меня идут через мой плагин, а не на прямую.
            0
            хм. у меня такой поддержки не наблюдается, и вроде бы последняя версия установлена. Поискал — есть ветки в соотв. багтреках (и про одну, и про вторую), в которых ведется обсуждение NC, причем достаточно давно. Может быть это есть в бета-версиях? Т.к. насколько я помню, ограничения на использование локальных уведомлений только программами с AppStore нет (есть только на push-уведомления).
              0
              Скорее всего да, это nightbuild'ы, так называемые. Я туда не суюсь. :)
              Локальные и push — это штука есть только в iOS. На MacOSX все уведомления только локальные. Пока. Я не помню в документации (которая, на мое удивление, весьма скудна была месяц назад) о push не было ни слова.
                0
                Есть, есть :) На WWDC еще были по-моему какие-то полезности…
                  0
                  В любом случае — подход хороший, будем пробовать ставить, спасибо!
                    0
                    Ааа. Так это же не имеет никакого отношения к NC! :) Прочитайте исходник. У Apple тут случилась беда с терминологией. :)
              +1
              Последняя бета Adium уже использует NC при отсутствии Growl, проверено лично, все работает.
                0
                Поддерживаю.
                А вот скайп что-то не хочет пока, увы.
                  0
                  Ага. 1.5.3 (stable) тоже. Удивительно. Правда, прям в танке живу.
                  С другой стороны, мой способ позволяет указать, какие нотификации нужны, какие нет, а какие прятать. (Например, если бы нотификации Connected сохранялись в NC — мне бы это очень не нравилось :) )
                0
                Неоднократно увидел в статье новое для меня слово — «инжектор». Можно по подробнее, пожалуйста?:)
                  +1
                  Code Injections (wiki) и в частности о SIMBL(wiki)
                  Кратко говоря это инструмент, позволяющий выполнять код внутри чужого процесса. В частности у меня инжектор используется для того, чтобы выполнить подмену методов, отвечающих за общение с Growl.
                    0
                    Понял. Спасибо!
                  0
                  Можно немного потерпеть, и не ставить SIMBL — Growl 2 должен быть уже на подходе.
                    0
                    Я сам жду Growl 2. Но есть основания полагать, что они не сделают «каждому приложению — своя панелька и настройки в NC». Т.е будет выглядить так-же, как это выглядит у Hiss.
                      0
                      Нет, там фреймворк будет спрашивать у «демона» – куда слать, ему или в NC. И если в NC – то он же сам и перешлет.
                        0
                        Вы правы, так в действительности и оказалось :)
                    0
                    У меня сейчас слипаются глаза, и чего-то, может, я не понимаю, но возник такой вопрос: зачем надо делать прокси-сервис между Гроулом и Центром уведомлений, если это так непросто? Гроул – опенсорсный, разве нельзя взять и переделать его отображение так, чтобы уведомления уходили в центр уведомлений? У них исходники, конечно, так себе (Growl.app я так и не смог собрать, а вот HardwareGrowler собрал и даже локализовал) – если подозрение, что намеренно код подпорчен, чтобы каждый не собирал себе, продавать ведь в АппСторе тоже надо… То есть идея в создании модифицированного Гроула, который бы ставился вместо «родного».
                    Сам пока сижу на старом гроуле (который в системных настройках) + Hiss. Больше всего неудобств доставляет то, что по уведомлению нельзя быстро перейти к приложению.
                      0
                      Не знаю, зачем делать проксю. Я и не делал. Мой плагин полностью заменяет код, предназначенный для работы с гроул, на код, для работы с NC, в самих приложениях. Он не весит отдельным процессом и ничего на себя не берет, в отличии от Hiss :). Наличие гроула не требуется (однако если его нет, то, например, скайп спешит сбросить его из настроек при перезапуске).

                      А переписывание самого гроула приведет к тому же, что нам показывает Hiss (это изза специфики работы NC). Тут два варианта — или хакать NC и Гроул (оба сразу. Мало того, что первый не задокументирован как полагается, так еще и закрыт, и лежит в одном из толстенных фреймворков, откуда его дампить крайне не приятно), или приложения. Я пошел по второму пути. В результате нотификации отправляются напрямую NC, без посредников. Ну и соответственно по тыку происходит переход, если он должен был произойти.
                        0
                        т.е. имеется практически готовый патч для adium и transmission!!! А нет желания попросту выслать код разработчикам?
                          0
                          Это не тянет на полноценный патч, это скорее универсальный костыль. И код «патчится» во время рантайма. (Т.е оригинальный код успевает выполниться, и приложение успевает зарегистрироваться в гроул, и даже может отправить туда нотиф). Код почти тривиальный и для разработчиков пользы не несет :)
                            0
                            Не совсем понимаю. Если это не прокси, а замена Гроула и работает даже без самого гроула, то зачем нужны инжекты и SIMBL, как приложения регистрируются в гроуле (при его отсутствии), почему они не регистрируются сразу в CN, раз он заменяет гроул?
                              0
                              Ну тык приложения же нужно *заставить* делать нужное, как-то. Это же какой-то код, и он где-то должен исполнятся. В нашем случае код работы с NC *вставляется* в приложения. Регистрация с гроулом была написана самими разработчиками приложения (очевидно :) ), и она полезна тем, что предоставляет список типов нотификаций (тот самый список, который видно в настройках CentralNotifier у приложений).
                              Регистрироваться в Notification Center не нужно (там, на момент 13.08.12) не было никакой регистрации. Приложение просто шлет нотификацию, а NotificationCenter сам догадывается, кто и что ему прислал. Регистрация с гроулом (какбы регистрация, на самом же деле гроул, например, выключен) позволяет получить этот список, о котором говорил выше, и получить чуть больше контроля над нотификациями.

                              Думаю самый быстрый способ понять, как это работает, это скачать исходник и посмотреть: кода, как впрочем и коментариев, там мало, и все достаточно прозрачно выглядит :)
                                0
                                В каждом приложении, которое умеет слать уведомления в Growl, есть гроуловый фреймворк, в котором бинарник гроула на 96кб. Что внутри, не знаю, но кажется, это готовый модуль для отправки уведомлений в гроул. То есть приложения сами шлют сообщения гроулу, а он их показывает. Почему нельзя сделать модифицированные гроул, который принимаемые сообщения просто пересылал бы дальше в системный NC?
                                Зачем что-то внедрять в приложение, если оно уже внедрено?
                                Я реально пока просто не понимаю, каким образом происходит обмен собщениями — гроул сам опрашивает зарегистрированные приложения, или приложения каким-то образом уведомляют гроул. В исходниках копаться сложно, так как от objC кружится голова ))
                                  0
                                  Модифицировать сам гроул нельзя, потому что он у всех разных версий, а у кого-то вообще жестко залинкован в бинарник (да, есть и такие). Более того, патчевание (есть такое слово?) бинарника приведет к потере подписи кода, из-за чего KeyChain перестанет выдавать приложению ключи. И это жестко нарушает лицензию. Вообще изменять бинарник это Bad.

                                  ЗЫ: Да-да, у каждого приложения свой Growl.Framework и, получается, нужно каждый патчить, при том разный патч под разные версии. Смысл?

                                  А модифицированный гроул == Hiss. Результат такой отправки виден на 1 скриншоте. Отправили нотификацию из процесса гроула — получите нотиф от его же лица. По другому — только редактируя (так же, как я, инжектируясь, но уже в сам Notification Center) поведение самого NC (что собственно и сделали разработчки Bark, см внизу коментариев).
                      0
                      А потом приложение стучится к себе на сервер, ловит в себе инжект и юзеру прилетает бан.
                        0
                        Где такое видано?
                          0
                          Как бы в EULA написано: «вы не имеете права заниматься реверс-инжинирингом, модификацией и вмешиваться в работу нашего суперофигенного приложения»
                            0
                            Где видана на то проверка? :) Да и не представляю, как это можно засечь, ведь ни файлы не модифицируются, ни что бы то ни было еще. Просто происходит подмена указателя на метод, так сказать. Интересно, как это можно поймать. Надо безопасников потыкать…
                          0
                          ну если в игры Близзард инжектировать, то опасно наверное, да, но с 99% софта — пофигу.
                            0
                            Помоему maximizer инжектируется в WoW и я еще жив :D CN не будет инжектироваться, если приложение не использует гроул.
                              0
                              ну вообще было бы странно, еслиб все эти защиты ругались на системную возможность (SIMBL). То что ее используют для внедрения кода, а не по прямому назначению — уже другой вопрос.
                                0
                                Ну вообще прямое ее назначение — это и есть внедрение кода :D Сам автор для того его и писал. Кстати очень удобная штука. Например с помощью нее я научил Ecoute принимать клик мышки за даблклик, и листать список песен нормально, а не как было сделано изначально. Очень удобная штука этот SIMBL :)
                                  0
                                  Ок, я напутал, SIMBL — сторонняя хрень, юзающая возможности системного Input Manager
                          0
                          4) SIMBL.osax -> /Library/ScriptingAdditions *

                          Поясните этот шаг, пожалуйста.
                            0
                            SIMBL.osax — это основной бандл SIMBL.
                            Проблема: SIMBL не инжектируется в приложения, если у них нет иконки в Dock. (Да, да, да, WTF). Проблема в том, что если у приложения нет в доке иконки, то это NSUIElement приложение, или в новой терминологии — Agent Application. Почти Daemon, только с гуей. И, по каким-то не ясным мне соображениям, имеет место задокументированный, но трудно находимый факт: NSWorkspace не отсылает нотификации о запуске Agent-Apps, а именно эти нотификации запуска слушает SIMBL.
                            Я его модифицировал и теперь слушаю старты процессов через функции Carbon.
                              0
                              Спасибо, понял.
                            0
                            С Growl начинается каждый мой сеанс работы с Мак. Он всё время просит обновиться на платную версию, а снести руки не доходят.
                              0
                              Теперь можно будет и удалить :)
                                0
                                Надо отключить проверку обновлений.
                                  0
                                  Соберите из исходников.

                                  «Growl 1.3 brings a lot of changes. One of those changes is that Growl itself is now a purchase.

                                  Also, Growl remains Open Source Software. This page explains how to build Growl from source»

                                    0
                                    Это же не IKEA. Мне проще снести.
                                  0
                                  У кого-нибудь есть на примете бесплатный RSS-ридер с поддержкой Notification Center?
                                    0
                                    В Growl 2 либе для разработчиков если в системе Growl не установлен вообще, то шлется в Notification Center. Т.е. достаточно вообще снести Growl.
                                      0
                                      Адиум уже внедрил и в своей бета-версии шлет уведомления в Notofocation Center если в системе нет Growl-а.
                                        +1
                                        И во всех приложениях обновить growl.framework до 2 версии. Покуда разрабы этого не сделали — сидим ждем. :)
                                        0
                                        Я перешел на ML недавно. Какой смысл в Notification center если я не вижу что появились какие-то оповещения?
                                          0
                                          Всмысле? Оповещение появляется в правом верхнем углу, и через n секунд прячется + издает звук, если приложение того хочет.
                                            0
                                            Это понятно. Я отвлекся/забил на оповещения. Как мне узнать что появились новые? Т.е. на телефоне например в баре сверху торчат иконки.
                                            Плюс у меня при нажатии на оповещение от Sparrow письмо становится прочитанным вместо того чтобы открыть его в окне. Это зависит от приложения или во всех нажатие на попап просто закрывает его?
                                              0
                                              На телефоне не торчат иконки в баре сверху (с удивленными глазами полез смотреть на свой iPhone с iOS5). У меня около дофига нотификаций и никаких иконок нет. Сеть, время, замочек да батарейка.
                                              И да, зависит от приложения. Разработчик так написал сам :).
                                                0
                                                А, ок ) Значит в этом плане андроид получше. Куплю пятерку надо будет посмотреть что для этого есть в джейле — полезный функционал.
                                          +1
                                          Я могу ошибаться, но адиум нормально работает с центром уведомлений. И скайп кажется тоже.
                                          Или я сделал какие-то магические вещи у себя на ноуте и рабочем аймаке?

                                          Growl отключил совсем.

                                          image
                                            0
                                            Хм, да, действительно — Adium 1.5.3 добавил Growl SDK 2. А по клику в нотификацию адиум выскакивает? И есть ли где-нибудь настройки, какие нотификации отображать, какие нет, и хранить их, или нет (например нотификациям Connected в центре явно не место. Отобразили и хватит)?
                                            Что-то я в пещере прям живу, надо было месяц назад это дело выпустить, тогда было бы актуальней некуда :D
                                              0
                                              При клике открывается там с сообщением.
                                              У меня показываются только новые сообщения, когда не открыто окно с чатами, кажется.
                                              Подозреваю, что события, которым показывать уведомления, настраиваются внутри Адиума на закладке «События». Но там как-то все криво…
                                              0
                                              А как вы добавили в NC Facebook?
                                                0
                                                Попробуйте это: link.
                                                  0
                                                  Спасибо, работает)
                                                    0
                                                    Нынче уже официально в составе 10.8.2
                                              0
                                              спасибо! работает
                                              правда папку ~/Library/Application Support/SIMBL/Plugins/ пришлось ручками создать…
                                                0
                                                Что странно, я помню, что в скрипте установки симбла была строка о создании папки. Прекрасно, что работает! :)
                                                  0
                                                  я уже понял изза чего
                                                  я поставил прогу для всех пользователей… и папка создалась в корне т.е. без ~
                                                +1
                                                Чот плохо вы искали, Hiss не единственный. Вот например Bark
                                                  0
                                                  Ого! Меня опередели, как с пряморукостью так и со скоростью! :)
                                                  Но я уверен, что в начале августа Bark'a не существовало. :) в любом случае я получил много удовольствия и знаний, создавая CN, оно того стоило :)
                                                    0
                                                    Хорошие идеи всегда приходят в голову одновременно нескольким людям )
                                                      0
                                                      Ну, там противоположный Вашему подход — Bark modifies of Notification Center to present notifications on behalf of other apps.
                                                      Так что не знаю, что более «пряморуко» )
                                                        0
                                                        Я думаю, что модификация одной сущности (пусть и без исходников, в случае Obj-C хвадает дампа header'ов в силу любвиКОченьSelfDesrcribingНазваниямМетодов(С) ) гораздо более пряморука, чем модификация целой оравы онных в слепую, как мне кажется :) В любом случае, думаю мой подход тоже имеет право на существование, правда требует, наверное, доработки :)
                                                          0
                                                          Как оказалось, у них допилено не до конца, и тык по нотификации приводит не к тому, к чему ожидалось. У меня это реализованно так, как того ожидает юзверь. Я отписал им с предложением помочь. Эххх. Теперь удалять все эти гроулы и возвращать обратно свой CN :)
                                                      0
                                                      Спасибо!
                                                        0
                                                        Последнее обновление Growl сделало доступным свой собтвенный прокси в notification center.
                                                        image
                                                          0
                                                          Версию 1.4 удалось собрать и заставить работать. Интересно, выложат ли они 2.0 и через какое время после релиза? Хотя меня сейчас вроде всё устраивает (Growl + Bark).
                                                          0
                                                          А нельзя никак скрывать уведомления от нотификейш-центра? Как в гроле был крестик, например.
                                                            0
                                                            Можно — просто смахните его вправо, зажав лкм =)
                                                              0
                                                              Ааа, вы мой спаситель :))

                                                          Only users with full accounts can post comments. Log in, please.