NPA*_*soc 12 macos cocoa sandbox
我有一个应用程序,目标是在沙盒和非沙盒MacOS中运行.如果从MacOS的10.6用户升级到更高的操作系统,我需要用户重新拿起文件夹,这样我就可以安全的书签书签他们.
如何检测我的应用程序是否在支持沙盒的操作系统上?
ham*_*ene 21
我所知道的唯一方法是寻找APP_SANDBOX_CONTAINER_ID环境变量.当应用程序在沙箱容器内运行时,它就会出现.
NSDictionary* environ = [[NSProcessInfo processInfo] environment];
BOOL inSandbox = (nil != [environ objectForKey:@"APP_SANDBOX_CONTAINER_ID"]);
Run Code Online (Sandbox Code Playgroud)
        小智 5
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);
}
Run Code Online (Sandbox Code Playgroud)
        针对 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
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2596 次  |  
        
|   最近记录:  |