2016-12-07 1 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

OS 버전, 사용자의 보안 설정 및 이전에 앱/다운로드를 시작했는지 여부에 따라 다양한 보안 블록이 있습니다. – dfd

+0

기능은 여전히 ​​내 편이었지만, Mac mini (MacOS 10.11.6)에 Airdropped가 실행되었습니다. @MartinR – dylan

답변

0

내가 resourcepath의 시작 부분에 /을 추가하고 absoluteString보다는 path를 사용하여이 문제를 해결 할 수 있었다. 나는 그것을 사용하고 다른 함수를 직접 엑스 코드에있는 동안 다음과 같은 출력 파일 /System/Library/PreferencePanes/Bluetooth.prefPane, 열 때

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) } 

나는이 문제를 발견 : 이제

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

을,이 기능은 엑스 코드 이외의 작업을 수행하지만, 이 오류에 대한 연구를하지 않았을 때, 그리고이 오류가 발견되었을 때 나는 이것을 answer이라고 발견했다. 단순히 슬래시를 추가하고 absoluteString 대신 path을 사용하면 문제가 해결됩니다.

pathabsoluteString, @dfd 및 @JWWalker의 차이점에 대해 @MartinR에게 감사의 말을 전합니다.

1

아마도 타이밍 문제 일 수 있습니다. 앱이 완전히 사라지기 전에 open 명령이 실행되면 아무런 관련이 없다고 생각할 수 있습니다. 어쨌든 open을 사용하는 방법은 불필요하게 복잡해 보입니다. (내가 스위프트를 모르는, 내 목표 - C를 사면)이 시도 :

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

어, 난 비동기 및 새 인스턴스 부분을 변환 할 수 없습니다. – dylan

+0

일부 설정 시간에 대해 'dispatchQueue'를 추가하고 어떤 것이 작동하는지 확인해 보겠습니다. – dylan

+0

비동기 및 새 인스턴스 부분을 변환 할 수 없다는 것은 무엇을 의미합니까? Objective-C에서 할 수있는 일은 스위프트에서 할 수 있습니다. 또는'open'을 사용하려면'-n' 플래그를 추가하십시오. – JWWalker

관련 문제