2016-12-07 2 views
0

Я использую эту функцию ниже под кнопкой, чтобы перезапустить приложение.Почему мое приложение не перезагружается на других компьютерах Mac?

func relaunchApp() {  
let url = URL(fileURLWithPath: Bundle.main.resourcePath!) 
let path = url.deletingLastPathComponent().deletingLastPathComponent().absoluteString 
let task = Process() 
task.launchPath = "/usr/bin/open" 
task.arguments = [path] 
task.launch() 
exit(0) } 

Это прекрасно работает на моей модели Macbook Air 2015. Однако, когда я отправляю этот файл кому-либо еще с той же самой моделью (или Mac Mini, я также пробовал это), ничего не происходит после нажатия кнопки. Это происходит в обоих условиях, когда он полностью скомпилирован и просто выполняется с Xcode, либо работает на моей стороне. Как я могу решить эту проблему?

+0

'.absoluteString' * не * правильный метод для создания пути из URL-адреса, он должен быть' .path'. Сравните http://stackoverflow.com/questions/34135305/nsfilemanager-defaultmanager-fileexistsatpath-returns-false-instead-of-true. –

+0

Различные блоки безопасности, в зависимости от версии ОС, параметры безопасности для пользователя и начало/открытие приложения/загрузки. – dfd

+0

Функция все еще работала на моей стороне, но Airdropped это для Mac Mini (macOS 10.11.6) и все еще ничего. @MartinR – dylan

ответ

0

Я был в состоянии решить эту проблему путем добавления / к началу resourcepath и используя path, а не absoluteString.

func relaunchApp() { 
    let fullUrl = "/" + Bundle.main.resourcePath! 
    let url = URL(fileURLWithPath: fullUrl) 
    let path = url.deletingLastPathComponent().deletingLastPathComponent().path 
    let task = Process() 
    task.launchPath = "/usr/bin/open" 
    task.arguments = [path] 
    task.launch() 
    exit(0) } 

я обнаружил этот вопрос, когда другая функция я использую, который непосредственно открывает файл /System/Library/PreferencePanes/Bluetooth.prefPane, который в то время как в Xcode, выдаваемого следующее:

2016-12-09 11:51:56.749 Application[90077:1633677] launch path not accessible 

Теперь эта функция делает работу за пределами Xcode, но не внутри, и после исследования этой ошибки я нашел это answer. Просто добавьте косую черту и используйте path, а не absoluteString.

Я хотел бы поблагодарить @MartinR за упоминание разницы между path и absoluteString, @dfd и @JWWalker за помощь, которую они предоставили.

1

Возможно, это проблема синхронизации ... если команда open запускается до того, как ваше приложение полностью ушло, open может подумать, что ему нечего делать. Во всяком случае, ваш подход к использованию open кажется излишне сложным. Попробуйте это (простите мой Objective-C, я не знаю Swift):

NSError* err = nil; 
[[NSWorkspace sharedWorkspace] 
    launchApplicationAtURL: [[NSBundle mainBundle] bundleURL]] 
    options: NSWorkspaceLaunchAsync | NSWorkspaceLaunchNewInstance 
    configuration: nil 
    error: &err ]; 
[NSApp terminate: NSApp]; 
+0

eh, я не могу действительно преобразовать асинхронную и новую часть экземпляра. – dylan

+0

Я попробую добавить 'dispatchQueue' за некоторое время и посмотреть, какие (если они есть) работают. – dylan

+0

Что значит, вы не можете преобразовать асинхронную и новую часть экземпляра? Все, что можно сделать в Objective-C, можно сделать в Swift, нет? Или, если вы хотите использовать 'open', вы можете попробовать добавить флаг' -n'. – JWWalker

Смежные вопросы