我根本不是 swiftui 程式員,但我試圖創建一個非常簡單的應用程式來.sh為我運行腳本,我嘗試過無休止地使用谷歌搜索,但似乎無法讓它作業。我還嘗試過從終端快速運行命令(因為 .sh 腳本只是 cd 到一個位置并運行一個 jar)。
import SwiftUI
struct ContentView: View {
@State var isRunning = false
var body: some View {
VStack {
HStack {
Button(action: {
let executableURL = URL(fileURLWithPath:"/Users/myname/Desktop/run.sh")
self.isRunning = true
try! Process.run(executableURL,
arguments: [],
terminationHandler: { _ in self.isRunning = false })
}) {
Text("Run")
}.disabled(isRunning)
.padding(.trailing)
}
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我還運行chmod x run.sh了檔案以及禁用目標/應用程式本身的沙盒
它構建得很好,但是當按下按鈕時,xCode 中會出現錯誤
Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=4 "The file “run.sh” doesn’t exist." UserInfo={NSFilePath=/Users/myname/Desktop/run.sh}
即使我 100% 肯定我在桌面上有那個檔案,并且擴展名正確。
有任何想法嗎?
uj5u.com熱心網友回復:
除非用戶明確選擇訪問路徑,否則無法訪問該Desktop路徑,由于sandbox限制Apple,可以在下面找到,Signing & Capabilities但您可以做的是您可以強制用戶選擇他們想要運行的腳本檔案,或者您可以放置您的腳本到File Access部分定義的檔案夾之一

用這樣的代碼:
if let path = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first { // or .documentsDirectory
// also use .downloadsDirectory if and only if you allowed `Downloads Folder` on `Signing & Capabilities`
let executableURL = path.appendingPathComponent("new.sh")
self.isRunning = true
try! Process.run(executableURL,
arguments: [],
terminationHandler: { _ in self.isRunning = false })
}
你也可以documentsDirectory像所有其他應用程式一樣使用。信不信由你,Apple做這種限制真的很好,因為如果所有應用程式都可以訪問桌面目錄,寫入/洗掉和編輯所有內容并弄臟桌面的美麗場景,那將是可怕的,更不用說安全問題了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522060.html
標籤:迅速代码按钮迅捷
上一篇:輸入輸出按鈕
