如何在 Xamarin.Mac 中实现应用程序后台处理。我想要的东西类似于 android服务:
Android服务 - 服务是一个应用程序组件,可以在后台执行长时间运行的操作,而不是 提供用户界面。另一个应用程序组件可以启动 服务,即使用户,它仍然在后台运行 切换到另一个应用程序此外,组件可以绑定 与它交互甚至执行进程间的服务 通信(IPC)。例如,服务可以处理网络 交易,播放音乐,执行文件I / O或与内容交互 提供者,全部来自后台。 〜Android.com
先谢谢。
答案 0 :(得分:3)
正确的方法是使用{{3}将您的应用程序安装为 LaunchAgent (每用户实例)或 LaunchDaemon (每台机器实例) },以及'应用程序类型'设置(在" Xamarin Studio"或" Visual Studio for Mac"项目选项对话框)应设置为"可执行文件"而不是"可执行的UI" (或类似的。)
作为&#34; LaunchAgent&#34;您具有与桌面交互的选项,并且您的代码在每个登录用户的上下文中运行,而不是在系统进程帐户下运行。你不会在“停靠栏”中看到一块瓷砖。 (除非您分配NSApp),并且您只看到状态菜单栏&#39;如果您明确调用Mac API来实现它。此外,launchd将定期检查并启动您的进程,确保始终正在运行。)没有要求您使用任何Cocoa / Mac API来实现代理/守护程序,您可以运行任何<{1}}下的控制台应用程序,上述内容仍然适用。
对于macOS平台,与launchd的集成是launchd,它同样适用于Xamarin.Mac开发的应用程序,因为它可以用于任何其他平台/工具链(Java,C ++,Obj-C,SWift ,. ..),如果我不得不猜测学习如何使用launchd对大多数开发者来说是一个2-4小时的投资。
因为 Xamarin.Mac本身并不明确支持launchd (而且IMO不应该),所以您还需要自己调用launchd
。作为一名经验丰富的.NET开发人员,我发现它包含了所有的“启动”功能。在一个&#34;安装程序类&#34;运行良好(那么你只需运行non-trivial, but well documented来安装/卸载您的代理/服务/应用程序。)这些安装程序类也可以实现在Windows和Linux上运行,这意味着跨平台安装只需要使用launchctl
。
另外,installutil
,但这不是必需的。但是,大多数人会发现编辑现有的plist比与launchd集成更容易。值得注意的是,一个行为差异在于编辑plist以包含you can set particular properties in your app bundle Info.plist或LSBackgroundOnly
并不能保证您的应用程序正在运行,但使用installutil
会。
HTH
LSUIElement
Apple.com上的文章launchd
Apple.com上的手册页launchctl
参考Apple.com LSBackgroundOnly
参考Apple.com LSUIElement
在Microsoft.com上的参考(也适用于Mono / Xamarin Linux / Mac平台,尽管Windows使用自己的服务控制管理器(SCM)API而不是{{ 1}}。)