如何在 Xamarin.Mac 中实现应用程序背景。我想要的东西类似于 android服务:

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

提前致谢。

最佳答案

正确的方法是使用launchd以及“应用程序类型”设置(在“Xamarin Studio”或“Visual Studio for Mac“项目选项对话框”)应设置为“Executable”,而不是“UI可执行”(或类似名称)。

作为“LaunchAgent”,您可以选择与桌面进行交互,并且您的代码在每个登录用户而不是系统进程帐户的上下文下运行。您将不会在“停靠栏”中看到磁贴(除非您分配了NSApp),并且仅在显式调用Mac API使其实现时才看到“状态菜单栏”。此外,launched将定期检查并启动您的进程,以确保其始终运行。)无需使用任何Cocoa / Mac API来实现代理/守护程序,则可以在launchd及以上版本下运行任何控制台应用程序仍然会是真的。

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

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

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

高温超导

参考文献

  • Creating Launch Daemons and Agents Apple.com上的文章
  • Stackoverflow.com上的
  • How to Create a Background Running Cocoa Application
  • launchd Wikipedia.org上的文章
  • launchctl Apple.com上的手册页
  • LSBackgroundOnly 在Apple.com上的参考
  • LSUIElement 在Apple.com上的参考
  • installutil Microsoft.com上的参考(同样适用于Mono / Xamarin Linux / Mac平台,尽管Windows使用其自己的“服务控制管理器(SCM)” API而不是launchctl。)
  • 10-07 16:18
    查看更多