我在沙箱中有一个应用程序(用于App Store部署),需要将一个文件安装到/ usr / libexec / cups / filter /中,将两个文件安装到/ private / etc / cups /中。此安装不是定期完成,而是从UI执行时。当要求“完全磁盘访问”或通过其他方式时,这可能吗?
var inFilePath = Bundle.main.url(forResource: "thnucups", withExtension: nil, subdirectory: "thnuclnt/x86_64-darwin")!
let inFile: FileHandle? = try! FileHandle(forReadingFrom: inFilePath)
let data = inFile?.readDataToEndOfFile()
inFile?.closeFile()
var destPath = "/usr/libexec/cups/filter/test";
let outFileUrl = URL(fileURLWithPath: destPath)
FileManager.default.createFile(atPath: destPath, contents: nil, attributes: nil)
let outFile: FileHandle? = try! FileHandle(forWritingTo: outFileUrl)
outFile?.write(data!)
outFile?.closeFile()
让outFile:FileHandle? =尝试! FileHandle(forWritingTo:outFileUrl)引发以下异常:
2019-07-29 15:16:46.985094 + 0200 ezeep Connector for macOS [33450:488523]致命错误:'尝试!'表达式意外引发错误:Error Domain = NSCocoaErrorDomain Code = 4“文件“ test”不存在”。 UserInfo = {NSFilePath = / usr / libexec / cups / filter / test,NSUnderlyingError = 0x600000c5e610 {Error Domain = NSPOSIXErrorDomain代码= 2“没有这样的文件或目录”}}:文件/ Users / rwelz / Documents / Develop / PROJEKTE / ThinPrint / in适用于macOS的GIT / ThinPrint / EZEEP / Xcode / ezeep连接器/适用于macOS / ezDeep连接器/AppDelegate.swift,行146
现在带有:
let dialog = NSOpenPanel()
dialog.allowsMultipleSelection = false
dialog.canCreateDirectories = false
dialog.canChooseDirectories = true
dialog.canChooseFiles = false
dialog.begin
{ (result) -> Void in
if result == .OK
{
let url = dialog.url
do
{
try data?.write(to: outFileUrl)
}
catch
{
print("Error: Exception caught: " + error.localizedDescription)
}
}
}
我不再遇到异常,但是由于/ usr / libexec / cups / filter具有drwxr-xr-x根轮(没有以root身份运行时没有写访问权限),我得到“您没有权限将文件“ test”保存在文件夹过滤器中]
我需要以root用户身份运行,这在沙箱中是不允许的。
还有其他想法吗?
罗伯特
我决定构建一个pkg安装程序,该安装程序可以从沙盒应用程序中的菜单项保存到磁盘。当应用程序首次启动时,还会提供保存对话框。然后,用户必须打开pkg并以admin身份验证才能开始安装。在pkg的postflight脚本中,它将Apple事件发送到应用程序(osascript -e'告诉应用程序PATH到start_action的路径,以使应用程序知道它可以继续进行。
实际上,安装程序将虚拟ppd和cups过滤器一起安装到/ Library / Printers / PPDs / Contents / Resources /中,我的应用程序查询该打印机驱动程序的cups(分别为ppd),以确保/ usr / libexec / cups / filer / my_filter已安装。
现在让我们在查看我的应用程序时看看苹果对解决方案有何看法;)