サンドボックス化された MacOS とサンドボックス化されていない MacOS の両方で実行することを目的としたアプリケーションがあります。ユーザーが MacOS 10.6 からそれ以降の OS にアップグレードする場合、安全なブックマークでブックマークできるように、ユーザーにフォルダーを再選択してもらう必要があります。
アプリケーションがサンドボックス化をサポートする OS 上にあることを検出するにはどうすればよいですか?
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);
}