I have an application running in the sandbox which launches an application bundle using NSTask.
The main app entitlements enable sandbox add the User Selected File Read/Write permission.
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
</dict>
The child app entitlements enable sandbox and inherit.
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
When invoke NSSavePanel *savePanel = [NSSavePanel savePanel] in the child process, system will throw the error.The error message prompt that missing the User Selected File Read/Write permission.
However, I have already added this permission in the main app, and I have set up the inherit in the child-process as well. The child process cannot add the User Selected File Read/Write permission again because it add sandbox and inherit in entitlements by the doc EnablingAppSandbox . It appears that the system is not inheriting this permission for the child process.
panel[60195:2499353] [OpenSavePanels] Unable to display save panel: your app is missing the User Selected File Read/Write app sandbox entitlement. Please ensure that your app's target capabilities include the proper entitlements.
And the error stack.
[miscellany] CLIENT ERROR: remote view delegate NSSavePanel lacks method which can react to the details of Error Domain=com.apple.ViewBridge Code=14 "(null)" UserInfo={com.apple.ViewBridge.error.hint=-[NSViewServiceMarshal bootstrap:withReply:] caught NSInternalInconsistencyException '+[NSOpenAndSavePanelService loadViewToService:isOpenPanel:appCentric:] : failed entitlements check' with backtrace (
"0 CoreFoundation __exceptionPreprocess + 242",
"1 libobjc.A.dylib objc_exception_throw + 48",
"2 CoreFoundation -[NSException raise] + 9",
"3 com.apple.appkit.xpc.openAndSavePan com.apple.appkit.xpc.openAndSavePan + 16852",
"4 AppKit -[NSViewController _loadViewIfRequired] + 72",
"5 AppKit __24-[NSViewController view]_block_invoke + 27",
"6 AppKit NSPerformVisuallyAtomicChange + 132",
"7 AppKit -[NSViewController view] + 123",
"8 ViewBridge -[NSViewServiceMarshal _bootstrap:replyData:completion:] + 1826",
"9 ViewBridge -[NSViewServiceMarshal bootstrap:withReply:] + 245",
"10 CoreFoundation __invoking___ + 140",
"11 CoreFoundation -[NSInvocation invoke] + 305",
"12 CoreFoundation -[NSInvocation invokeWithTarget:] + 70",
"13 ViewBridge -[NSVB_ViewServiceImplicitAnimationDecodingProxy forwardInvocation:] + 178",
"14 CoreFoundation ___forwarding___ + 756",
"15 CoreFoundation _CF_forwarding_prep_0 + 120",
"16 CoreFoundation __invoking___ + 140",
"17 CoreFoundation -[NSInvocation invoke] + 305",
"18 CoreFoundation -[NSInvocation invokeWithTarget:] + 70",
"19 ViewBridge -[NSVB_QueueingProxy forwardInvocation:] + 321",
"20 CoreFoundation ___forwarding___ + 756",
"21 CoreFoundation _CF_forwarding_prep_0 + 120",
"22 CoreFoundation __invoking___ + 140",
"23 CoreFoundation -[NSInvocation invoke] + 305",
"24 CoreFoundation -[NSInvocation invokeWithTarget:] + 70",
"25 CoreFoundation ___forwarding___ + 756",
"26 CoreFoundation _CF_forwarding_prep_0 + 120",
"27 CoreFoundation __invoking___ + 140",
"28 CoreFoundation -[NSInvocation invoke] + 305",
"29 ViewBridge __deferNSXPCInvocationOntoMainThread_block_invoke + 142",
"30 ViewBridge __wrapBlockWithVoucher_block_invoke + 37",
"31 ViewBridge kNotRunningOnAppKitCompatibleThread_block_invoke + 323",
"32 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12",
"33 CoreFoundation __CFRunLoopDoBlocks + 398",
"34 CoreFoundation __CFRunLoopRun + 2015",
"35 CoreFoundation CFRunLoopRunSpecific + 560",
"36 HIToolbox RunCurrentEventLoopInMode + 292",
"37 HIToolbox ReceiveNextEventCommon + 657",
"38 HIToolbox _BlockUntilNextEventMatchingListInModeWithFilter + 64",
"39 AppKit _DPSNextEvent + 858",
"40 AppKit -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1214",
"41 ViewBridge __77-[NSViewServiceApplication vbNextEventMatchingMask:untilDate:inMode:dequeue:]_block_invoke + 111",
"42 ViewBridge -[NSViewServiceApplication _withToxicEventMonitorPerform:] + 114",
"43 ViewBridge -[NSViewServiceApplication vbNextEventMatchingMask:untilDate:inMode:dequeue:] + 151",
"44 ViewBridge -[NSViewServiceApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 99",
"45 AppKit -[NSApplication run] + 586",
"46 AppKit NSApplicationMain + 817",
"47 libxpc.dylib _xpc_objc_main + 867",
"48 libxpc.dylib xpc_main + 96",
"49 ViewBridge xpc_connection_handler + 0",
"50 ViewBridge NSViewServiceMain + 1789",
"51 com.apple.appkit.xpc.openAndSavePan main + 178",
"52 dyld start + 1903"
), com.apple.ViewBridge.error.description=NSViewBridgeErrorServiceBootstrap}
Post
Replies
Boosts
Views
Activity
I have an application which will launches another application as a child process.
The child application does not need the dock icon, we use [NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory]; to achieve it.
However, I have discovered that the dock icon cannot be perfectly hidden.
The number of recently used apps that aren’t already in dock(not choose keep in dock) less than three: The icon of the child application remains in the dock without being hidden.
The number of recently used apps that aren’t already in dock(not choose keep in dock) more than three: The icon of the child application appears a few milliseconds.
Even though add LSUIElement key in the Info.plist can work, we are seeking a programmatic modification.
I have some questions about the behavior of encode.
For example, with the following code, when we encode a very large string, the result is an empty array.
So if memory allocation fails due to insufficient system memory or other reasons, and the returned Uint8Array is not successfully created, what will we get? An empty array, an exception, or an OOM crash?
const encoder = new TextEncoder();
const encoded = encoder.encode(largeText);