Получение имени текущего приложения на macOS Swift

Вопрос или проблема

Я работаю над расширением для меню, и мне нужно получить имя текущего приложения. У меня есть следующий код:

var app: NSRunningApplication = NSWorkspace.shared.frontmostApplication!
var bundleIdentifier: String = app.bundleIdentifier!
var name: String = app.localizedName!
var icon: NSImage? = app.icon

Код в основном работает, но в некоторых случаях свойство localizedName является пустой строкой. Остальные свойства в порядке.

Я не могу найти другое свойство, которое имеет имя приложения. Одно из таких приложений – SQLPro для SQLite, которое является легитимным приложением из App Store. У него явно есть имя, которое появляется во всех правильных местах, кроме как выше.

Есть ли альтернативный способ получения имени приложения?

Ответ или решение

Чтобы получить имя текущего приложения на macOS с использованием Swift, вы уже используете правильный подход, используя класс NSWorkspace и его свойство frontmostApplication. Ваш код обеспечивает доступ к различным свойствам запущенного приложения, однако есть ситуация, когда свойство localizedName может вернуть пустую строку. Например, это может происходит с некоторыми приложениями, такими как SQLPro for SQLite.

В данном ответе мы рассмотрим возможные решения проблемы и альтернативные способы получения имени приложения.

Использование других свойств

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

  1. Проверка идентификатора пакета: Вы можете попробовать использовать bundleIdentifier, чтобы идентифицировать приложение. Однако этот метод не дает вам прямого названия приложения.

  2. Использование заголовка Dock: В macOS вы можете извлечь информацию из заголовка Dock. Если приложение активно, его имя можно получить через другой подход.

  3. Недоступные метаданные: Иногда приложения могут не предоставлять локализованное имя через стандартные API из-за особенностей настройки.

Альтернативный метод получения имени

Существует альтернативный способ, который может помочь в получении имени приложения, если localizedName возвращает пустую строку. Попробуйте использовать следующий код:

import Cocoa

if let app = NSWorkspace.shared.frontmostApplication {
    if let localizedName = app.localizedName, !localizedName.isEmpty {
        print("Имя приложения: \(localizedName)")
    } else {
        // Пробуем альтернативный способ через `NSRunningApplication` и путь к исполняемому файлу
        if let executablePath = app.executableURL?.lastPathComponent {
            if executablePath.hasSuffix(".app") {
                let appName = String(executablePath.dropLast(4)) // Убираем .app
                print("Имя приложения: \(appName)")
            } else {
                let appName = executablePath
                print("Имя приложения: \(appName)")
            }
        }
    }
}

Заключение

С учетом вышеописанного, такой подход может обеспечить более надежное извлечение имени приложения, когда localizedName оказывается пустым. При использовании услуг платформы macOS необходимо помнить, что некоторые приложения могут по разным причинам не предоставлять всю необходимую информацию через стандартные API. Поэтому, если один способ не работает, стоит попробовать альтернативные варианты.

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

Оцените материал
Добавить комментарий

Капча загружается...