2013-06-28 3 views
1

Я пишу приложение, которое может работать изолированно или нет.Как приложение может сказать тихо, если оно работает в песочнице?

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

Естественно, мне нужно использовать различные API в некоторых случаях в моем коде, в зависимости от того, изолировано ли приложение или нет.

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

ответ

1

я нашел гораздо более простой трюк прямо сейчас:

я получить путь к папке Preferences. Если это выглядит примерно так, я песочница:

/Users/<user>/Library/Containers/<bundle_id>/Data/Library/Preferences 

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

+2

См. Также [этот ответ] (/ a/12178610). – theory

+0

Как вы получаете путь? – vy32

0

Как вы уже упоминали, приложения с песочницей имеют код, подписанный. Вы можете проверить наличие этого при вызове командной строки на «codeign».

Поэтому, если ваша программа может вызывать в командной строке с: -

codesign -d --entitlements :- <path to executable> 

Получить вывод команды и поиск строки: -

com.apple.security.app-sandbox 

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

------- EDITED ----------------

Я не проверял это сам, но просто наткнулся на this article, который включает в себя код для проверки если приложение изолировано. Полный код можно найти на github here.

---- EDIT 2 --------------

Я наконец-то проверил код в aforementioned article и может подтвердить, что он работает, как ожидалось.

+0

Конечно, также не песочница код может использовать код подписанных исполняемые файлы или библиотеки. – tml

0

Я использую это:

// Determine if an application is running in sandboxed mode 
func IsSandboxed() -> Bool { 
    let dir = NSHomeDirectory() 
    let bundleName: String = NSBundle.mainBundle().bundleIdentifier as String! 
    if dir.containsString("Library/Containers/" + bundleName) { 
     return true 
    } 
    return false 
}