You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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扩展必须开启沙盒,这似乎是可行的解决途径。

Xcode中.entitlements文件截图

请问这种方法是否正确?

内容的提问来源于stack exchange,提问作者JamieS56

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:34