использование applecript для добавления моего приложения в элемент входа в систему, но при этом возникает странная проблема с правами доступа - PullRequest
0 голосов
/ 16 апреля 2019

Я использую этот код для добавления своего приложения в элементы входа в систему при запуске приложения

         if tempVarForAddTologinItemAtLaunch == true{
        DispatchQueue.global(qos: .background).async{
            var error: NSDictionary?
            if let scriptObject = NSAppleScript(source: "tell application \"System Events\" \n if exists login item \"" + Bundle.main.bundleIdentifier! + "\" then \n delete login item \"myApp\" \n end if \n make new login item at end of login items with properties {name:\"" + Bundle.main.bundleIdentifier! + "\", path:\"" + String(Bundle.main.bundleURL.absoluteString).replacingOccurrences(of: "file://", with: "").dropLast().replacingOccurrences(of: "%20", with: " ") + "\", hidden:false} \n end tell \n") {
                if let outputString = scriptObject.executeAndReturnError(&error).stringValue {print(outputString)} else if (error != nil) {print("error: ", error!)}
            }
        }
    }

Я получаю эту ошибку в консоли и код не будет работать, если я попробую свое приложение в учетной записи другого пользователя

2019-04-15 20: 31: 45.474846-0400 myApp [11185: 13342142] пропущено добавление сценариев "/Library/ScriptingAdditions/SASyphonInjector.osax", поскольку оно не защищено SIP.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Относительно SASyphonInjector.osax сообщений об ошибках, по словам Вадиана, это не относится к вашему коду.

vadian: «В 10.14 Mojave Apple больше не разрешает сторонние добавления сценариев».

Это не совсем правильно.Сторонние OSAX по-прежнему разрешены, но они должны быть кодированы и встроены в приложение, которое их использует (которое должно быть подписано с той же идентификационной информацией).Однако OSAXen больше не может быть установлен в глобальных папках «ScriptingAdditions», а также не может быть загружен в один процесс и затем вызван из другого (огромная дыра для внедрения кода, которую Apple должна была закрыть десятилетия назад).Более подробное описание здесь , с / у Late Night Software.

К сожалению, Apple по-прежнему разрешает удаленный вызов команд StandardAdditions, поэтому вредоносный код может [например] отображать фальшивку «Пожалуйста, введите свой пароль Apple: »в привычных приложениях, таких как iTunes и App Store.Но предположим, что OSAXen в конечном итоге полностью исчезнет.

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

0 голосов
/ 16 апреля 2019

@ vadian: Никогда не генерируйте код из произвольных строк. И код OP, и ваше упрощение его принципиально небезопасны и не должны использоваться.

The правильный способ передачи произвольных аргументов в NSAppleScript состоит в создании NSAppleEventDescriptor, содержащем имя вызываемого обработчика и передаваемые ему данные, а затем вызовите -executeAppleEvent:error: для вызова этого обработчика.

Тем не менее, использование NSAppleScript является смехотворно утомительным , и гораздо проще вызывать обработчики AppleScript напрямую через мост AppleScript-ObjC.

Вот пример кода для LoginItems.applescript:

use framework "Foundation"

script LoginItems
  property parent: script "NSObject"

  to addLoginItem(appName, appPath)
    tell application "System Events"
      if exists login item appName then delete login item appName
      make new login item at end of login items ¬
          with properties {name:appName, path:appPath, hidden:false}
    end tell
  end addLoginItem
end script

В нем отсутствуют такие тонкости, как сообщения об ошибках, но вам следует начать.А вот соответствующий протокол Swift:

@objc(NSObject) protocol LoginItems {
  func addLoginItem(_ appName: String, _ appPath: String)
}

Вам нужно будет добавить несколько дополнительных строк шаблона к вашему AppDelegate, чтобы загрузить скрипт и создать экземпляр класса (см. Swift-Пример проекта AppleScriptObjC по ссылке выше).

О, а также не забудьте добавить строку NSAppleEventUsageDescription в ваш Info.plist, который необходим вашему приложению для отправки событий Apple другим процессам 10.14 +.

0 голосов
/ 16 апреля 2019

Ошибка не связана с кодом.В 10.14 Mojave Apple больше не разрешает сторонние добавления сценариев.

Вы можете упростить свой код, заменив

path:\"" + String(Bundle.main.bundleURL.absoluteString).replacingOccurrences(of: "file://", with: "").dropLast().replacingOccurrences(of: "%20", with: " ") + "\", hidden:false}

на

path:\"" + Bundle.main.bundlePath + "\", hidden:false}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...