Как включить расширение FinderSync в Системных настройках macOS

я интегрирую расширение FinderSync в мое приложение Cocoa, чтобы показать значки в файлах и папках. Посмотрите на два сценария ниже:

  1. когда я запускаю приложение с помощью расширения FinderSync (например, DemoFinderSync), посмотрите на синее всплывающее окно в приведенном ниже изображении, в этом случае расширение добавляется в системное предпочтение с галочкой и называется основным классом "FinderSync.м " тоже.

Screen shot 1

  1. когда я запускаю приложение используя мою схему приложения (например, DemoApp), посмотрите на синее всплывающее окно на изображении ниже, в этом случае расширение добавляется в системном предпочтении, но без флажка и этого основного класса "FinderSync.m " не звоните и расширение FinderSync не работает в этом случае.

Screen Shot 2

есть ли у кого-нибудь идея, как включить расширение 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: