macOS/Obj-C的新手,你的错误是什么?

既然你提到是 macOS/Obj-C 的新手,让我们从一些背景信息开始:​​​​​

现在,谈谈你的错误。我在开发自己的应用程序时遇到了同样的问题,它实际上是一个应用程序包,但我通常也直接运行包含的二进制文件,因为它更容易。但是,在尝试获取 currentNotificationCenter 时,这也总是会崩溃。就像打开 someapp.app 一样运行它。我比较了两种方式运行时的控制台输出,当它崩溃时,它说没有使用 URL <private> 注册的捆绑包。我猜测通过绕过 LS 将不会设置“捆绑代理”并且事情开始崩溃。或者也许捆绑代理已经在运行,但我的应用程序的捆绑标识符根本没有在其“引擎”中注册(因为缺少更好/已知的术语)。直接运行时,创建对话框警报等其他操作仍然有效,因此使用几乎任何 GUI 功能都不会 t 似乎会立即取消您在 LS 之外运行二进制文件的资格。我认为这是一种安全措施,可以防止任何基于 CLI 的程序发出通知。

图片[1]-macOS/Obj-C的新手,你的错误是什么?-唐朝资源网

有几种选择:

图片[2]-macOS/Obj-C的新手,你的错误是什么?-唐朝资源网

也许只是运行 open ./app 就可以了。至少在我的情况下,它会打开一个新的终端窗口,但崩溃消失并且通知确实有效。这可能是因为它仍然包含在应用程序包中,但 LS 检测到了这一点。

图片[3]-macOS/Obj-C的新手,你的错误是什么?-唐朝资源网

否则,您可能需要创建一个应用程序包。您仍然可以通过这种方式创建无 GUI 的应用程序,但可能需要一些额外的步骤来删除 GUI,具体取决于您是否要使用 Xcode。我一直在用它来创建一个用户界面:基于 XIB 的“App”项目。项目创建向导不允许您选择无接口,因此您需要删除该接口。您可能能够在没有 Xcode 的情况下弄清楚如何做到这一点,但我不知道 100% Xcode 做了什么来实际输出一个工作的应用程序包。所以,对于 Xcode:

图片[4]-macOS/Obj-C的新手,你的错误是什么?-唐朝资源网

在项目导航器(应该是左侧边栏)中,单击顶层节点(您的项目名称)。在左侧边栏中选择“目标”而不是项目本身。然后确保在顶部选项卡栏上选择了常规。第一部分应该是部署信息,带有一个选项主界面。清除该框。从您的项目中删除实际的 XIB 文件。在 Info.plist 中添加新行:Application is agent (UIElement),值为 YES。实际的 XML 键是 LSUIElement。检查用作应用程序的主要“委托”的 Cocoa 类的名称。默认情况下,这应该只是 AppDelegate。将您的原始代码移动到 AppDelegate 类的 applicationDidFinishLaunching 函数中。main.m 中的入口点应如下所示:

现在,当您运行应用程序时,Dock 上没有图标,因为它已设置为“代理”。它甚至不尝试渲染任何视图,因为我们删除了这些视图。当然,如果您想接受来自终端的用户输入,这将不起作用。可能有一些东西,但我认为这超出了这个问题的范围。

只剩下一个细节:通过 LS 从终端运行应用程序并能够 Ctrl+C/中断它。可能实现类似行为的唯一方法是 trap : INT; 打开-W someapp.app;killall someapp 2>/dev/null. -W 标志使 open 命令阻塞,直到应用程序退出,但中断它实际上不会将信号发送到您的应用程序(但仍要打开)。因此,如果应用程序自行退出/异常退出,killall 会杀死任何先前的实例并重定向到 null 以抑制任何错误。只要确保你不称它为 loginwindow 或任何东西。=] 陷阱用于确保中断信号仅适用于当前运行的命令,而不是一次适用于整个链。您甚至可以将该行包装在一个不错的旧 .sh 脚本中,陷阱也会这样做,所以它不会

© 版权声明
THE END
喜欢就支持一下吧
点赞237 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片