【问题标题】:Application backgrounding in Xamarin.MacXamarin.Mac 中的应用程序后台
【发布时间】:2016-08-17 10:50:25
【问题描述】:

如何在 Xamarin.Mac 中实现应用程序后台。我想要类似于 android services 的东西:

Android 服务 - 服务是一个应用程序组件,可以在后台执行长时间运行的操作,它不 提供用户界面。另一个应用程序组件可以启动一个 服务,并且它继续在后台运行,即使用户 切换到另一个应用程序。此外,组件可以绑定到 与之交互甚至执行进程间的服务 通信(IPC)。例如,一个服务可以处理网络 事务、播放音乐、执行文件 I/O 或与内容交互 提供者,全部来自后台。 ~Android.com

提前致谢。

【问题讨论】:

标签: xamarin xamarin.mac


【解决方案1】:

正确的方法是使用launchd将您的应用程序安装为LaunchAgent(每用户实例)或LaunchDaemon(每机器实例),并且“应用程序类型”设置(在“Xamarin Studio”或“Visual Studio for Mac”项目选项对话框中)应设置为“可执行”而不是“可通过 UI 执行”(或类似内容)。

作为“LaunchAgent”,您拥有与桌面交互的选项,并且您的代码在每个登录用户的上下文而不是系统进程帐户下运行。您不会在“停靠栏”中看到磁贴(除非您分配了 NSApp),并且如果您明确调用 Mac API 来实现它,您只会看到“状态菜单栏”。此外,launchd 将定期检查并启动您的进程,确保它始终运行。)您不需要使用任何 Cocoa/Mac API 来实现代理/守护进程,您可以运行任何launchd 下的控制台应用程序,上述内容仍然适用。

对于 macOS 平台,与 launchd 的集成是 non-trivial, but well documented,它同样适用于 Xamarin.Mac 开发的应用程序,就像它适用于任何其他平台/工具链(Java、C++、Obj-C、SWift... ),如果我不得不猜测学习如何使用 launchd 对大多数开发人员来说是 2-4 小时的投资。

因为 Xamarin.Mac 本身并没有明确支持 launchd(而 IMO 不应该),您还需要自己调用 launchctl。作为一名经验丰富的 .NET 开发人员,我发现将所有“launchctl ugliness”包装在“安装程序类”中效果很好(然后您只需运行 installutil 即可安装/卸载您的代理/服务/应用程序。)这些安装程序类也可以实现在 Windows 和 Linux 上运行,这意味着跨平台安装只需要使用 installutil

另外,you can set particular properties in your app bundle Info.plist,但这不是必需的。然而,大多数人会发现编辑现有的 plist 比与 launchd 集成更容易。值得注意的是,一个行为差异是编辑 plist 以包含 LSBackgroundOnlyLSUIElement 并不能保证您的应用程序正在运行,但使用 launchctl 会。

HTH

参考文献

【讨论】:

  • 我发现这个答案非常有用和有用。我认为它应该被标记为正确答案。
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2023-03-12
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多