Как включить расширение FinderSync в Системных настройках macOS
я интегрирую расширение FinderSync в мое приложение Cocoa, чтобы показать значки в файлах и папках. Посмотрите на два сценария ниже:
- когда я запускаю приложение с помощью расширения FinderSync (например, DemoFinderSync), посмотрите на синее всплывающее окно в приведенном ниже изображении, в этом случае расширение добавляется в системное предпочтение с галочкой и называется основным классом "FinderSync.м " тоже.
- когда я запускаю приложение используя мою схему приложения (например, DemoApp), посмотрите на синее всплывающее окно на изображении ниже, в этом случае расширение добавляется в системном предпочтении, но без флажка и этого основного класса "FinderSync.m " не звоните и расширение FinderSync не работает в этом случае.
есть ли у кого-нибудь идея, как включить расширение Finder в системном предпочтении, используя второй сценарий?
3 ответов
Я нашел решение:
код для включения расширения (bundle ID)
system("pluginkit -e use -i YourAppBundleID")
код для отключения расширения (bundle ID)
system("pluginkit -e ignore -i YourAppBundleID")
прежде, чем я использовал:
system("pluginkit -e use -i AppBundleID.FinderSync")
Так что просто удалите ".FinderSync" его рабочих.
схема без отладки (#if !DEBUG):
system("pluginkit -e use -i com.domain.my-finder-extension");
при запуске под отладчиком дайте путь к вашему расширению напрямую:
NSString *pluginPath = [[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:@"My Finder Extension.appex"];
NSString *pluginkitString = [NSString stringWithFormat:@"pluginkit -e use -a \"%@\"", pluginPath];
system([pluginkitString cStringUsingEncoding:NSUTF8StringEncoding]);
укажите это в методе applicationDidFinishLaunching. Вы также должны вручную включить его только один раз, чтобы, если пользователь отключил расширение в Системных настройках, вы не включали его при каждом запуске приложения. Я установил ключ NSUserDefaults при первом запуске приложения с расширением Finder sync поддержка.
связывание ответа, который я нашел на форуме разработчиков Apple:
https://forums.developer.apple.com/thread/77682
когда ваше приложение вне песочницы, вы можете использовать:
Цель-C:
system("pluginkit -e use -i <yourFinderExtensionBundleID>");
Свифт:
let pipe = Pipe()
let task = Process()
task.launchPath = "/usr/bin/pluginkit"
task.arguments = ["-e", "use", "-i", "<yourFinderExtensionBundleID>"]
task.standardOutput = pipe
let file = pipe.fileHandleForReading
task.launch()
let result = NSString(data: file.readDataToEndOfFile(), encoding: