Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c OSX用于同一应用程序的两个停靠图标_Objective C_Xcode_Macos_Exec_Dock - Fatal编程技术网

Objective c OSX用于同一应用程序的两个停靠图标

Objective c OSX用于同一应用程序的两个停靠图标,objective-c,xcode,macos,exec,dock,Objective C,Xcode,Macos,Exec,Dock,我有两个相同应用程序的版本:位于/Applications(app1)中的版本1和位于/ApplicationSupport(app2)中的版本2。在本文中,我希望在启动app1时重定向到app2,这意味着退出app1并启动app2。(我已经使用命令行工具实现了这一点,它将等待app1完成,然后启动app2) 此应用程序的LSUIElement=1(主要是状态项),但该应用程序可能会出现在dock中:如果从状态项打开窗口,则我会: TransformProcessType(&psn, k

我有两个相同应用程序的版本:位于/Applications(app1)中的版本1和位于/ApplicationSupport(app2)中的版本2。在本文中,我希望在启动app1时重定向到app2,这意味着退出app1并启动app2。(我已经使用命令行工具实现了这一点,它将等待app1完成,然后启动app2)

此应用程序的LSUIElement=1(主要是状态项),但该应用程序可能会出现在dock中:如果从状态项打开窗口,则我会:

TransformProcessType(&psn, kProcessTransformToForegroundApplication);
当窗户关闭时,我会:

TransformProcessType(&psn, kProcessTransformToUIElementApplication);
问题

t我面临的问题是,如果用户为app1选择Keep in dock,app1重定向到app2,则用户将在dock中显示两个应用程序图标

我正在寻找克服这种行为的方法

问题:

  • 有人试过对exec*家族这样做吗?从文档中我了解到,使用它应该将app1映像替换为app2映像,因此它应该可以帮助我解决问题。我尝试了execl和execle,但没有达到预期的效果。请注意,当使用EXCLE启动时,在XCode中,我在dyld_start中遇到一些程序集异常,app2启动成功,但有时我在日志中遇到一些错误(无法找到出口或操作。不确定这些错误是否与execl相关)

  • 是否有任何方法可以修复此行为,或者欺骗dock.app使其认为这是同一个应用程序?我试着在启动app2之前修改“persisten apps”数组,以使用dock app的默认设置,但它需要重新启动dock.app才能使更改生效

  • 我们将非常感谢您的帮助

    谢谢

    编辑:

    1。我创建了一个LSUIElement=0的测试应用程序,并使用execl,一切正常。如果我在app1中选择“保持在dock中”,在用execl打开app2之后,我在dock中只得到一个图标

    2。如果对于同一个应用程序,我将LSUIElement设置为1,并显示dock图标(使用TransformProcessType),则在使用execl启动app2后,我将得到两个dock图标。 这意味着在app1上,我转换到前台并选择keep in dock。在我用execl执行app2之后,如果我将进程转换为前台,我会在dock bar中得到两个图标

    有人能解决这种行为吗?
    有人使用TransformProcessType和execl吗?

    我认为这是不可能实现的,因为Dock将图标从加载的应用程序中保留下来。我有一个不好的想法,这可能会奏效。您可以尝试使用app1中的
    dlopen
    或类似内容动态加载app2,然后从加载的映像调用main。这样操作系统就不知道你启动了另一个应用程序,Dock也不知道。我担心
    NSBundle
    或其他类之后可能会出错。我创建了一个LSUIElement=0的测试应用程序,似乎execl工作正常。只显示一个停靠图标!但是,如果我将LSUIElement设置为1,并在app2上显示带有TransformProcessType(&psn,kProcessTransformToForegroundApplication)的dock图标,则dock中会显示一个额外的图标(app1中的一个图标和app2中的另一个图标)。不知道我能不能克服这个问题。