Swift Finder Sync扩展读取桌面文件时InputStream.hasBytesAvailable返回false的解决方法
Finder Sync扩展沙盒下文件读取问题及权限疑问
我正在开发Swift Finder Sync扩展,需要将文件数据读取到数组中以发送至API,但InputStream.hasBytesAvailable()始终返回false,无法进入读取循环。应用必须开启App Sandbox,目前已配置“用户选择的文件”和“下载文件夹”的读写权限,同时在系统设置中给了应用全盘访问权限。
问题代码
问题出在While循环的起始处,代码如下:
let filePath = "/Users/<user>/Desktop/film.mp4" guard let inputStream = InputStream(fileAtPath: filePath) else { print("Failed to create input stream") return } // 每个数据包的字节数,必须是327680的倍数 let packetSize = 3276800 inputStream.open() var buffer = [UInt8](repeating: 0, count: packetSize) // 将数据写入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 { // 处理读取到的字节 let data = Data(bytes: buffer, count: bytesRead) bytesArray.append(data) } } inputStream.close()
控制台错误输出
点击按钮时控制台打印以下错误:
- open flag(s) 0x01000000 are reserved for VFS use and do not affect behaviour when passed to sqlite3_open_v2
- cannot open file at line 46922 of [554764a6e7]
- os_unix.c:46922: (0) open(/private/var/db/DetachedSignatures) - Undefined error: 0
已尝试的操作
- 关闭App Sandbox后,应用构建完成无法正常运行,右键菜单不显示我的选项,也没有日志输出到控制台
- 该功能在未开启沙盒且未拆分多目标的初代应用中可正常工作
更新:权限配置尝试
我认为可能需要在.entitlements文件中添加com.apple.security.temporary-exception.files.home-relative-path.read-only权限,让应用能够访问主目录。由于Finder Sync扩展必须开启沙盒,这似乎是可行的解决途径。

请问这种方法是否正确?
内容的提问来源于stack exchange,提问作者JamieS56
相关产品推荐
相关产品推荐

