2012-08-29 68 views
10

我有一個應用程序,目標是在沙箱和非沙箱MacOS中運行。如果用戶從MacOS 10.6升級到更高版本的操作系統,我需要用戶重新選擇文件夾,以便我可以使用安全書籤將它們加入書籤。如何檢測我的應用程序是否是沙盒?

如何檢測到我的應用程序位於支持沙盒的操作系統上?

回答

19

我知道的唯一方法就是尋找APP_SANDBOX_CONTAINER_ID環境變量。它在應用程序在沙箱容器內運行時出現。

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

正是我要找的!如果它有效,我會試一試並修改此評論。謝謝。 – NPAssoc

+0

注意:這不再適用於macOS Sierra(到目前爲止測試版1,2和3)。 – Kyle

+0

@凱爾這似乎在高塞拉利昂罰款。 – Gino

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); 
} 
+1

請嘗試解釋你的代碼的作用。 – loki

+0

它檢查是否存在指定應用程序包的有效授權「com.apple.security.app-sandbox」。 「是」表示應用程序是沙盒。 詳細的API信息可以在這裏找到https://developer.apple.com/reference/security – Oleksii

1

測試本作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 
} 
相關問題