我正在创建一个 Swift finder 同步扩展,它需要将文件数据读入数组以发送到 api 但它不会将其读入数组,因为
InputStream.hasBytesAvailable()
返回 false 所以不会进入 for 循环。我的应用程序需要应用程序沙箱,它获得了“用户选择的文件”和“下载”文件夹的读/写访问权限。我还在我的系统设置中为应用程序提供了完整的磁盘访问权限。
这是我的代码块,专门在 While 循环开始时导致错误。
let filePath = "/Users/<user>/Desktop/film.mp4"
guard let inputStream = InputStream(fileAtPath: filePath) else {
print("Failed to create input stream")
return
}
// This dictates how many bytes are in each packet it must be a multiple of 327,680
let packetSize = 3276800
inputStream.open()
var buffer = [UInt8](repeating: 0, count: packetSize)
// Write data to bytesArray
while inputStream.hasBytesAvailable{
let bytesRead = inputStream.read(&buffer, maxLength: buffer.count)
if bytesRead < 0 {
print("Failed to read from input stream: \(inputStream.streamError?.localizedDescription ?? "unknown error")")
break
} else if bytesRead == 0 {
print("End of input stream reached")
break
} else {
// Process the bytes that were read
let data = Data(bytes: buffer, count: bytesRead)
bytesArray.append(data)
}
}
inputStream.close()
当我按下按钮时,这些错误会打印在控制台中:
我曾尝试删除应用程序沙箱,它可以停止访问某些文件,但是当我的应用程序构建时它无法正常运行并且我的选项没有出现在上下文菜单中并且没有设置日志打印到控制台。
它适用于我的第一个应用程序,它没有应用程序沙箱,也没有分成两个目标。
非常感谢任何帮助
***** 更新 *****
我想我可能需要将
com.apple.security.temporary-exception.files.home-relative-path.read-only
添加到我的 .extensions 文件中,让我的应用程序能够访问我的主文件夹。它是一个 finder 同步扩展,因此需要被沙盒化,这看起来像是绕过它的方法。
有谁知道这是否正确?
谢谢