..
This commit is contained in:
parent
95e44b18d0
commit
0c7c27fa51
@ -65,6 +65,7 @@ import service.TradingDecisionCallback
|
|||||||
import ui.SettingsScreen
|
import ui.SettingsScreen
|
||||||
import ui.TradingDecisionLog
|
import ui.TradingDecisionLog
|
||||||
import util.PortFinder
|
import util.PortFinder
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
// 화면 상태 정의
|
// 화면 상태 정의
|
||||||
enum class AppScreen { Settings, Dashboard, TradingDecision }
|
enum class AppScreen { Settings, Dashboard, TradingDecision }
|
||||||
@ -158,8 +159,47 @@ fun main() = application {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mac OS 전용: '확인되지 않은 개발자' 보안(Gatekeeper) 해제 및 실행 권한 부여
|
||||||
|
* @param targetPath 권한을 풀 파일 또는 폴더의 절대 경로
|
||||||
|
*/
|
||||||
|
fun unlockMacPermissions(targetPath: String) {
|
||||||
|
val os = System.getProperty("os.name").lowercase()
|
||||||
|
if (!os.contains("mac")) return // Mac 환경이 아니면 조용히 패스
|
||||||
|
|
||||||
|
val targetFile = File(targetPath)
|
||||||
|
if (!targetFile.exists()) {
|
||||||
|
println("⚠️ [System] 권한을 부여할 경로를 찾을 수 없습니다: $targetPath")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
println("🔓 [System] Mac 보안 권한 해제 시도 중... ($targetPath)")
|
||||||
|
|
||||||
|
// 1. Apple Quarantine(격리) 속성 제거 (가장 중요!)
|
||||||
|
// 악성코드 방지 시스템(Gatekeeper)이 dylib 파일들을 차단하는 것을 막습니다.
|
||||||
|
val xattrProcess = ProcessBuilder("xattr", "-cr", targetPath)
|
||||||
|
.redirectErrorStream(true)
|
||||||
|
.start()
|
||||||
|
xattrProcess.waitFor()
|
||||||
|
|
||||||
|
// 2. 실행 권한 부여 (chmod -R 777)
|
||||||
|
// -R 옵션으로 하위의 모든 라이브러리 파일까지 권한을 엽니다.
|
||||||
|
val chmodProcess = ProcessBuilder("chmod", "-R", "777", targetPath)
|
||||||
|
.redirectErrorStream(true)
|
||||||
|
.start()
|
||||||
|
chmodProcess.waitFor()
|
||||||
|
|
||||||
|
println("✅ [System] Mac 권한 해제 및 실행 권한 부여 완료!")
|
||||||
|
|
||||||
|
} catch (e: Exception) {
|
||||||
|
println("❌ [System] Mac 권한 부여 실패: ${e.message}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 앱 실행 시 필요한 바이너리 경로 (실행 파일 위치)
|
// 앱 실행 시 필요한 바이너리 경로 (실행 파일 위치)
|
||||||
val binPath = getLlamaBinPath()
|
val binPath = getLlamaBinPath()
|
||||||
|
unlockMacPermissions(binPath)
|
||||||
val windowState = rememberWindowState(
|
val windowState = rememberWindowState(
|
||||||
placement = WindowPlacement.Floating
|
placement = WindowPlacement.Floating
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user