Могу ли я использовать приложение в качестве библиотеки (Mac, Objective-c)? - PullRequest
3 голосов
/ 12 мая 2011

Есть ли способ загрузить классы из приложения Mac и использовать их в другом приложении Mac?

Я хотел бы выполнить действие Automator, которое обращается к некоторым классам в моем приложении Mac,и это похоже на то, как я бы в идеале это делал (значит, вы должны были купить мое приложение, чтобы использовать действие Automator и т. д.)

Ответы [ 5 ]

4 голосов
/ 12 мая 2011

Вы пытались создать автономный проект подключаемого модуля Automator или пытались добавить цель пакета Automator в проект своего приложения?

Я предполагаю, что вы хотите создать действия Automator для своего основного приложения, нонеясно, как эти действия взаимодействуют с вашим приложением (или с классами, присутствующими в вашем приложении).

Существует 3 основных типа действий Automator: на основе AppleScript, на основе shell-сценария и Objective-С на основе.Скорее всего, вы захотите создать свой Objective-C, который позволит вам легко включать другой код Objective C из вашего основного приложения в само действие (см. Реализация действия Objective C ),(Обратите внимание, что по умолчанию, когда вы добавляете новую цель для комплекта автоматов, она имеет тип AMAppleScriptAction).

Чтобы увидеть, как настроено действие автомата Objective C по сравнению с действием на основе AppleScript, вы можете попробовать создать отдельный автономный проект.

Допустим, ваше приложение основано на документе и использует класс KWDocument, который предоставляет метод с именем -duplicateObjects:(NSArray *)objects toDocument:(KWDocument *)destDocument;.У вас также есть KWRegistrationManager, который знает, зарегистрировано ваше приложение или нет.Допустим, вы хотите создать действие автоматизатора, которое называется «Дублировать объекты в документ».Действие будет реализовано в KWDuplicateObjectsToDocument, который является подклассом AMBundleAction.В Info.plist для дубликатов объектов в Document.action NSPrincipalClass будет KWDuplicateObjectsToDocument.

KWDuplicateObjectsToDocument.h будет выглядеть примерно так:

#import <Cocoa/Cocoa.h>
#import <Automator/AMBundleAction.h>

@interface KWDuplicateObjectsToDocument : AMBundleAction {

}

- (id)runWithInput:(id)input fromAction:(AMAction *)anAction
                                  error:(NSDictionary **)errorInfo;

@end

И ваш KWDuplicateObjectsToDocument.m будет выглядеть примерно так:

#import "KWDuplicateObjectsToDocument.h"
#import "KWDocument.h"
#import "KWRegistrationManager.h"


@implementation KWDuplicateObjectsToDocument

- (id)runWithInput:(id)input fromAction:(AMAction *)anAction
          error:(NSDictionary **)errorInfo {
      if (![[KWRegistrationManager defaultManager] isRegistered]) {
          return nil;
      }

    // eventually you'll call 
    // duplicateObjects:toDocument:

      return input;
}

@end

Вам необходимо убедиться, что необходимые классы, которые вы используете (например, KWRegistrationManager, KWDocument и т. д.), скомпилированы и включены как частьпроцесс сборки для этого комплекта.

4 голосов
/ 12 мая 2011

В зависимости от того, что вы хотите сделать (я не совсем уверен), Сервис может помочь вам. Вы создаете вспомогательное приложение, которое может передавать данные назад и вперед вместе с общим папкой. Вы можете получить довольно широкий диапазон действий, потому что вы можете передать любой объект, который соответствует протоколам NSPasteboardWriting и NSPasteboardReading ; как сказано в документах, NSString, NSAttributedString, NSURL, NSColor, NSSound и NSImage уже доступны для вас, и, конечно, вы можете написать собственный класс, который подходит вашему нужно точно.

2 голосов
/ 12 мая 2011

По сути, нет: вы не можете связать с исполняемым файлом.

Двоичный файл приложения имеет определенный формат.И этот формат отличается от формата статической или совместно используемой библиотеки.

Это означает, что вы не сможете загружать какие-либо части кода из двоичного файла приложения, как это было бы с библиотекой.

2 голосов
/ 12 мая 2011

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

Один интересный аспект распределенных объектов заключается в том, что приложение может работать на том же компьютере, если вы хотите, но оно может быть так же легко запущено на другом компьютере, возможно, даже очень удаленном.

2 голосов
/ 12 мая 2011

Вы можете сделать определенное поведение из своего приложения доступным через Applescript, но доступ к реальным классам невозможен, как я думаю, вы имеете в виду.У меня сложилось впечатление, что вы имеете в виду доступ к классам, загруженным в память вашего запущенного приложения.Это невозможно в OS X (или любой UNIX-подобной системе).Приложения запускаются на уровне пользователя.Процессы на уровне пользователя не способны считывать память из других процессов.Компоненты ОС, которые должны делать подобные вещи, работают на уровне ядра.

Если вы просто пытаетесь повторно использовать код, вы можете встроить части, которые вы хотите поделиться, в статическую библиотеку, а другие могут ссылаться на нее и делиться вашим кодом.

РЕДАКТИРОВАТЬ:

Из ответа NSGod кажется, что вы можете использовать тот же подход, который делает его доступным через Applescript и делает его доступным через Obj-C.Это выглядит довольно круто.

...