Каковы преимущества и недостатки SIMBL и mach_star? - PullRequest
4 голосов
/ 03 января 2011

Для написания хаков и неофициальных расширений для приложений Mac OS X сегодня существует два варианта: SIMBL и mach_star.Я начинаю проект, который потребует внедрения в другой процесс, и мне нужно выбрать между этими библиотеками.

Каковы различия в подходе и функциональности между SIMBL и mach_star?Зачем мне использовать один над другим?

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

SIMBL: работа только над приложениями какао. (Вы не можете управлять такими приложениями, как Dock, Finder и т. Д.). Прост в использовании.

mach_star: работает со всеми видами приложений и может подключать плоские API. Немного сложно.

Что использовать? Зависит от того, что вы хотите сделать? Если вы просто заигрываете с какао, то сделайте вашу работу, используйте SIMBL иначе mach_star.

1 голос
/ 21 февраля 2013

SIMBL был создан из mach_star ... он содержит mach_star в своем коде ...

SIMBL - это SIMple BundleLoader ... обратите внимание на заглавные буквы .... он был разработан для того, чтобы модули плагинов могли храниться в ~ / Library / Application Support / SIMBL / Plugins и автоматически вводиться в искатель ..

Есть скрипт запуска в / Library / Scripting Additions / SIMBL.osax ... этот скрипт отвечает за установку mach_inject_bundle.framework в / Library / Frameworks (я думаю) и внедрение кода в целевые программы, указанные в Плист.

У mach_star есть несколько примеров выполнения команд mach_inject_bundle_pid и других нечестивых мач-методов, меняющих магию.

Чтобы использовать SIMBL и иметь плагины, которые вы разрабатываете, это одно ... вы можете создать плагин, и вам не нужно беспокоиться о внедрении искателя каждый раз, когда он пробуждается, или установке mach_inject_bundle.framework.

ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ЭТИ ПЛАГИНЫ В ВАШЕМ ПРИЛОЖЕНИИ АВТОМАТИЧЕСКИ: вам просто нужно, чтобы они были установлены и введены в ваш код каждый раз, когда поиск запускается / запускается и / или когда ваше приложение запускается

(единственный способ отменить ваши инъекции - это использовать яблочный скрипт, подобный следующему:

tell application "Finder" to quit
delay 2.5
tell application "Finder" activate

или нам нужно было бы завершить код mach_star и реализовать неинъекционный материал mach ...: (

Чтобы быть профессионалом и создать приложение, которое автоматически устанавливает ваш плагин, мы должны сделать следующее: есть код, который может использовать SMJobBless, чтобы благословить программу на установку файла mach_inject_bundle.framework, если он еще не установлен, как а также вводите искатель каждый раз, когда ваше приложение загружается и / или когда перезапускается искатель.

zerodivisi0n: Алексей Жучков проделал замечательную работу, а также Эрван Барьер, чтобы проиллюстрировать, как встроить некоторый код в ваше приложение, которое выполняет следующие действия:

(псевдокод)

AppDelegate ApplicaitonDidFinishLaunching:

SMJobBlessGetPermission () // позволяет нам вводить искатель при каждом запуске, как только пользователь подтвердил один раз

{

// с правами администратора

if (фреймворк не установлен)

установить mach_inject_bundle.framework в / Library / Frameworks

введите искатель с вашим кодом

}

https://github.com/twotreeszf/FinderMenu

https://github.com/erwanb/MachInjectSample

Цитируется по MachInjectSample:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  NSError *error;

  // Install helper tools
  if ([DKInstaller isInstalled] == NO && [DKInstaller install:&error] == NO) {
    assert(error != nil);

    NSLog(@"Couldn't install MachInjectSample (domain: %@ code: %@)", error.domain, [NSNumber numberWithInteger:error.code]);
    NSAlert *alert = [NSAlert alertWithError:error];
    [alert runModal];
    [NSApp terminate:self];
  }

  // Inject Finder process
  if ([DKInjectorProxy inject:&error] == FALSE) {
    assert(error != nil);

    NSLog(@"Couldn't inject Finder (domain: %@ code: %@)", error.domain, [NSNumber numberWithInteger:error.code]);
    NSAlert *alert = [NSAlert alertWithError:error];
    [alert runModal];
    [NSApp terminate:self];
  }
}
...