Xamarin.Mac 中的应用背景

Application backgrounding in Xamarin.Mac

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

的东西

Android Services - A Service is an application component that can perform long-running operations in the background, and it does not provide a user interface. Another application component can start a service, and it continues to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service can handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background. ~Android.com

提前致谢。

正确的方法是将您的应用程序安装为 LaunchAgent(每个用户实例)或 LaunchDaemon(每个用户实例-machine) 使用 launchd,'application type' 设置(在 "Xamarin Studio" 或 "Visual Studio for Mac" 项目选项对话框中)应设置为 "Executable" 而不是 "Executable with a UI"(或类似的。)

作为 "LaunchAgent",您有与桌面交互的 选项,而您的代码 运行 在每个登录用户的上下文中系统进程帐户。您不会在 'dock bar' 中看到磁贴(除非您分配了一个 NSApp),如果您显式调用 Mac API 来实现它,您只会看到 'status menu bar' .此外,launchd 将定期检查并启动您的进程,确保它 always 运行ning。)没有要求您使用任何 Cocoa/Mac APIs 来实现 agent/daemon,您可以 运行 launchd 下的任何控制台应用程序,以上内容仍然适用。

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

因为 Xamarin.Mac 本身并没有对 launchd 的明确支持(IMO 不应该),您还需要自己调用 launchctl。作为一名经验丰富的 .NET 开发人员,我发现将所有 'launchctl ugliness' 包装在 "installer class" 中效果很好(然后您只需要 运行 installutil 到 install/uninstall agent/service/application.) 这些安装程序 类 也可以在 Windows 和 Linux 上运行,这意味着跨平台安装只需要使用 installutil

另外,you can set particular properties in your app bundle Info.plist, but this is not necessary. However, most will find editing the existing plist easier than integrating with launchd. It's worth noting that one behavioral difference is that editing the plist to include either LSBackgroundOnly or LSUIElement 不能保证您的应用程序是 运行ning,但使用 launchctl 会。

HTH

参考资料

  • Creating Launch Daemons and Agents 关于 Apple.com
  • 的文章
  • How to Create a Background Running Cocoa Application 在 whosebug.com
  • launchd 关于 Wikipedia.org
  • 的文章
  • launchctl Apple.com
  • 上的手册页
  • LSBackgroundOnly 参考 Apple.com
  • LSUIElement 参考 Apple.com
  • installutil Microsoft.com 上的参考(也适用于 Mono/Xamarin Linux/Mac 平台,尽管 Windows 使用自己的 'Service Control Manager (SCM)' APIs 而不是 launchctl.)