Вопрос по cocoa, macos – Идеальный способ для приложений с одним экземпляром на Mac

7

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

Я могу придумать способы сделать это на Mac:

named pthread mutexes enumerate running processes and look for one that matches create and lock a file

Есть ли что-то встроенное в Какао / Углерод, которое проще, чем варианты выше? Если нет, то какие из трех наиболее часто используются на Mac? Я бы предположил, 2 или 3 ...

[используемый NSRunningApplication обнаруживает, работает ли приложение с тем же идентификатором bundleID, активирует его и закрывает то, что запускается.] [1] [1]:stackoverflow.com/questions/684911/… Roman Solodyashkin
просто глядя на то, как приложения запускаются и взаимодействуют с ними, я не думал, что возможно иметь несколько экземпляров ... По крайней мере, не с приложениями, упакованными в хороший .app Cogsy
Хорошо, я немного обманул в своем вопросе ... Я действительно хотел запустить тестовое приложение, которое провело кучу проверок, но запуск его во время работы приложения вызвал ложные срабатывания. Чтобы не тратить время на поиски бесполезных проблем, я хотел, чтобы тестовое приложение вызывало ошибку при запуске приложения. В Windows я решил это, используя подход с одним экземпляром, и предположил, что хочу сделать то же самое для Mac. psychotik

Ваш Ответ

5   ответов
1

вы можете использовать NSWorkspace, чтобы увидеть, запущен ли другой процесс с вашим идентификатором пакета. Я видел несколько приложений, которые отображают диалоговое окно и говорят: «Экземпляр этого приложения уже запущен». - Я думаю, что Firefox делает это на самом деле.

Это не очень "макинтош" подход, но это сделает работу.

Это то, что я хочу сделать, но мое тестовое приложение не является приложением Какао (см. Обновленный комментарий в моем вопросе выше). Я нашел GetNextProcess () в Carbon, который может помочь .. какие-либо другие предложения? psychotik
8

апущенные приложения в NSWorkspace. Это возвращает NSArray, содержащий словарь для каждого запущенного приложения. Вы можете перебрать массив, чтобы увидеть, запущено ли приложение, которое вы ищете. Я бы посоветовал вам использовать это значение с ключом NSApplicationBundleIdentifier, который будет иметь значение, подобное & quot; com.mycompany.myapp & quot; вместо того, чтобы искать имя. Если вам нужно найти идентификатор пакета для приложения, вы можете посмотреть его файл info.plist в пакете приложения.

Обратите внимание, чтоNSWorkspace -launchedApplications устарела в Mac OS X 10.7. Apple рекомендует использовать сейчасNSWorkspace -runningApplications вместо (10,6+):developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
Это то, что я хочу сделать, но мое тестовое приложение не является приложением Какао (см. Обновленный комментарий в моем вопросе выше). Я нашел GetNextProcess () в Carbon, который может помочь .. какие-либо другие предложения? psychotik
Это был бы способ сделать это, если вы приложение Carbon. Вы уже связаны с Углеродной библиотекой? Тем не менее, та же функция единственного экземпляра применима и к приложениям Carbon. Звучит так, будто вы собираете программу для командной строки unix, это правильно? Может быть полезно описать, что вы строите более подробно.
6

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

Если вам нужны два экземпляра запущенного приложения, вы не думаете как пользователь Mac :).

Изменить: этоtechnically не правда. Проверьте комментарии.

Правильно. Я даже приведу простой пример, который, как мне кажется, является довольно распространенным: запуск приложения из программы установки после установки. Если вы ищете приложение и запускаете его из Spotlight, загорается второй экземпляр.
связанные с:apple.stackexchange.com/q/301081/6533
Другими словами, нет необходимости, если мы говорим о приложениях с графическим интерфейсом. Это уже работает таким образом.
Это не правда. Если вы запустите приложение из терминала, например, вы можете запуститьN экземпляры одновременно. Тот факт, что этоuncommon не означает, что дело не должно быть принято во внимание.
1

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

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

Как определить, запущено ли уже приложение OS X

Для ознакомления с контекстом времени выполнения и, в частности, с демонами и агентами Mac OS X (а также в тех случаях, когда вам нужно иметь несколько запущенных копий исполняемого файла в виде пула или тому подобного и похожего на Apache), смотрите:

http://developer.apple.com/technotes/tn2005/tn2083.html

0

вы могли бы использоватьjavax.jnlp.SingleInstanceService, Предоставление JWS также обеспечит автоматическое обновление программы.

Похожие вопросы