Как определить, изолировано ли мое приложение?

У меня есть приложение, предназначенное для запуска как в изолированном, так и в изолированном MacOS. Если пользователь обновляется с MacOS 10.6 на более позднюю ОС, мне нужно, чтобы пользователь перебирал папки, чтобы я мог добавлять закладки в закладки с надежными закладками.

Как определить, что мое приложение находится в ОС, которая поддерживает песочницу?

Ответ 1

Единственный способ, которым я знаю, - искать переменную среды APP_SANDBOX_CONTAINER_ID. Он присутствует, когда приложение запускается внутри контейнера песочницы.

NSDictionary* environ = [[NSProcessInfo processInfo] environment];
BOOL inSandbox = (nil != [environ objectForKey:@"APP_SANDBOX_CONTAINER_ID"]);

Ответ 2

BOOL isSandboxed = NO;

SecStaticCodeRef staticCode = NULL;
NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];

if (SecStaticCodeCreateWithPath((__bridge CFURLRef)bundleURL, kSecCSDefaultFlags, &staticCode) == errSecSuccess) {
    if (SecStaticCodeCheckValidityWithErrors(staticCode, kSecCSBasicValidateOnly, NULL, NULL) == errSecSuccess) {
        SecRequirementRef sandboxRequirement;
        if (SecRequirementCreateWithString(CFSTR("entitlement[\"com.apple.security.app-sandbox\"] exists"), kSecCSDefaultFlags,
                                       &sandboxRequirement) == errSecSuccess)
        {
            OSStatus codeCheckResult = SecStaticCodeCheckValidityWithErrors(staticCode, kSecCSBasicValidateOnly, sandboxRequirement, NULL);
            if (codeCheckResult == errSecSuccess) {
                isSandboxed = YES;
            }
        }
    }
    CFRelease(staticCode);
}

Ответ 3

Тестирование этого для Swift3

func isSandboxed() -> Bool {
    let bundleURL = Bundle.main.bundleURL
    var staticCode:SecStaticCode?
    var isSandboxed:Bool = false
    let kSecCSDefaultFlags:SecCSFlags = SecCSFlags(rawValue: SecCSFlags.RawValue(0))

    if SecStaticCodeCreateWithPath(bundleURL as CFURL, kSecCSDefaultFlags, &staticCode) == errSecSuccess {
        if SecStaticCodeCheckValidityWithErrors(staticCode!, SecCSFlags(rawValue: kSecCSBasicValidateOnly), nil, nil) == errSecSuccess {
            let appSandbox = "entitlement[\"com.apple.security.app-sandbox\"] exists"
            var sandboxRequirement:SecRequirement?

            if SecRequirementCreateWithString(appSandbox as CFString, kSecCSDefaultFlags, &sandboxRequirement) == errSecSuccess {
                let codeCheckResult:OSStatus  = SecStaticCodeCheckValidityWithErrors(staticCode!, SecCSFlags(rawValue: kSecCSBasicValidateOnly), sandboxRequirement, nil)
                if (codeCheckResult == errSecSuccess) {
                    isSandboxed = true
                }
            }
        }
    }
    return isSandboxed
}

Ответ 4

Вот ответ @hamstergene в Swift 4.2:

func isSandboxEnvironment() -> Bool {
    let environ = ProcessInfo.processInfo.environment
    return (nil != environ["APP_SANDBOX_CONTAINER_ID"])
}