我正在为OS X编写一个框架,可以由有或没有与OS X WindowServer连接的应用程序使用(即GUI应用程序和命令行应用程序都通过例如ssh会话运行)。框架中的一个类是用于跨越网络和移动主目录跟踪用户主文件夹中的文件(在OS X上,用户可以通过AFP从服务器提供其主目录 - “网络主目录” - 或者具有同步的主文件夹同步用于离线访问 - “移动主目录”)。
因为我需要跨文件系统跟踪文件,所以我们选择使用相对路径,而不是OS X别名(或10.6 NSURL
书签)。当找不到文件时,我需要询问用户输入以重新定位该文件(例如Alias Manager如何提示用户重新连接损坏的别名)。如果应用程序具有(或可以建立)与WindowServer的连接,则这与使用NSOpenPanel
一样简单。但是,当应用程序无法建立与WindowServer的连接时,我需要使用另一种方法来获取用户输入。
那么,如何在famework代码中告诉使用哪种方法?有没有办法以编程方式确定WindowServer连接是否可用(或可能)?
我认识到一种替代架构,其中框架客户端提供回调机制来提示用户将允许调用应用程序提供输入收集策略。我想为调用应用程序尽可能简单,因此,如果可以的话,我的第一选择就是将这些细节封装在框架中。
答案 0 :(得分:7)
有一个名为SECURITYSESSIONID
的环境变量,由loginwindow.app设置,并将get传递给用户的应用程序。如果您通过ssh登录,则不会设置该变量。它可以作为与窗口服务器通信的句柄。
问题:此变量的存在并不意味着此用户当前控制窗口管理器(想想快速用户切换)。
在ApplicationServices框架中有一个名为CGSessionCopyCurrentDictionary
的函数看起来很有希望:
返回值:窗口服务器会话字典,如果调用者未在Quartz GUI会话中运行或窗口服务器被禁用,则为NULL。您应该在完成字典使用后释放字典。有关此字典中键值对的信息,请参阅“窗口服务器会话属性”。