2016-12-07 11 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モデルでは完全に機能します。しかし、このファイルを全く同じモデル(またはこれも試してみました)の誰かに送ると、ボタンを押しても何も起こりません。これは完全にコンパイルされ、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を使用することによってこの問題を解決することができました。私はそれを使用している他の機能は直接Xcodeでいる間は、次の出力ファイル/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 

を、この機能は、Xcodeの外で作業を行いますが、このエラーの調査中ではなく、このエラーの調査時に、私はこれを見つけましたanswer。単純にスラッシュを追加し、absoluteStringではなくpathを使用するだけで問題は解決しました。

pathabsoluteString、@ dfdと@JWWalkerの違いについては、@MartinRに感謝したいと思います。

1

多分タイミング問題です... openはアプリが完全になくなる前にopenコマンドが実行されると、何もしないと思うかもしれません。とにかく、openを使用するあなたのアプローチは不必要に複雑に思えます。 (私はスウィフトを知らない、私のObjective-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で実行できることは、Swiftで行うことができますか?あるいは、 'open'を使いたい場合は、' -n'フラグを追加してみてください。 – JWWalker

関連する問題