我有一個應用程序,目標是在沙箱和非沙箱MacOS中運行。如果用戶從MacOS 10.6升級到更高版本的操作系統,我需要用戶重新選擇文件夾,以便我可以使用安全書籤將它們加入書籤。如何檢測我的應用程序是否是沙盒?
如何檢測到我的應用程序位於支持沙盒的操作系統上?
我有一個應用程序,目標是在沙箱和非沙箱MacOS中運行。如果用戶從MacOS 10.6升級到更高版本的操作系統,我需要用戶重新選擇文件夾,以便我可以使用安全書籤將它們加入書籤。如何檢測我的應用程序是否是沙盒?
如何檢測到我的應用程序位於支持沙盒的操作系統上?
我知道的唯一方法就是尋找APP_SANDBOX_CONTAINER_ID
環境變量。它在應用程序在沙箱容器內運行時出現。
NSDictionary* environ = [[NSProcessInfo processInfo] environment];
BOOL inSandbox = (nil != [environ objectForKey:@"APP_SANDBOX_CONTAINER_ID"]);
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);
}
測試本作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
}
正是我要找的!如果它有效,我會試一試並修改此評論。謝謝。 – NPAssoc
注意:這不再適用於macOS Sierra(到目前爲止測試版1,2和3)。 – Kyle
@凱爾這似乎在高塞拉利昂罰款。 – Gino