我有一个产生子流程的应用程序。这些子流程需要位于同一应用程序捆绑包中的XPCServices。
我的主应用程序的可执行文件位于 my.app/Contents/MacOS/my
我的XPC服务位于 my.app/Contents/XPCServices/com.my.service.xpc
当子进程驻留在中my.app/Contents/Resources/mysubprocess
,并且启动了应用程序时,我的子进程无法连接到XPC服务(为什么?),但是它没有显示在Dock中。
另一方面,如果子进程中my.app/Contents/MacOS/mysubprocess
的子进程成功连接到我的XPC服务(主应用程序不需要此XPC服务中的任何内容),则子进程突然在Dock中获得自己的弹跳图标。我猜OS X会检测是否从内部启动了某些东西,*.app/Contents/MacOS/*
并将其视为应用程序。
我显然需要它以这种方式工作,子进程可以连接到XPC服务,但是子进程保持隐藏状态,并且不会出现在Dock中。我曾尝试在运行时将LSUIElement和LSBackgroundOnly注册到我的用户默认设置,但这并不能解决问题。如果我将LSUIElement写入用户默认值,则我的主应用程序将不会获得主菜单,这也是不希望的(但在LSUIElementNO
绝对正确的情况下)。
基本上,我有两个问题:当我将子my.app/Contents/MacOS/
进程二进制文件移到外部时,它找不到XPCServices。我觉得有点奇怪,因为如果子流程位于in,则服务的相对路径保持不变my.app/Contents/Resources/
。我还在[NSBundle mainBundle]
调试子流程时进行了检查,即使它位于Resources
文件夹中,它也具有有效的路径。是否有办法以某种方式告诉我的子进程应该在哪里寻找我的XPC服务?
另一种方法是,我可以防止子进程在Dock中反弹。我的主应用程序需要其图标和菜单。因此,有没有一种方法可以在运行时指定子进程即使在my.app/Contents/MacOS/
文件夹中也不会启动Dock图标?
谢谢你
根据Apple Developer的文档,开发人员可以编写的XPC服务必须驻留在您应用程序的捆绑包中My.app/Contents/XPC Services
。您的应用只能连接到驻留在其中的XPC服务,而这些XPC服务只能从它们所在的捆绑包中的应用连接到。
(请注意,Apple在其系统框架中提供的XPC服务的工作方式有所不同:/System/Library/PrivateFrameworks/WebKit2.framework
包含使用WebKit2框架的任何进程使用的XPC服务。但是,框架再次连接到该XPC服务,而不是应用程序本身。)
如果您的子进程的二进制文件不在中,则可能是无法连接到XPC服务的原因My.app/Contents/MacOS/
。我不确定,但是您可以从驻留在任意位置的任意二进制文件连接到XPC服务,这MacOS
听起来似乎像个错误。但是我认为这不是因为XPC服务仅在代码签名确定的情况下才起作用,并且在MacOS
目录中放置任意二进制文件会破坏该代码签名。
至于停靠图标:您如何生成子流程?使用NSTask?常规应用程序本身是否使用XPC服务?如果不是,是否有任何原因导致子流程本身不是应用程序?这样,XPC服务可以位于子进程的/Contents/XPC Services
目录中,并且一切正常。
编辑:想到的另一种解决方案:不要使用XPC,而是通过Distributed Objects与您的子流程进行对话的单独流程。因为这不需要任何特殊的文件夹结构或类似的东西,所以您可以将所有辅助二进制文件放置在所需的任何位置,从而可以避免Dock图标弹跳的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句