Как вызвать частную функцию MacOS CoreFoundation из Swift - PullRequest
0 голосов
/ 13 июля 2020

Я ищу способ использовать частный API Apple из кода Swift (а именно, _CFPreferencesCopyApplicationMap, который позволяет вам искать пути, используемые для пользовательских значений по умолчанию для любого данного приложения).

См. этот ответ для получения информации о мотивации и решении задачи C. Я смог сделать это в Objective- C с помощью строки:

extern CFDictionaryRef _CFPreferencesCopyApplicationMap(CFStringRef userName, CFStringRef hostName);

Я не смог понять, как сделать то же самое в Swift. Я знаю, что можно динамически получать доступ к объектам Obj C во время выполнения, используя NSClassFromString или NSSelectorFromString, но, насколько я могу судить, они не могут использоваться с глобальными функциями C. NSInvocation похоже, тоже нет.

1 Ответ

0 голосов
/ 21 августа 2020

Оказывается, это возможно с помощью @ _ silgen_name :

@_silgen_name("_CFPreferencesCopyApplicationMap")
func _CFPreferencesCopyApplicationMap(_: CFString!, _: CFString!) -> CFDictionary!

// Then, call as:
let applicationMap = _CFPreferencesCopyApplicationMap(kCFPreferencesCurrentUser, kCFPreferencesAnyHost) as? [String: [URL]]
...