如何从 Swift 调用私有 macOS CoreFoundation 函数
How to Call a Private macOS CoreFoundation Function from Swift
我正在寻找一种在 Swift 代码(即 _CFPreferencesCopyApplicationMap
中使用私有 Apple API 的方法,它允许您查找用于用户的路径任何给定应用程序的默认值)。
请参阅 this 答案以了解动机和 Objective-C 解决方案。我能够在 Objective-C 中使用以下行执行此操作:
extern CFDictionaryRef _CFPreferencesCopyApplicationMap(CFStringRef userName, CFStringRef hostName);
我一直无法弄清楚如何在 Swift 中做同样的事情。我知道可以使用 NSClassFromString
或 NSSelectorFromString
在运行时动态访问 ObjC 对象,但据我所知这些不能与全局 C 函数一起使用。 NSInvocation
好像也出来了。
事实证明,这可以使用 :
@_silgen_name("_CFPreferencesCopyApplicationMap")
func _CFPreferencesCopyApplicationMap(_: CFString!, _: CFString!) -> CFDictionary!
// Then, call as:
let applicationMap = _CFPreferencesCopyApplicationMap(kCFPreferencesCurrentUser, kCFPreferencesAnyHost) as? [String: [URL]]
我正在寻找一种在 Swift 代码(即 _CFPreferencesCopyApplicationMap
中使用私有 Apple API 的方法,它允许您查找用于用户的路径任何给定应用程序的默认值)。
请参阅 this 答案以了解动机和 Objective-C 解决方案。我能够在 Objective-C 中使用以下行执行此操作:
extern CFDictionaryRef _CFPreferencesCopyApplicationMap(CFStringRef userName, CFStringRef hostName);
我一直无法弄清楚如何在 Swift 中做同样的事情。我知道可以使用 NSClassFromString
或 NSSelectorFromString
在运行时动态访问 ObjC 对象,但据我所知这些不能与全局 C 函数一起使用。 NSInvocation
好像也出来了。
事实证明,这可以使用
@_silgen_name("_CFPreferencesCopyApplicationMap")
func _CFPreferencesCopyApplicationMap(_: CFString!, _: CFString!) -> CFDictionary!
// Then, call as:
let applicationMap = _CFPreferencesCopyApplicationMap(kCFPreferencesCurrentUser, kCFPreferencesAnyHost) as? [String: [URL]]