2013-11-10 17 views
0

Я написал приложение, которое можно вызвать как услугу (щелкнув правой кнопкой мыши файл в Finder и выбрав его, чтобы открыть его с моим приложением), но есть несколько нежелательных побочных эффектов, эффекты при этом.Связанные с службой «ошибки»

Пример целевой службы метода:

- (void)doSomething:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error { 
    NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 
    NSLog(@"Selected file(s): %@", files); 
    [self.anotherWindow makeKeyAndOrderFront:self]; 
} 

1) При запуске приложения таким образом (даже если он уже открыт в режиме отладки), я, кажется, не в состоянии получить доступ к другим окнам/управления из функции DoSomething , Вышеприведенная попытка показать «anotherWindow», например, не производит ошибок, но ничего не делает. Согласно трассировке стека, при проверке с -doSomething все компоненты gui имеют значения 0x0000000000000000, но приложение отображается и полностью функционально. Это только от -doSomething, что я не могу связаться с ними. «self» также имеет другое значение при проверке с -doSomething по сравнению с -applicationDidFinishLaunching. Я не уверен, как и почему -doSomething приобретает другое self/AppDelegate с неинициализированными компонентами. По-видимому, исправлено [NSApp setServicesProvider: self];

2) Я не понимаю, как система решает, какая копия приложения запускается при вызове службы, но обычно не выбирает тот, который я хочу. У меня есть копия в/Debug, копия в/Release, копия на моем рабочем столе ... и если я удалю ее, она откроет файл вместо другого (какая-то резервная цепочка?). Как настроить службу (в коде или через .plist), чтобы открыть определенную версию/местоположение этого приложения? Но это dev-машина. Если я выпущу дистрибутив, который устанавливает в/Applications, мне действительно нужно беспокоиться об этом?

+0

Я добавил NSAlerts к -doSomething и к -applicationDidFinishLaunching. Сначала запускается одно в -applicationDidFinishLaunching, и я вижу главное окно приложения (self.mainWindow). Затем появляется сообщение -doSomething и печатает, что self.mainWindow (null). Несмотря на то, что я могу видеть и взаимодействовать с ним. Is -doSomething не работает в одном экземпляре? – Eric

ответ

0

1) Дважды проверьте свой XIB, чтобы убедиться, что у вас все подключено правильно, а затем попробуйте запустить приложение с точкой останова, установленной на NSLog выше, и убедитесь, что self.anotherWindow указывает на то, что вы хотите. Если по какой-то причине, точка останова не стрелять, пытаясь добавив:

NSLog(@"Window: %@", self.anotherWindow); 

Чтобы убедиться, что все инициализации и подключили

2) Система использует Launch Services, чтобы определить, какую версию приложения запускать. Часто это последняя версия, добавленная в систему (что приведет к изменению базы данных Launch Services), но в зависимости от того, как настроена ваша система, возможно, что она не будет той версии, которую вы ожидаете.

Вы можете вручную запросить и изменить базу данных запуска службы с помощью:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister 

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

Если вы просто хотите, чтобы заставить перегрузите основанный на определенном двоичном, используйте -f флаг и путь к приложению:

..../lsregister -f /Applications/Foo.app 

Вы также можете использовать -u явно разрегистрировать что-то.

Надеюсь, это даст вам представление о том, что здесь происходит.

+0

Если я распространю это приложение для других, то какой способ лучше всего зарегистрировать сервис? В настоящее время я делаю [NSApp setServicesProvider: appDelegate] и NSUpdateDynamicServices() в коде, но, очевидно, не направляет ОС на версию приложения, которое недавно выполнило эти команды. – Eric

+0

NSLog (@ "Окно:% @", self.anotherWindow); prints Окно: (null). NSLog (@ "% @", self) печатает «» из -doSomething и печатает «» из -applicationDidFinishLaunching. Различные случаи самости? – Eric

+0

@ Эрик На вопрос о том, правильно ли зарегистрирован сервис, только одно приложение с определенным идентификатором пакета должно быть на машине пользователя одновременно. Когда приложение будет установлено, ОС прочитает Info.plist и зарегистрирует любые службы (как правило, у вас также будет конфигурация служб) – gaige

Смежные вопросы