Право песочницы на сценарий iTunes через NSApleScript

Я пытаюсь написать сценарий iTunes из NSApleScript в своем приложении Cocoa, чтобы добавить файл в библиотеку.

В моем файле прав я добавил следующее:

<key>com.apple.security.scripting-targets</key>
    <dict>
        <key>com.apple.itunes</key>
        <array>
            <string>com.apple.itunes.library.read-write</string>
        </array>
    </dict>

Затем я вызываю AppleScript следующим образом:

var error: NSDictionary? = nil
let appleScript = NSAppleScript(source: "tell application \"iTunes\" to add (POSIX file \"\(path)\") to library playlist 1")
let result = appleScript?.executeAndReturnError(&error)

но вылетает с ошибкой -10004: iTunes got an error: A privilege violation occurred.

Я пытался использовать iTunes в обоих направлениях (itunes и iTunes), но, похоже, ничего не работает. Я также попытался добавить к праву чтения-записи право read. Наконец, я попытался добавить доступ для чтения и записи к папке «Музыка» пользователя (где хранится библиотека iTunes), и это тоже не помогло.

Есть ли еще одно необходимое право, о котором я не знаю, для создания сценария iTunes?

Я нашел эту ссылку при поиске решения (ссылка), но он требует, чтобы пользователь выбрал определенную папку в своей папке Library, чтобы предоставить приложению доступ к файлу, выбранному пользователем, а затем он требует, чтобы сценарий находился в отдельном файле, что на 2 вещи слишком много для того, что я хочу сделать. Я не доверяю пользователю в отношении управления файлами сценариев, и мне не нужен файл для 1 строки кода AppleScript. Другим недостатком, насколько я понимаю NSUserAppleScriptTask, является то, что вы не можете сохранять состояние скрипта при нескольких вызовах, что не является проблемой в моем случае, но может быть для кого-то еще.

Спасибо


person beeb    schedule 06.12.2015    source источник
comment
Я предполагаю, что ошибка привилегий возникает из-за местоположения на диске, а не из-за события Apple, отправленного в iTunes. В среде песочницы папки NSUserAppleScriptTask и Application Scripts являются предпочтительным способом выполнения скриптов.   -  person vadian    schedule 09.12.2015
comment
Я должен был упомянуть, что я также пытался добавить к правам полный доступ для чтения и записи к папке «Музыка», и это не помогло. сейчас редактирую. Кроме того, зачем iTunes и другим приложениям с поддержкой сценариев иметь права на выполнение сценариев, если я не могу использовать их в своем приложении?   -  person beeb    schedule 09.12.2015
comment
Я только что попытался добавить право com.apple.security.temporary-exception.apple-events с ключом com.apple.itunes, и теперь скрипт работает, но мне интересно, правильно ли это? Временный означает, что это значит, верно? Поскольку iTunes поддерживает сценарии и имеет наборы разрешений, мне это не нужно.   -  person beeb    schedule 09.12.2015
comment
Я так и предполагал, что ты это сделал. Для разговора с приложением требуется временное исключение. Тем не менее, NSUserAppleScriptTask удобнее, потому что вам вообще не нужны никакие права на Apple Event.   -  person vadian    schedule 09.12.2015
comment
Это удобно для меня, но не для пользователя, который должен выбрать папку Application Scripts, чтобы предоставить доступ к ней внутри песочницы. В любом случае, мне это не нужно: ваше приложение, однако, не может отправлять события Apple в другие приложения, если вы не запросите разрешение на цели сценариев или разрешение на временное исключение Apple-events. - developer.apple.com/library/mac/qa/qa1888/_index .html   -  person beeb    schedule 09.12.2015


Ответы (1)


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

Во-первых, права должны иметь идентификаторы пакетов в правильном регистре. Для iTunes права должны быть такими (обратите внимание на заглавную T в iTunes):

<key>com.apple.security.scripting-targets</key>
<dict>
    <key>com.apple.iTunes</key>
    <array>
        <string>com.apple.iTunes.library.read-write</string>
    </array>
</dict>

Затем произойдет нарушение привилегий, если код AppleScript не включает of source 1 в конце, например:

tell application "iTunes" to add (POSIX file "your/path/to/mp3.mp3") to library playlist 1 of source 1

Ну вот!

person beeb    schedule 17.12.2015
comment
Спасибо, это мне очень помогло - person stan liu; 06.09.2016